domingo, 30 de mayo de 2010

GRAFICOS EN VISUAL BASIC

GRÁFICOS EN VISUAL BASIC 6.0

Visual Basic 6.0, además de hacer fácil la construcción de interfaces gráficas de usuario, tiene también grandes posibilidades gráficas en lo que se refiere a dibujo de líneas y formas geométricas, así como en lo referente a la introducción de gráficos y figuras realizados con otras aplicaciones. En este capítulo se presentarán brevemente las posibilidades gráficas más importantes de Visual basic 6.0

6.1 TRATAMIENTO DEL COLOR
Antes de ver cómo se dibuja en Visual Basic 6.0 se verá cómo se definen los colores. Al igual que en tantas aplicaciones informáticas, los colores de Visual Basic se definen por medio de las componentes fundamentales RGB (Red, Green and Blue). La intensidad de cada color fundamental se define con un byte, es decir con un número entero entre 0 y 255. Se utilizan pues tres bytes para definir los tres colores. Visual Basic 6.0 utiliza un entero long (32 bits, 4 bytes) para guardar un color, lo cual quiere decir que existe un byte adicional donde se podrá guardar alguna otra información

6.1.1 Representación hexadecimal de los colores
Para los números enteros entre 0 y 255 se utilizan dos dígitos hexadecimales. Con esta notación el cero es el
“00” y el 255 el “FF”. El número que indica el color va precedido por el carácter “&” y la letra “H”. Así, el color verde se define en la forma: &H00FF00. Con esta notación es posible prescindir de los ceros situados a la izquierda. Por ejemplo, el color rojo se puede escribir como &H0000FF y como &HFF.

Visual Basic 6.0 dispone también de nombres para los colores fundamentales y los que son combinación de los colores fundamentales, según puede verse en la Tabla 6.1.

6.1.2 Acceso a los colores del sistema
El cuarto byte (en el entero long que contiene el color) puede utilizarse para hacer referencia a los colores del sistema. Los colores del sistema son aquellos colores con los que Windows 95/98/NT representa las ventanas y sus bordes, las barras de desplazamiento, etc. Dichos colores se eligen en el panel de control Display/Appearance, y Visual Basic 6.0 permite acceder a ellos a través de su nombre o de su valor hexadecimal, que empieza por “&H8” y utiliza el cuarto byte. La Tabla 6.2 muestra algunos de estos valores. Para una descripción completa buscar Color Constants en el Help de Visual Basic 6.0.

6.1.3 Función RGB
Esta función devuelve un número que representa un color a partir de tres argumentos enteros entre 0 y 255, que son sus componentes RGB. Como ejemplo de uso:
form1.BackColor = RGB(127, 127, 64)
Si alguno de los argumentos tiene un valor mayor que 255, se toma como 255.

6.1.4 Paleta de colores

Elegir adecuadamente un color a partir de sus componentes
RGB no es una tarea fácil. Por eso Visual Basic 6.0 proporciona una paleta de 64 colores predefinidos, 16 de los cuales pueden ser definidos a medida por el usuario. La

Figura 6.1 muestra la paleta de colores, que aparece con

View/Color Palette.
La Figura 6.2 muestra el cuadro de diálogo que se abre al pulsar el botón Define Colors... en la parte inferior dcha. de la Figura 6.1. Para elegir un color se pueden introducir directamente los valores RGB, pero también se puede clicar en el mapa de colores de la parte superior izda. y luego mover el cursor de la parte superior dcha. Finalmente, clicando en el botón Add Color. El color seleccionado se añade en la parte inferior de la paleta de colores (Figura
6.1).

Por supuesto es necesario tener en cuenta el número de colores soportado por la tarjeta gráfica del PC en el que se esté trabajando. Lo más frecuente es que los PCs estén configurados para soportar 256 colores (8 bits por pixel),
65.536 colores (16 bits por pixel) o 16.777.216 colores (24 bits por pixel). Si la tarjeta gráfica soporta 65.536 colores se elige el color más cercano al que el usuario ha querido

Image and video hosting by TinyPic
Figura 6.1. Paleta de colores.

Image and video hosting by TinyPic

Figura 6.2. Creación de colores a medida.
Capítulo 6: Gráficos en Visual Basic 6.0 página 71 representar, con la función RGB por ejemplo. Si la tarjeta gráfica soporta sólo 256 colores se utiliza el dithering, que consiste en mezclar pixels de distintos colores con objeto de obtener un efecto lo más parecido posible al color solicitado.
Una vez añadidos los colores a la paleta, al clicar en el pequeño triángulo que aparece en cualquier propiedad de color en la ventana Properties aparecerán una ventana donde es posible elegir entre los colores de la paleta y los denominados colores del sistema (Figura
6.3).

Image and video hosting by TinyPic


6.2 FORMATOS GRÁFICOS
En un formulario de Visual Basic 6.0 -y en los controles Image y PictureBox- es posible insertar gráficos, tanto de tipo bitmap (los producidos por aplicaciones como Paint, Paintbrush, Paint Shop
Pro, etc.), como de tipo vectorial (los producidos por las herramientas gráficas de Word y
PowerPoint).
Visual Basic 6.0 admite varios formatos de ficheros gráficos: los ficheros *.bmp y *.ico para los gráficos de tipo bitmap, los ficheros *.wmf (Windows Meta File) y *.emf (Enhanced Meta File) para los gráficos de tipo vectorial y *.jpg (JPEG o Joint Photographic Experts Group) y *.gif
(Graphic Interchange Format). Los ficheros *.ico son ficheros bitmap de pequeño tamaño (32 por 32) destinados a contener iconos. Los ficheros JPEG y GIF son formatos gráficos comprimidos que soportan respectivamente color de 24 bit (~16 millones de colores) y 8 bit (256 colores). Ambos formatos son los utilizados en Internet para mostrar imágenes.
Si se desea insertar ficheros gráficos que estén en otros formatos, habrá que convertirlos previamente a uno de estos formatos usando el programa adecuado.

6.3 CONTROLES GRÁFICOS
Visual Basic 6.0 dispone de varios controles con los que insertar gráficos en un formulario.
Algunos tienen más posibilidades que otros y es necesario conocerlos bien. A continuación se verán los controles Line, Shape, Image y PictureBox.

6.3.1 Control Line
Es el control gráfico más elemental, ya que carece de propiedades como Text, Caption y Value.
Además no reconoce ningún evento, por lo que su misión es casi exclusivamente decorativa.
El control Line permite dibujar líneas en un formulario o en un control PictureBox. Las propiedades más importantes son las coordenadas de los puntos extremos (X1, Y1, X2 e Y2), la anchura en pixels (BorderWidth), el estilo de la línea (BorderStyle) -continua, a trazos, etc.- que sólo está activo cuando la anchura es 1 pixel, el color (BorderColor) y el nombre (Name). La línea puede estar visible o no (Visible), y existe la propiedad Index, que permite crear arrays de líneas.
Figura 6.3. Colores de sistema
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 72

6.3.2 Control Shape
Este control es en muchos aspectos similar al control Line: tampoco tiene las propiedades text, Caption y Value, ni reconoce eventos. Se diferencia en que admite formas geométricas más complejas, que vienen definidas por la propiedad Shape, que admite los valores siguientes: cuadrado (Square), rectángulo (Rectangle), círculo (Circle), elipse (Oval), cuadrado redondeado (Rounded Square) y rectángulo redondeado (Rounded Rectangle).
Además de las propiedades correspondientes al tamaño y posición, las propiedades más interesantes del control Shape son las siguientes: BackColor, BackStyle, BorderColor, BorderStyle, BorderWidth, FillColor, FillStyle, DrawMode. Un control Shape puede estar visible o no (Visible),
y existe la propiedad Index, que permite crear arrays de Shapes.


6.3.3 Ejemplo 6.1: Uso de los controles Line y Shape

La Figura 6.4 muestra un formulario en el que se han dibujado tres controles Line y dos controles Shape.

Las tres líneas se han dibujado con la propiedad
BorderWidth=1, pues si no la propiedad
BorderStyle no surte efecto. La propiedad
BorderStyle es 2-Dash para la segunda línea y 3-Dot para la tercera.
Después se han dibujado dos controles Shape llamados shpRect y shpRRec, cuyas propiedades Shape están respectivamente a 0-Rectangle y a 4-Rounded Rectangle. La propiedad BackColor está en amarillo para shpRect y en blanco para shpRRect.

En ambos casos BackStyle está en 1-Opaque, pues si no el color de fondo no surte efecto. La propiedad FillColor (que determina el color de las líneas de rayado) está en rojo para shpRect y en negro para shpRRect. Finalmente, la propiedad FillStyle que determina el tipo de rayado está en 5-Downward Diagonal para shpRect y en 6-Cross para shpRRect. Como la propiedad DrawMode está en 13-Copy Pen para ambos controles, shpRRect se superpone sobre shpRect porque ha sido creada sobre él con posterioridad.

Image and video hosting by TinyPic
6.3.4 Control Image
El control Image es un contenedor de gráficos bitmap, iconos, metafile, enhanced metafile, GIF y JPEG. Este control admite ya una amplia colección de eventos, por lo que es ya un control con un papel mucho más activo que los anteriores.

Las propiedades más propias e importantes de este control son las propiedades Picture y Stretch. La propiedad Picture sirve para relacionar este control con el fichero que contiene el gráfico que se desea representar, a través del cuadro de diálogo Load Picture que permite elegir el fichero a insertar. El fichero deberá ser de uno de los tipos admitidos. Según el fichero elegido, la propiedad Picture tendrá uno de los tres valores siguientes: icon (ficheros cur, ico), bitmap (bmp, gif, jpg) o metafile (wmf, emf).

La propiedad Stretch indica cómo se comporta el control Image al introducir en él el contenido del fichero gráfico. Por defecto, cuando se crea un control Image arrastrando en el formulario con el ratón esta propiedad tiene el valor False. Estando la propiedad Stretch en False el tamaño del control se ajusta al tamaño del bitmap o del metafile que se introduce en dicho control.

Por el contrario, si dicha propiedad está en True el gráfico que proviene del fichero se adapta al tamaño de control.

Se puede tratar de modificar el tamaño del gráfico en modo de diseño (con el ratón o cambiando las propiedades de tamaño del control). Si el gráfico es un bitmap y la propiedad Stretch está en False, el tamaño de la imagen no cambia aunque cambie el del control (quedando en la esquina superior izquierda si el control se hace más grande, o quedando parcialmente oculta si alguna de las dimensiones del control se hace más pequeña que la del bitmap. Si la propieda Stretch está en True, el bitmap se adapta al tamaño del control y su tamaño se cambia con el de éste. Los gráficos metafile siempre se pueden cambiar de tamaño en modo de diseño, tanto si
Stretch está en True como si está en False.

Existen otras formas de cargar un gráfico en un control Image, además de utilizar la propiedad Picture en modo de diseño, como se ha visto anteriormente. Una segunda forma, utilizable también en modo de diseño, es hacer Copy y Paste a partir de un gráfico contenido en otra aplicación como Paint Shop Pro o Excel.

En modo de ejecución se puede copiar el contenido de un control Image en otro control del mismo tipo por medio de una sentencia de asignación en la forma: imgCuadro.picture = imgCaja.picture y se puede también cargar una imagen de un fichero utilizando el procedimiento LoadPicture, por ejemplo en la forma siguiente (habrá que estar seguro de que existe el fichero):
imgCuadro.picture = LoadPicture("G:\graficos\pc.wmf")
Aunque el control Image admite algunos eventos (Click, DblClick, DragDrop, DragOver,

MouseUp, MouseDown, MouseMove), sus posibilidades son también limitadas. Por la forma en que se dibuja, el control Image no puede estar sobre otro control, como por ejemplo un botón (ver los
layers, más adelante en este capítulo). Tampoco puede contener otros controles en su interior: sólo puede contener gráficos. Finalmente, este control no puede obtener el focus y por tanto no puede responder a acciones desde el teclado. El control PictureBox, que se verá a continuación, resuelve estas limitaciones aunque presenta la desventaja de ser más lento en dibujar que el control Image.

6.3.5 Control PictureBox

Este es el control gráfico ( ) más potente y general de Visual Basic
6.0. Se trata de una especie de formulario reducido, pues puede contener imágenes y otros tipos de controles tales como botones, shapes, labels, cajas de texto, etc. Con respecto a los bitmaps, el control PictureBox se comporta de modo diferente que el control Image. El control PictureBox no tiene propiedad Stretch, con lo cual al cargar un icono o un bitmap siempre aparecen con su tamaño natural (tal y como se puede observar en la Figura 6.5). Sin embargo el control PictureBox tiene la propiedad AutoSize, que por defecto está en False. Cuando se carga un bitmap con AutoSize en False el gráfico aparece en la esquina superior izquierda del control; sin embargo, si AutoSize está en True el control PictureBox adapta su tamaño al del bitmap que es cargado.

Image and video hosting by TinyPic

La Figura 6.5 muestra los resultados de introducir
un icono en un control Image (Stretch: False y True) y en un control PictureBox (AutoSize: False y True).

Los gráficos metafile se comportan de un modo diferente, según puede verse en la Figura 6.6.
Image and video hosting by TinyPic

En el control Image se cargan con su verdadero tamaño si la propiedad Stretch es False, mientras que se adaptan al tamaño del control si dicha propiedad es True. Con el control PictureBox se adaptan al tamaño del control si AutoSize es False, mientras que se cargan con su propio tamaño si es AutoSize es True.
En el control PictureBox (al igual que en los formularios) son importantes las cuatro propiedades relacionadas con el color: BackColor, ForeColor, FillColor y FillStyle. La propiedad
BackColor controla el color de fondo del control. La propiedad ForeColor controla el color del texto que se escribe en el control (con el método Print, por ejemplo, como luego se verá). Las propiedades FillColor y FillStyle no afectan directamente al control sino a los elementos gráficos que se dibujen sobre él con métodos tales como Line y Circle, que se verán a continuación.
FillStyle determina el tipo de relleno o pattern (líneas horizontales, verticales, inclinadas, cruzadas,...), mientras que FillColor determina el color de estas líneas del relleno.

6.4 MÉTODOS GRÁFICOS
Sólo los formularios y los controles PictureBox pueden albergar otros tipos de controles. Además es posible escribir texto y dibujar directamente sobre ellos por medio de ciertos métodos3 de Visual
Basic. Por defecto estos métodos actúan sobre el formulario activo. Si se desea que actúen sobre un control PictureBox hay que precederlos por el nombre del control y el operador punto.

6.4.1 Método Print
En tiempo de ejecución se puede escribir texto en un formulario o en un control PictureBox por medio del método Print. La forma general de este método es la siguiente:

objeto.Print {spc(n)|tab(n)} expresion poschar donde spc(n) es opcional y sirve para insertar n caracteres en la salida; tab(n) es también opcional y sirve para posicionar la salida en una posición absoluta determinada por n con un tabulador. Si tab se utiliza sin argumentos lleva al comienzo de la siguiente región de salida4; expresion representa cualquier expresión cuyo resultado sea un número o una cadena de caracteres. poschar indica dónde se imprimirá el siguiente carácter. Si es un punto y coma (;) la impresión se hace a continuación del último carácter impreso; si es un tab(n) o un tab tiene el efecto antes descrito; si se omite, la impresión comienza en una nueva línea.
El color, la fuente y el tamaño del texto se toman de las correspondientes propiedades del formulario o control PictureBox.

6.4.2 Dibujo de puntos: método PSet
El método PSet sirve para dibujar puntos en un formulario o en un control PictureBox. Su forma general es la siguiente:
object.PSet Step (x, y), color donde:
object es opcional y representa el objeto (form o PictureBox) en el que se va a dibujar el punto. Si se omite, el punto se dibuja en el formulario activo (el que tiene el focus).
Step es opcional. Si se introduce las coordenadas que le siguen son relativas respecto a las propiedades CurrentX y CurrentY de la PictureBox. Al dibujar un punto, estas propiedades se actualizan a las coordenadas de dicho punto.
(x, y) son las coordenadas absolutas o relativas del punto a dibujar (expresiones, variables o constantes single). Tanto las coordenadas como la coma, como los paréntesis son obligatorios. Las unidades dependen de la propiedad ScaleMode del objeto en que se dibuja.
Color es opcional y es un nombre de color (vbRed, vbBlue, etc.) o un long conteniendo el código de color hexadecimal (puede ser el valor de retorno de la función RGB). Si se omite, se utiliza la propiedad ForeColor del objeto en el que se dibuja.
El tamaño del punto viene determinado por la propiedad DrawWidth del objeto en que se dibuja. Si el tamaño es mayor que uno, el punto se dibuja centrado en las coordenadas suministradas a PSet. Si se desea eliminar un punto previamente dibujado es necesario volver a pintar ese punto con el color de fondo del objeto (BackColor).

6.4.3 Dibujo de líneas y rectángulos: método Line
El método Line dibuja líneas y -en ciertas condiciones- cajas rectangulares de lados horizontales y verticales. Su forma general es la siguiente: object.Line Step (x1, y1) - Step (x2, y2), color, BF 4 En Visual Basic se comienza una región de salida cada 14 caracteres, si se utiliza un tipo de letra de anchura constante. Con otros tipos de letra esta medida es sólo aproximada.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 76 donde object, step y color tienen el mismo significado que en PSet, y
(x1, y1) son opcionales y son las coordenadas del punto inicial de la línea. Si se omiten la línea comienza en las coordenadas definidas por CurrentX y CurrentY. (x2, y2) son obligados y contienen las coordenadas del punto final de la línea. B es un carácter opcional. Si se incluye se dibuja un rectángulo (Box) con los puntos dados como extremos de una de sus diagonales.
F es también un carácter opcional, que sólo se puede incluir si se ha incluido B. Si se incluye, la caja rectangular se rellena (Fill) con el mismo color del contorno. Si se omite la caja se rellena con las propiedades FillColor y FillStyle del objeto en el que se dibuja.
Después de ejecutarse este método las propiedades CurrentX y
CurrentY tienen el valor del punto final de la línea. Es necesario introducir el carácter (-), aunque se omita el primero de los puntos que definen la línea.
Las propiedades DrawWidth y
DrawStyle determinan cómo se dibujan las líneas rectas o curvas en
Visual Basic 6.0. Más en concreto, la propiedad DrawWidth determina el grosor en pixels, mientras que DrawStyle determina el tipo de línea. La Tabla 6.3 considera los posibles valores de la propiedad DrawStyle.
Los tipos de raya discontinua no permiten que el grosor sea mayor que 1 pixel. Si el grosor es superior, la línea se dibuja de modo continuo.

Ejemplo:
Line (0 ,0 )-(100 , 0) ' Línea del punto (0,0) al (100,0)
Line -(100 , 100) ' Línea del punto (100,0) al (100,100)
Line -Step (20 , 80) ' Línea del punto (100,100) al (120,180)
Line (100,100)-(200 , 200), vbRed, BF ' Rectángulo rojo del punto
' (100,100) al (200,200)
6.4.4 Dibujo de circunferencias, arcos y elipses: método Circle
El método Circle permite dibujar circunferencias, elipses y arcos. Su forma general es la siguiente:
object.Circle Step (x, y), radius, color, start, end, aspect donde object, step y color tienen el mismo significado que en PSet y Line, y:
(x, y) son obligatorias, y contienen las coordenadas del centro de la circunferencia.
Radius es obligatoria y define el radio de la circunferencia.
Start, end son opcionales, y permiten definir arcos por medio del ángulo inicial (start) y final
(end). Los ángulos se miden siempre en radianes y en sentido contrario a las agujas del reloj. Sus valores deben estar entre -2y 2. En principio se dibuja solamente el arco, pero si uno o ambos valores son negativos se tratan como positivos, pero se

Valor Nombre Estilo de línea
0 vbSolid continua (valor por defecto)
1 vbDash trazos (continua si w>1)
2 vbDot puntos (continua si w>1)
3 vbDashDot raya-pto (continua si w>1)
4 vbDashDotDot raya-pto-pto (continua si w>1)
5 vbInvisible transparente (continua si w>1)
6 vbInsideSolid continua interna
Tabla 6.3. Valores de DrawStyle.

Aspect es también opcional y se utiliza para dibujar elipses. Es la relación entre el diámetro vertical y el horizontal. El valor por defecto es 1.0, lo que corresponde a una circunferencia. Cuando aspect es distinto de 1.0, el parámetro radius define el mayor de los dos diámetros.
Sólo las figuras cerradas (no los arcos sin líneas que unan los extremos con el centro) pueden ser rellenadas con el color determinado por las propiedades FillColor y FillStyle del objeto en que se dibuja). El grosor y estilo de las líneas se determina con las propiedades DrawWidth y
DrawStyle. Después de ejecutarse este método, las propiedades CurrentX y CurrentY tienen el valor del centro de la circunferencia. Si se omite algún argumento (excepto los que van al final), deben respetarse las comas de separación entre argumentos.

martes, 13 de abril de 2010

visual basic

EVENTOS, PROPIEDADES Y CONTROLES
En este capítulo se pretende recoger de una manera más sistemática y general los eventos y controles más habituales de Visual Basic 6.0. Hay que señalar que en ningún momento se pretende abandonar el carácter introductorio de este manual, y que Visual Basic 6.0 tiene muchas más posibilidades de las que aquí se muestran. Por ejemplo, muchos de los controles y eventos de Visual
Basic 6.0 están relacionados con el acceso a bases de datos. Estos aspectos no se citarán en estos apuntes. Para una información más detallada se puede acudir a un buen libro de referencia o al Help del programa.

La programación en Visual Basic 6.0 (al menos para ejemplos sencillos) suele proceder del siguiente modo:
1. Se definen interactivamente sobre el formulario los controles que van a constituir la aplicación.
2. Se define para cada control el código con el que se va a responder a cada uno de los eventos.

Visual Basic 6.0 ha preparado ya el inicio y el final de la función con la que se va a responder al evento. El nombre del evento forma parte del nombre de la función, junto al nombre del control. En el ejemplo del la Figura 4.1 está preparada la función para escribir el código que se ejecutará al producirse el evento Click sobre el
Control cmbSalir.

En el resto de este capítulo se verán con un cierto detalle los eventos, controles y propiedades
más habituales en Visual Basic 6.0.

EVENTOS
A continuación se presentan brevemente los eventos más normales que reconoce Visual Basic 6.0.
Es importante tener una visión general de los eventos que existen en Windows 95/98/NT porque cada control de los que se verán más adelante tiene su propio conjunto de eventos que reconoce, y otros que no reconoce. Cualquier usuario de las aplicaciones escritas para Windows 95/98/NT hace uso continuo e intuitivo de los eventos, pero es posible que nunca se haya detenido a pensar en ello.

Para saber qué eventos puede recibir un control determinado basta seleccionarlo y pulsar
. 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 aplicación, o más 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 función correspondiente.

Al ocultar, cerrar o eliminar un formulario se producen otra serie de eventos: Deactivate,
QueryUnload, Unload y Terminate que se verán en un próximo ejemplo.
Para inicializar las variables definidas a nivel de módulo se suele utilizar el evento Initialize, que tiene lugar antes que el Load. El evento Load se activa al cargar un formulario. Con el formulario principal esto sucede al arrancar la ejecución de un programa; con el resto de los formularios al mandarlos cargar desde cualquier procedimiento o al hacer referencia a alguna propiedad o control de un formulario que no esté cargado. Al descargar un formulario se produce el evento Unload. Si se detiene el programa desde el botón Stop de Visual Basic 6.0 (o del menú correspondiente) o con un End, no se pasa por el evento Unload. Para pasar por el evento Unload es necesario cerrar la ventana con el botón de cerrar o llamarlo explícitamente.

El evento QueryUnload se produce antes del evento Unload y permite por ejemplo enviar un mensaje de
Confirmación. El evento Load de un formulario se suele utilizar para ejecutar una función que dé valor a sus Propiedades y a las de los controles que dependen de dicho formulario. No se puede utilizar para dibujar o imprimir sobre el formulario, pues en el momento en que se produce este evento el formulario todavía no está disponible para dichas operaciones. Por ejemplo, si en el formulario debe aparecer la salida del método Print o de los métodos gráficos Pset, Line y Circle (que se estudian en el Capítulo 6 de este manual) puede utilizarse el evento Paint u otro posterior (por ejemplo, el evento GotFocus del primer control) pero no puede utilizarse el evento Load.

Se puede ocultar un formulario sin descargarlo con el método Hide o haciendo la propiedad
Visible = False. Esto hace que el formulario desaparezca de la ventana, aunque sus variables y propiedades sigan estando accesibles y conservando sus valores. Para hacer visible un formulario oculto pero ya cargado se utiliza el método Show, que equivale a hacer la propiedad Visible = True, y que genera los eventos Activate y Paint. Si el formulario no había sido cargado previamente, el método Show genera los cuatro eventos mencionados.

Cuando un formulario pasa a ser la ventana activa se produce el evento Activate y al dejar de serlo el evento Deactivate. En el caso de que el formulario que va a ser activo no estuviera cargado ya, primero sucederían los eventos Initialize, Load y luego los eventos Activate y Paint.

El primero de ellos contendrá dos botones (cmdVerSec y cmdSalir) y el segundo tres (cmdHide, cmdUnload y cmdTerminate). El formulario principal será el primero que aparece, y sólo se verá el segundo si se clica en el botón
Cargar Formulario. Cuando así se haga, a medida que los eventos antes mencionados se vayan sucediendo, irán apareciendo en pantalla unas cajas de mensajes que tendrán como texto el nombre del evento que se acaba de producir. Según con cual de los tres botones se haga desaparecer el segundo formulario, al volverlo a ver se producirán unos eventos u otros, según se puede ver por los mensajes que van apareciendo con cada evento.

' código del form. principal
Private Sub cmdCargar_Click()
frmSecundario.Show
End Sub
' código del form. secundario
Private Sub cmdHide_Click()
Hide
End Sub
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 50
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
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 también cuando vuelven a ser visibles después de haber estado tapados por otros, tras haber sido movidos o tras haber sido modificados de tamaño.

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 más vivo o teniendo parpadeando el cursor en él. Este foco puede ser trasladado de un objeto a otro por código o por interacciones del usuario, como por ejemplo clicando con el ratón 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 método 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 Mayúsculas+Tab. La propiedad TabIndex se puede determinar en tiempo de diseño 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 automáticamente los valores de los demás controles (si tiene que desplazarlos hacia arriba o hacia abajo, lo hace de modo que siempre tengan números consecutivos). Para que un formulario reciba el foco es necesario que no haya en él ningún control que sea capaz de recibirlo.
Un grupo de botones de opción 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 cuál es el código 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 determinar si esa tecla se ha pulsado estando pulsadas a la vez cualquier combinación de las teclas
Shift, Alt y Ctrl. En un apartado próximo se explica cómo se identifican las teclas pulsadas a partir del argumento Shift.

Eventos relacionados con el ratón
Click y DblClick
El evento Click se activa cuando el usuario pulsa y suelta rápidamente uno de los botones del ratón.
También puede activarse desde código (sin tocar el ratón) variando la propiedad Value de alguno de los controles. En el caso de un formulario este evento se activa cuando el usuario clica sobre una zona del formulario en la que no haya ningún 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:

•Clicar sobre un control con el botón derecho o izquierdo del ratón. En el caso de un botón de comando, de un botón de selección o de un botón de opción, el evento sucede solamente al clicar con el botón 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 botón de comando, en un botón de selección o en un botón de opción.

•Pulsar la tecla Return cuando en un formulario hay un botón que tiene su propiedad
Default= True.

•Pulsar la tecla Esc cuando en un formulario hay un botón que tiene su propiedad Cancel =
True.

•Pulsar una combinación de teclas aceleradoras (Alt + otra tecla, como por ejemplo cuando de despliega el menú File de Word con Alt+F) definidas para activar un determinado control de un formulario.
También se puede activar el evento Click desde código realizando una de las siguientes operaciones:

•Hacer que la propiedad Value de un botón de comando valga True.

•Hacer que la propiedad Value de un botón de opción valga True

•Modificar la propiedad Value de un botón de selección.
El evento DblClick sucede al clicar dos veces seguidas sobre un control o formulario con el botón izquierdo del ratón.
MouseDown, MouseUp y MouseMove

El evento MouseDown sucede cuando el usuario pulsa cualquiera de los botones del ratón, mientras que el evento MouseUp sucede al soltar un botón que había sido pulsado. El evento MouseMove sucede al mover el ratón sobre un control o formulario.
Los eventos MouseUp y MouseDown tienen algunos argumentos que merecen ser comentados. El argumento Button indica cuál de los botones del ratón ha sido pulsado o soltado, y el argumento Shift indica si además alguna de las teclas alt, shift o ctrl está también pulsada.

MouseUp y MouseDown.
Con estos valores se aplica la aritmética booleana, lo cual quiere decir que si se pulsan simultáneamente los botones izquierdo y derecho del ratón el argumento Button valdrá 3 (1+2) y si se pulsan las tres teclas shift, ctrl y alt simultáneamente el argumento Shift valdrá 7 (1+2+4). Con esta forma de combinar los valores se resuelven todas las indeterminaciones posibles.

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 ratón dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es válido para soltar o no. El evento DragDrop sucede al concluir una operación de arrastrar y soltar. El evento DragOver requiere de los argumentos que se muestran a continuación:

Private Sub Text1_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer).

Los argumentos de este evento son Source que contiene el objeto que está siendo arrastrado,
X e Y que indican la posición del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se está arrastrando y State (que es propio del DragOver, pero no aparece en el
DragDrop) que vale 0, 1 ó 2 según se esté entrando, saliendo o permaneciendo dentro del mismo objeto, respectivamente. Es importante señalar que el evento DragOver pertenece al objeto sobre el que se arrastra, no al objeto que es arrastrado.
En el Help se puede encontrar información sobre la propiedad DragMode, que puede tomar dos valores (vbManual y vbAutomatic). Esta constante determina cómo comienza una oparación de arrastre de un objeto. En modo manual se debe comenzar llamando al método Drag para el objeto a arrastrar. En modo automático basta clicar sobre el objeto a arrastrar, pero puede que en esta caso dicho objeto no responda del modo habitual a otros eventos.
4.2 ALGUNAS PROPIEDADES COMUNES A VARIOS CONTROLES
Hay algunas propiedades que son comunes a muchos controles. A continuación se hace una lista con las utilizadas más habitualmente:
•Appearance: Establece si un objeto tiene un aspecto plano (valor 0) o tridimensional (valor1).

•BackColor: Establece el color de fondo de un objeto.

•Caption: Establece el texto que aparece dentro o junto al objeto. Tiene el papel de un título.

•Enabled: Establece si un objeto es accesible y modificable o no.

•Font: Establece las características del tipo de letra del objeto.

•ForeColor: Establece el color del texto y/o gráficos de un objeto.

•Height y Width: Establecen la altura y achura de un objeto.

•Left y Top: Establecen la distancia horizontal y vertical entre el origen del control y el origen del objeto que lo contiene, que puede ser un formulario, un marco (frame), etc.
•MousePointer: Establece la forma que adoptará el puntero del ratón al posicionarse sobre el objeto. Esta forma puede elegirse dentro de una lista en las que aparecen las habituales del puntero del ratón o creando iconos propios. Algunas constantes de significado inmediato que definen la forma del cursor son las siguientes:
vbDefault, vbArrow,
vbCrosshair, vbIbeam, vbSizePointer, vbUpArrow, vbHourglass, etc. Para más información puede consultarse el Help de MousePointer.

•Name: Nombre del objeto. Todos los objetos incluidos en un formulario deben tener un nombre con el que poder referirse a él a la hora de programar la forma en que debe actuar.
Existen unas reglas para definir los nombre de los controles, que ya se vieron en el
Capítulo 1.
•Visible: Establece si el objeto es visible o invisible.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 54
Figura 4.3. Algunos de los controles más habituales de Visual Basic.

CONTROLES MÁS USUALES
En la Figura 4.3 se muestran algunos de los controles más habituales en Visual Basic 6.0. Estos controles se explican a continuación con más detalle.
Botón de comando (Command Button)
Las propiedades más importantes del botón de comando son su Caption, que es lo que aparece escrito en él, las referentes a su posición (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 carácter (&) antes de una de sus letras, dicha letra aparece subrayyada en el botón (como la “x” en el botón Exit de la figura anexa). Esto quiere decir que, como es habitual en Windows, dicho botón puede activarse con el teclado por medio de la combinación Alt+letra subrayada.

Esta característica es común 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 opción (Option Button)
Además de las mencionadas para el caso anterior estos botones tienen la propiedad Value, que en un determinado momento sólo 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 después cuantos botones de opción se desee. En un mismo formulario se pueden colocar cuantos grupos de botones de opción se quiera, cada uno de ellos agrupado dentro de su propio marco. Es muy importante colocar primero el frame y después los botones de opción. Con esto se consigue que los botones de opción estén agrupados, de modo que sólo uno de ellos pueda estar activado. Si no se coloca ningún frame todos los botones de opción 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.

Sólo un grupo de botones de opción puede recibir el focus, no cada botón por separado.
Cuando el grupo tiene el focus, con las flechas del teclado (y ) se puede activar una u otra opción sin necesidad de usar el ratón. También se puede utilizar Alt+carácter introduciendo antes de dicho carácter un (&) en el Caption del botón de opción.

Botones de selección (Check Box)
La única diferencia entre estos botones y los anteriores es que en los botones de selección puede haber más de uno con la propiedad Value a True. Estos botones no forman grupo aunque estén dentro de un frame, y reciben el focus individualmente. Se puede también utilizar el carácter (&) 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 programación.

Barras de desplazamiento (Scroll Bars)
En este tipo de control las propiedades más 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 clicar en la barra o en el botón 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 común para las barras de desplazamiento vertical y horizontal.
Además de las Scroll Bars horizontal y vertical, Visual Basic 6.0 dispone también del control Slider, utilizado en los paneles de control de Windows, que tiene una función similar.

Etiquetas (Labels)
En las etiquetas o labels la propiedad más importante es Caption, que contiene el texto que aparece sobre este control. Esta propiedad puede ser modificada desde programa, pero no interactivamente clicando sobre ella (a diferencia de las cajas de texto, que se verán a continuación). Puede controlarse su tamaño, posición, color de fondo y una especie de borde 3-D. Habitualmente las labels no suelen recibir eventos ni contener código.

Las Labels tienen las propiedades AutoSize y WordWrap. La primera, cuando está a True, ajusta el tamaño del control al del texto en él contenido. La segunda hace que el texto se distribuya en varias líneas cuando no cabe en una sola.

Cajas de texto (Text Box)
La propiedad más importante de las cajas de texto es Text, que almacena el texto contenido en ellas. También se suelen controlar las que hacen referencia a su tamaño, posición y apariencia. En algún 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 sólo lectura. La propiedad MultiLine, que sólo se aplica a las cajas de texto, determina si en una de ellas se pueden incluir más de una línea o si se ignoran los saltos de línea. La justificación 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 diseño. En modo de ejecución 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 misión de modo automático.

Otras propiedades importantes hacen referencia a la selección de texto dentro de la caja, que sólo están disponibles en tiempo de ejecución. La propiedad SelStart sirve para posicionar el cursor al comienzo del texto que se desea seleccionar (el primer carácter es el cero); SelLength indica el número de caracteres o longitud de la selección; 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 ningún texto seleccionado, el texto de SelText se inserta en la posición del cursor); para entresacar el texto seleccionado basta utilizar esta propiedad en alguna expresión.

Los eventos que se programan son Change, cuando se quiere realizar alguna acción 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 introducción del código ASCII 13 (Intro) para detectar que ya se finalizado con la introducción de datos.

También se utiliza la propiedad MaxLength para determinar el número máximo 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 mayoría de las veces con esta finalidad), puede ser interesante utilizar el método
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 tamaño de la letra, y FontBold, FontItalic,
FontUnderline y FontStrikethrough son propiedades tipo Boolean que indican si el texto va a tener esa característica o no.

Listas (List Box)
Una lista es un control en el que se pueden mostrar varios registros o líneas, teniendo uno o varios de ellos seleccionado(s). Si en la lista hay más registros de los que se pueden mostrar al mismo tiempo, se añade automáticamente una scrollBar.

Para añadir o eliminar registros de la lista en modo de ejecución se utilizan los métodos 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 diseño a través de la ventana de propiedades. List permite también acceder a los elementos de la lista en tiempo de ejecución, para utilizar y/o cambiar su valor. Para ello se pone en índice del elemento entre paréntesis (empezando a contar por cero) a continuación de List, como se muestra a continuación por ejemplo, para cambiar el tercer elemento:

lstName.List(2) = "Tercero"
Para añadir un registro en tiempo de ejecución se utiliza AddItem:
lstName.AddItem Registro_Añadido, posición donde posicion es un argumento opcional que permite especificar la posición en que se debe añadir.
Si se omite el registro se añade al final de la lista. Lo anterior es válido si la propiedad Sorted está a
False; si está a True el nuevo registro se añade en la posición ordenada que le corresponde. Para eliminar un registro,
lstName.RemoveItem Posición_del_registro_en_la_lista
En el caso de que se quiera vaciar completamente el contenido de una lista se puede utilizar el método Clear.
Dos propiedades interesantes de las listas son ListCount y ListIndex. La primera contiene el número total de registros incluidos en la lista. La segunda permite acceder a una posición concreta de la lista para añadir un registro nuevo en esa posición, borrar uno ya existente, seleccionarlo, etc.
Hay que recordar una vez más que los elementos de la lista se empiezan a numerar por cero. El valor de propiedad ListIndex en cada momento coincide con el registro seleccionado y en el caso de no haber ninguno seleccionado esta propiedad vale -1.
Es interesante saber que al seleccionar uno de los registros de la lista se activa el evento Click de dicha lista.
Las listas permiten selecionar más de un elemento poniendo la propiedad MultiSelect a valor 1-Simple o 2-Extended. En el primer caso los elementos se seleccionan o se elimina la selección simplemente clicando sobre ellos. En el segundo caso la forma de hacer selecciones múltiples es la típica de Windows, utilizando las teclas Ctrl y Shift. Con selección múltile la propiedad SelCount indica el número de elementos seleccionados, mientras que la propiedad Selected() es un array de valores boolean que indica si cada uno de los elementos de la lista está seleccionado o no.

Cajas combinadas (ComboBox)
Un ComboBox tiene muchas cosas en común con una lista. Por ejemplo los métodos 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 más habitual y corresponde con el caso en el que sólo se muestra el registro seleccionado, que es editable por el usuario, permaneciendo el resto oculto hasta que el usuario despliega la lista completa clicando sobre el botón-flecha.

2. Style=1 ó Style=vbComboSimple (Simple Combo). En este caso el registro seleccionado también 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 ejecución, 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 ficheros
Trabajando en un entorno Windows 95/98/NT es habitual tener que abrir y cerrar ficheros parar leer datos, guardar un documento, etc. Hay tres controles básicos que resultan de suma utilidad en esta tarea. Son la lista de unidades lógicas o discos (Drive ListBox), la lista de directorios (Dir ListBox) y la lista de ficheros (File ListBox). Estos controles se tratan con más detalle en el Capítulo 7.

Control Timer
Si se desea que una acción suceda con cierta periodicidad se puede utilizar un control Timer.
Este control produce de modo automático un evento cada cierto número de milisegundos y es de fundamental importancia para crear animaciones o aplicaciones con movimiento de objetos. La propiedad más importante de un objeto de este tipo es Interval, que determina, precisamente, el intervalo en milisegundos entre eventos consecutivos. La acción que se desea activar debe programarse en el evento Timer de ese mismo control.
Si en algún momento se desea detener momentáneamente la acción periódica 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 también se consigue inhabilitar el Timer.

CAJAS DE DIÁLOGO ESTÁNDAR (CONTROLES COMMON DIALOG)
El control de cuadro de diálogo estándar de Windows 95/NT (Common Dialog) ofrece una forma sencilla y eficiente de realizar algunas de las tareas más comunes de un programa, tales como la selección de un fichero para lectura/escritura, la impresión de un fichero o la selección de un tipo de letra o un color.
Lo primero que hay que hacer es ubicar el control en el formulario. El control se representará como un icono de tamaño invariable. No es posible especificar la ubicación que tendrá la caja de diálogo cuando se abra en la pantalla, ya que se trata de una propiedad no accesible por el usuario.

Un único cuadro de diálogo estándar puede bastar para realizar todas las funciones que se deseen, es decir, no es necesario insertar un cuadro de diálogo para imprimir un texto y otro para guardarlo, sino que ambos pueden compartir el mismo cuadro de diálogo simplemente invocando a uno u otro tipo en tiempo de ejecución (no es posible indicarlo en tiempo de diseño). Para ello se dispone de los métodos siguientes: ShowColor, ShowFont, ShowHelp, ShowOpen, ShowPrinter y ShowSave. En ocasiones interesará introducir varios controles diferentes por motivos de claridad o para que ciertas propiedades sean distintas.

Las principales propiedades de este control en cada una de sus variantes se explican en los apartados siguientes. La propiedad Flag existe para todos los controles y determina algunas de sus características más importantes

Open/Save Dialog Control
Las propiedades más importantes de este control son:

•DefaultExt: Es la extensión por defecto a utilizar para abrir/salvar archivos. Con Save, si el nombre del fichero se teclea sin extensión, se añade esta extensión por defecto.

•DialogTitle: Devuelve o da valor al título de la caja de diálogo (cadena de caracteres).

•FileName: Nombre completo del archivo a abrir/salvar, incluyendo el path.

•FileTitle: Nombre del archivo a abrir/salvar pero sin la ruta de acceso correspondiente.

•Filter: Contiene los filtros de selección que aparecerán indicados en la parte inferior de la pantalla en la lista de tipos de archivo. Pueden indicarse múltiples tipos de archivo, separándolos mediante un barra vertical (Alt Gr +< 1> ). Su sintaxis es la siguiente:

Objeto.Filter = "(descripción a aparecer en la listbox)|filtro"
Por ejemplo:
"Texto (*.txt)|*.txt|Imágenes(*.bmp;*.ico)|*.bmp;*.ico"
•FilterIndex: Indica el índice (con respecto a la lista de tipos) del filtro por defecto. Se empiezan a numerar por "1".

•InitDir: Contiene el nombre del directorio por defecto. Si no se especifica, se utiliza el directorio actual.

•Flags: Esta propiedad puede tomar muchos valores con objeto de fijar los detalles concretos de este control (por ejemplo, abrir un fichero en modo read only, avisar antes de escribir sobre un fichero ya existente, etc.). Estos valores están definidos por constantes de Visual Basic 6.0 cuyos nombres empiezan con las letras cdl. Para más información en el Help de Common Dialog Control buscar Properties, Flags Properties (Open, Save As
Dialogs). Por ejemplo, el valor definido por la constante cdlOFNOverwritePrompt hace que antes de escribir en un fichero ya existente se pida confirmación al usuario. Para establecer varias opciones a la vez se le asigna a Flags la suma de las constantes correspondientes. Las distintas constantes disponibles se pueden encontrar en el Help buscando Constants/CommonDialog Control.

Print Dialog Control
Las propiedades más importantes de este control son:
•Copies: Determina el número de copias a realizar por la impresora.

•FromPage: Selecciona el número de página a partir del cual comienza el rango de impresión.

•ToPage: Selecciona el número de página hasta la cual llega el rango de impresión.

•PrinterDefault: Cuando es True se imprime en el objeto Visual Basic Printer. Además las opciones actuales de impresión que se cambien serán asignadas como las opciones de impresión por defecto del sistema.

•Flags: Ver con ayuda del Help los posibles valores de esta propiedad.

4.4.3 Font Dialog Control
Las propiedades más importantes de este control son:

•Color: Color de impresión. Para usar esta propiedad hace falta establecer la propiedad Flags al valor de la constante cdlCFEffects.

•FontBold, FontItalic, FontStrikethru, FontUnderline: Devuelve o asigna los valores de los estilos de la fuente actual.

•FontName: Devuelve o asigna el nombre de la fuente en uso.

•FontSize: Devuelve o asigna el tamaño de la fuente en uso.

•Min y Max: Asigna o lee los valores del tamaño de fuente mínimo y máximo respectivamente que aparecerán en la lista de selección de tamaños de la fuente.

•Flags: Indica si los tipos de letra que se van a mostrar son los de la pantalla (cdlCFScreenFonts), los de la impresora (cdlCFPrinterFonts) o ambos (cdlCFBoth). Con la constante cdlCFEffects se puede indicar que se permite cambiar efectos como el color, subrayado y cruzado con una línea. Si Flags vale 0 da un error en tiempo de ejecución inndicando que no hay fonts instaladas.

Color Dialog Control
Las propiedades más importantes de este control son:

•Color: Devuelve o asigna el valor del color actual.

•Flags: Ver con ayuda del Help los posibles valores de esta propiedad. Por ejemplo, con el valor cdlCCFullOpen muestra el cuadro de diálogo completo, mientras que el valor cdlCCPreventFullOpen muestra sólo los colores predefinidos, impidiendo definir otros nuevos. Con el valor cdlCCRGBInit se establece el color inicial para el cuadro de diálogo.

FORMULARIOS MÚLTIPLES
Un programa puede contener más de un formulario. De hecho, habitualmente los programas contienen múltiples formularios. Recuérdese que el formulario es la ventana de máximo 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 cuál debe ser el formulario principal en el menú
Project/Project Properties, en la lengüeta General, en la sección 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 serán cargados en su momento, a lo largo de la ejecución del programa. Para añadir en tiempo de diseño 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 ejecución un formulario distinto del inicial (o del que esté activo en ese momento), se utiliza el método Show (frmName.Show). El método Hide oculta el formulario, pero lo deja cargado; el método Activate lo vuelve a mostrar. El método Unload elimina los elementos gráficos del formulario, pero no las variables y el código. El método 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 también los métodos Hide o Unload para que desaparezca de la pantalla).
Para referirse desde un formulario a los objetos y variables de otro formulario se utiliza el operador punto (frmName.Object.Property).

Apertura de controles en forma modal
En ciertas ocasiones se desea que el programa no realice ninguna acción hasta que el usuario cierre una ventana o formulario en la que se le pregunta algo o en la que tiene que tomar alguna decisión.
En esos casos, al utilizar el método 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

Formularios MDI (Multiple Document Interface)
En algunos casos puede ser interesante establecer una jerarquía 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 también todas las que se han abierto desde ella y dentro de ella. De esta forma una misma aplicación 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 aplicación. En el mundo de las Windows de Microsoft a esto se llama MDI (Multiple Document Interface).

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 aplicación sólo 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 aplicación 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 también se cierran todos los documentos que estuvieran abiertos. Los formularios Child se minimizan y maximizan dentro de los límites del formulario MDI. Cuando están maximizados, su Caption aparece junto al Caption del formulario
MDI. Los formularios Child no tienen menús propios, sino que sus menús aparecen en la barra de menús del formulario MDI.
En una aplicación con un formulario MDI y uno o más formularios Child, puede haber otros formularios que no sean Child y que se abren fuera de los límites del formulario MDI cuando son requeridos.

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 más de cada control.
Suponiendo que el sistema tenga memoria suficiente un array en Windows 95/98/NT podría llegar a tener hasta 32767 elementos.

La utilidad principal de los arrays se presenta en aquellos casos en los que el programa debe responder de forma semejante a un mismo evento sobre varios controles del mismo tipo. Los ejemplos más claros son los botones de opción y los menús. En estos casos el programa responde de manera semejante independientemente de cuál es la opción seleccionada. Los arrays de controles comparten código, lo cual quiere decir que sólo hay que programar una función para responder a un evento de un determinado tipo sobre cualquier control del array. Las funciones que gestionan los eventos de un array tienen siempre u argumento adicional del tipo Index As Integer que indica qué control del array ha recibido el evento.

Una opción avanzada de Visual Basic 6.0 permite crear objetos en tiempo de ejecución,
siempre que sean elementos de un array ya existente, con la instrucción Load. De forma análoga se
pueden destruir con Unload.

MENÚS
Entre las capacidades de Visual Basic 6.0 no podía faltar la de construir menús con gran facilidad. Sin embargo, hay algunas diferencias respecto al modo el que se construyen los controles. Para crear menús
Visual Basic dispone de una herramienta especial que se activa mediante el comando Menu Editor del menú
Tools.

Los menús presentan sobre los demás controles la ventaja de que ocupan menos espacio en pantalla, pero tienen el inconveniente de que sus posibilidades no están a la vista más que cuando se despliegan.

INTRODUCCIÓN A LAS POSIBILIDADES DE LOS
MENÚS
La mayor parte de las aplicaciones de Windows 95 utilizan menús. Aunque todo el mundo está familiarizado con sus funciones más básicas, conviene ver algunas posibilidades menos usuales. Se utilizarán para ello unas aplicaciones tan conocidas como Word y Excel.

Características:
1. Lo primero que llama la atención es que los menús aparecen divididos en grupos de opciones separados por líneas horizontales.

2. Algunos items como Page Layout tienen un icono resaltado a su izquierda. Esto quiere decir que ese ítem es la opción elegida entre los cuatro items de su grupo. En este sentido los menús se parecen a los controles OptionButton. Visual Basic 6.0 no permite hacer esto directamente, pero lo puede simular.

3. Otros items como Ruler tienen una marca de selección a su izquierda. En este caso el menú realiza la función de las cajas de selección (CheckBox).

4. Todas las opciones del menú tienen una letra subrayada. La finalidad es poder desplegar y activar los menús desde teclado, sin ayuda del ratón (con Alt y la letra subrayada).

5. También se observa que el ítem Comments aparece en gris claro. Esto quiere decir que en este momento no está activo y por tanto no es seleccionable.
6. Otros items como Toolbars están seguidos por un pequeño triángulo. Eso quiere decir que existe un menú secundario con más opciones. Otros items como Zoom aparecen seguidos por puntos suspensivos (...). Este es un convenio utilizado para indicar que eligiendo esa opción se abrirá un cuadro de diálogo en el que habrá que tomar otras decisiones.
Por lo que respecta al menú de Excel 97 que aparece en la Figura 5.3 la característica más importante es que tiene sub-menús (señalados mediante un pequeño triángulo a su derecha), que se abren al colocar el cursor sobre el ítem correspondiente. Estos menús se suelen llamar menús en cascada, y son muy frecuentes en Windows 95/98/NT.

Otra característica de los menús, que no aparece en la Figura 5.2 ni en la Figura 5.3, es la posibilidad de definir combinaciones de teclas que realizan la misma función que una opción del menú. Por ejemplo, en muchas aplicaciones Ctrl+C equivale a Edit/Copy y Ctrl+V a Edit/Paste.

Estas combinaciones de teclas se llaman accesos rápidos (shortcut) y hay que distinguirlas de acceder a los menús mediante la tecla Alt y las letras subrayadas de los nombres.

EL EDITOR DE MENÚS (MENU EDITOR)

Se llama título a cada elemento que aparece en la barra de menús y línea o ítem a cada elemento que aparece al desplegarse un título. Si se desea acceder a dicho título mediante teclado (Alt+letra), la letra que se desea utilizar deberá ir precedida por el carácter (&). Además, y al igual que todos los controles de Visual Basic 6.0, conviene que el título tenga un nombre (caja de texto Name) para que se pueda acceder a él desde programa. Los nombres de los títulos de los menús suelen comenzar por las letras mnu, como por ejemplo mnuFile, mnuEdit o mnuHelp.

Undo: primero se ponen las tres letras mnu, y después los nombres del título y del ítem comenzando por mayúscula: mnuEditUndo. Caso que haya menús 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.

De forma resumida, se pueden establecer las siguientes normas generales:
1. Para insertar un título o ítem basta seleccionar la línea por encima de la cual se quiere insertar y clicar en el botón Insert. Para añadir un nuevo ítem al final de la lista se selecciona el último elemento introducido y se clica en el botón Next. Para borrar un elemento, se selecciona y se clica en el botón Delete.
2. Se puede cambiar de posición un título o ítem seleccionándolo y clicando en los botones que muestran las flechas hacia arriba y hacia abajo. Para convertir un título 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 posición, según las normas explicadas anteriormente.

AÑADIR CÓDIGO A LOS MENÚS
Los items de los menús admiten un único evento: el evento click, que consiste en ser seleccionados por medio del ratón o del teclado. Para añadir el código correspondiente basta elegir en el menú, estando en modo diseño, el ítem correspondiente para que se abra la ventana de código en el procedimiento ligado a ese evento. También puede buscarse directamente el objeto y el evento correspondiente en las listas desplegables de la ventana de código.

En ocasiones habrá que cambiar las propiedades checked, active y visible desde los procedimientos. A estas propiedades se accede del modo habitual, con el nombre del ítem y el operador punto (.)

ARRAYS DE MENÚS
De la misma manera que pueden definirse arrays de controles, también pueden definirse arrays de items (y de títulos) en un menú. La ventaja de definir arrays de items es que basta definir un único procedimiento que se haga cargo del evento click de todos los items del array. Este procedimiento recibe como parámetro la variable entera Index, que indica que ítem del array ha sido seleccionado
por el usuario. Dentro de este procedimiento se podrá utilizar por ejemplo la sentencia Select Case
para tratar de forma adecuada cada uno de los casos.

5.6 MENÚS CONTEXTUALES (POPUP MENU)
Los menús contextuales aparecen cuando el usuario clica con el botón derecho sobre un elemento de la aplicación. El programa debe reconocer el evento MouseUp o MouseDown, ver si el usuario ha clicado con el botón derecho (argumento Button igual a 2) y llamar al método PopupMenu, que tiene la siguiente forma general:

PopupMenu menuName [,flags[,x[,y]]] donde menuName ee el nombre de un menú (con al menos un elemento), x e y son las coordenadas base para hacer aparecer el menú contextual, y flags son unas constantes que determinan más en concreto dónde y cómo se muestra el menú. Las constantes que determinan dónde aparece el menú son:

vbPopupMenuLeftAlign (default), vbPopupMenuCenterAlign y vbPopupMenuRightAlign. Por otra parte vbPopupMenuLeftButton (default) y vbPopupMenuRightButton determinan si el comando se activa con el botón izquierdo o con cualquiera de los dos botones. Las constantes se combina con el operador Or. El nombre del menú que aparece en el método PopupMenu debe haber sido creado con el Menu Editor, aunque puede tener la propiedad Visible a False, si no se desea que se vea.

lunes, 12 de abril de 2010

visual basic

4. EVENTOS, PROPIEDADES Y CONTROLES
En este capítulo se pretende recoger de una manera más sistemática y general los eventos y controles más habituales de Visual Basic 6.0. Hay que señalar que en ningún momento se pretende abandonar el carácter introductorio de este manual, y que Visual Basic 6.0 tiene muchas más
posibilidades de las que aquí se muestran. Por ejemplo, muchos de los controles y eventos de Visual
Basic 6.0 están relacionados con el acceso a bases de datos. Estos aspectos no se citarán en estos
apuntes. Para una información más detallada se puede acudir a un buen libro de referencia o al Help
del programa.
La programación en Visual Basic 6.0 (al menos para ejemplos sencillos) suele proceder del
siguiente modo:
1. Se definen interactivamente sobre el
formulario los controles que van a
constituir la aplicación.
2. Se define para cada control el código
con el que se va a responder a cada
uno de los eventos. Para ello basta
clicar dos veces sobre el control y se
abre una ventana de código como la
mostrada en la Figura 4.1. En ella
Visual Basic 6.0 ha preparado ya el
inicio y el final de la función con la
que se va a responder al evento. El nombre del evento forma parte del nombre de la
función, junto al nombre del control. En el ejemplo del la Figura 4.1 está preparada la
función para escribir el código que se ejecutará al producirse el evento Click sobre el
control cmbSalir.
En el resto de este capítulo se verán con un cierto detalle los eventos, controles y propiedades
más habituales en Visual Basic 6.0.
4.1 EVENTOS
A continuación se presentan brevemente los eventos más normales que reconoce Visual Basic 6.0.
Es importante tener una visión general de los eventos que existen en Windows 95/98/NT porque
cada control de los que se verán más adelante tiene su propio conjunto de eventos que reconoce, y
otros que no reconoce. Cualquier usuario de las aplicaciones escritas para Windows 95/98/NT hace
uso continuo e intuitivo de los eventos, pero es posible que nunca se haya detenido a pensar en ello.
Para saber qué eventos puede recibir un control determinado basta seleccionarlo y pulsar
. De esta forma se abre una ventana del Help que explica el control y permite acceder a los
eventos que soporta.
4.1.1 Eventos generales
4.1.1.1 Carga y descarga de formularios
Cuando se arranca una aplicación, o más en concreto cuando se visualiza por primera vez un
formulario se producen varios eventos consecutivos: Initialize, Load, Activate y Paint. Cada uno de
Figura 4.1. Código que gestionará el evento Click sobre
el control de nombre cmbSalir.
Capítulo 4: Eventos, Propiedades y Controles página 49
estos eventos se puede aprovechar para realizar ciertas operaciones por medio de la función
correspondiente.
Al ocultar, cerrar o eliminar un formulario se producen otra serie de eventos: Deactivate,
QueryUnload, Unload y Terminate que se verán en un próximo ejemplo.
Para inicializar las variables definidas a nivel de módulo se suele utilizar el evento Initialize,
que tiene lugar antes que el Load. El evento Load se activa al cargar un formulario. Con el
formulario principal esto sucede al arrancar la ejecución de un programa; con el resto de los
formularios al mandarlos cargar desde cualquier procedimiento o al hacer referencia a alguna
propiedad o control de un formulario que no esté cargado. Al descargar un formulario se produce el
evento Unload. Si se detiene el programa desde el botón Stop de Visual Basic 6.0 (o del menú
correspondiente) o con un End, no se pasa por el evento Unload. Para pasar por el evento Unload
es necesario cerrar la ventana con el botón de cerrar o llamarlo explícitamente. El evento
QueryUnload se produce antes del evento Unload y permite por ejemplo enviar un mensaje de
confirmación.
El evento Load de un formulario se suele utilizar para ejecutar una función que dé valor a sus
propiedades y a las de los controles que dependen de dicho formulario. No se puede utilizar para
dibujar o imprimir sobre el formulario, pues en el momento en que se produce este evento el
formulario todavía no está disponible para dichas operaciones. Por ejemplo, si en el formulario debe
aparecer la salida del método Print o de los métodos gráficos Pset, Line y Circle (que se estudian en
el Capítulo 6 de este manual) puede utilizarse el evento Paint u otro posterior (por ejemplo, el
evento GotFocus del primer control) pero no puede utilizarse el evento Load.
Se puede ocultar un formulario sin descargarlo con el método Hide o haciendo la propiedad
Visible = False. Esto hace que el formulario desaparezca de la ventana, aunque sus variables y
propiedades sigan estando accesibles y conservando sus valores. Para hacer visible un formulario
oculto pero ya cargado se utiliza el método Show, que equivale a hacer la propiedad Visible = True,
y que genera los eventos Activate y Paint. Si el formulario no había sido cargado previamente, el
método Show genera los cuatro eventos mencionados.
Cuando un formulario pasa a ser la ventana activa se produce el evento Activate y al dejar de
serlo el evento Deactivate. En el caso de que el formulario que va a ser activo no estuviera cargado
ya, primero sucederían los eventos Initialize, Load y luego los eventos Activate y Paint.
Todo esto se puede ver y entender con un simple ejemplo, mostrado en la Figura 4.2. Se han
de crear dos formularios (frmPrincipal y frmSecundario). El primero de ellos contendrá dos
botones (cmdVerSec y cmdSalir) y el segundo tres (cmdHide, cmdUnload y cmdTerminate). El
formulario principal será el primero que aparece, y sólo se verá el segundo si se clica en el botón
Cargar Formulario. Cuando así se haga, a medida que los eventos antes mencionados se vayan
sucediendo, irán apareciendo en pantalla unas cajas de mensajes que tendrán como texto el nombre
del evento que se acaba de producir. Según con cual de los tres botones se haga desaparecer el
segundo formulario, al volverlo a ver se producirán unos eventos u otros, según se puede ver por los
mensajes que van apareciendo con cada evento.
' código del form. principal
Private Sub cmdCargar_Click()
frmSecundario.Show
End Sub
' código del form. secundario
Private Sub cmdHide_Click()
Hide
End Sub
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 50
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
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.
4.1.1.2 Paint
El evento Paint sucede cuando hay que redibujar un formulario o PictureBox. Esto sucede cuando
esos objetos se hacen visibles por primera vez y también cuando vuelven a ser visibles después de
haber estado tapados por otros, tras haber sido movidos o tras haber sido modificados de tamaño.
4.1.1.3 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 más vivo o teniendo
parpadeando el cursor en él. Este foco puede ser trasladado de un objeto a otro por código o por
interacciones del usuario, como por ejemplo clicando con el ratón 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.
Figura 4.2. Resultado del ejemplo de carga de formularios.
Capítulo 4: Eventos, Propiedades y Controles página 51
El método 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 Mayúsculas+Tab. La propiedad TabIndex se puede determinar en
tiempo de diseño 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
automáticamente los valores de los demás controles (si tiene que desplazarlos hacia arriba o hacia
abajo, lo hace de modo que siempre tengan números consecutivos). Para que un formulario reciba
el foco es necesario que no haya en él ningún control que sea capaz de recibirlo.
Un grupo de botones de opción 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 ¯).
4.1.1.4 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 cuál es el código
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
determinar si esa tecla se ha pulsado estando pulsadas a la vez cualquier combinación de las teclas
Shift, Alt y Ctrl. En un apartado próximo se explica cómo se identifican las teclas pulsadas a partir
del argumento Shift.
4.1.2 Eventos relacionados con el ratón
4.1.2.1 Click y DblClick
El evento Click se activa cuando el usuario pulsa y suelta rápidamente uno de los botones del ratón.
También puede activarse desde código (sin tocar el ratón) variando la propiedad Value de alguno de
los controles. En el caso de un formulario este evento se activa cuando el usuario clica sobre una
zona del formulario en la que no haya ningún 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:
· Clicar sobre un control con el botón derecho o izquierdo del ratón. En el caso de un botón
de comando, de un botón de selección o de un botón de opción, el evento sucede solamente
al clicar con el botón 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 botón de comando, en un botón de
selección o en un botón de opción.
· Pulsar la tecla Return cuando en un formulario hay un botón que tiene su propiedad
Default= True.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 52
· Pulsar la tecla Esc cuando en un formulario hay un botón que tiene su propiedad Cancel =
True.
· Pulsar una combinación de teclas aceleradoras (Alt + otra tecla, como por ejemplo cuando
de despliega el menú File de Word con Alt+F) definidas para activar un determinado
control de un formulario.
También se puede activar el evento Click desde código realizando una de las siguientes
operaciones:
· Hacer que la propiedad Value de un botón de comando valga True.
· Hacer que la propiedad Value de un botón de opción valga True
· Modificar la propiedad Value de un botón de selección.
El evento DblClick sucede al clicar dos veces seguidas sobre un control o formulario con el
botón izquierdo del ratón.
4.1.2.2 MouseDown, MouseUp y MouseMove
El evento MouseDown sucede cuando el usuario pulsa cualquiera de los botones del ratón, mientras
que el evento MouseUp sucede al soltar un botón que había sido pulsado. El evento MouseMove
sucede al mover el ratón sobre un control o formulario.
Los eventos MouseUp y MouseDown tienen algunos argumentos que merecen ser
comentados. El argumento Button indica cuál de los botones del ratón ha sido pulsado o soltado, y
el argumento Shift indica si además alguna de las teclas alt, shift o ctrl está también pulsada. La
lista con todos los posibles valores de estos argumentos se muestra en la Tabla 4.1:
Cte simbólica Valor Acción Cte simbólica Valor Acción
vbLeftButton 1 Botón izdo pulsado o soltado vbShiftMask 1 Tecla SHIFT pulsada
vbRightButton 2 Botón dcho pulsado o soltado vbCtrlMask 2 Tecla CTRL pulsada
vbMiddleButton 4 Botón 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 aritmética booleana, lo cual quiere decir que si se pulsan
simultáneamente los botones izquierdo y derecho del ratón el argumento Button valdrá 3 (1+2) y si
se pulsan las tres teclas shift, ctrl y alt simultáneamente el argumento Shift valdrá 7 (1+2+4). Con
esta forma de combinar los valores se resuelven todas las indeterminaciones posibles.
4.1.2.3 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 ratón dependiendo de si el objeto sobre el que se
encuentra el cursor en ese momento es válido para soltar o no. El evento DragDrop sucede al
concluir una operación de arrastrar y soltar. El evento DragOver requiere de los argumentos que se
muestran a continuación:
Private Sub Text1_DragOver(Source As Control, _
X As Single, Y As Single, State As Integer)
...
End Sub
Capítulo 4: Eventos, Propiedades y Controles página 53
Los argumentos de este evento son Source que contiene el objeto que está siendo arrastrado,
X e Y que indican la posición del objeto arrastrado dentro del sistema de coordenadas del objeto
sobre el que se está arrastrando y State (que es propio del DragOver, pero no aparece en el
DragDrop) que vale 0, 1 ó 2 según se esté entrando, saliendo o permaneciendo dentro del mismo
objeto, respectivamente. Es importante señalar que el evento DragOver pertenece al objeto sobre el
que se arrastra, no al objeto que es arrastrado.
En el Help se puede encontrar información sobre la propiedad DragMode, que puede tomar
dos valores (vbManual y vbAutomatic). Esta constante determina cómo comienza una oparación de
arrastre de un objeto. En modo manual se debe comenzar llamando al método Drag para el objeto a
arrastrar. En modo automático basta clicar sobre el objeto a arrastrar, pero puede que en esta caso
dicho objeto no responda del modo habitual a otros eventos.
4.2 ALGUNAS PROPIEDADES COMUNES A VARIOS CONTROLES
Hay algunas propiedades que son comunes a muchos controles. A continuación se hace una lista con
las utilizadas más habitualmente:
· Appearance: Establece si un objeto tiene un aspecto plano (valor 0) o tridimensional (valor
1).
· BackColor: Establece el color de fondo de un objeto.
· Caption: Establece el texto que aparece dentro o junto al objeto. Tiene el papel de un
título.
· Enabled: Establece si un objeto es accesible y modificable o no.
· Font: Establece las características del tipo de letra del objeto.
· ForeColor: Establece el color del texto y/o gráficos de un objeto.
· Height y Width: Establecen la altura y achura de un objeto.
· Left y Top: Establecen la distancia horizontal y vertical entre el origen del control y el
origen del objeto que lo contiene, que puede ser un formulario, un marco (frame), etc.
· MousePointer: Establece la forma que adoptará el puntero del ratón al posicionarse sobre
el objeto. Esta forma puede elegirse dentro de una lista en las que aparecen las habituales
del puntero del ratón o creando iconos propios. Algunas constantes de significado
inmediato que definen la forma del cursor son las siguientes: vbDefault, vbArrow,
vbCrosshair, vbIbeam, vbSizePointer, vbUpArrow, vbHourglass, etc. Para más información
puede consultarse el Help de MousePointer.
· Name: Nombre del objeto. Todos los objetos incluidos en un formulario deben tener un
nombre con el que poder referirse a él a la hora de programar la forma en que debe actuar.
Existen unas reglas para definir los nombre de los controles, que ya se vieron en el
Capítulo 1.
· Visible: Establece si el objeto es visible o invisible.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 54
Figura 4.3. Algunos de los controles más habituales de Visual Basic.
4.3 CONTROLES MÁS USUALES
En la Figura 4.3 se muestran algunos de los controles más habituales en Visual Basic 6.0. Estos
controles se explican a continuación con más detalle.
4.3.1 Botón de comando (Command Button)
La propiedades más importantes del botón de comando son su Caption,
que es lo que aparece escrito en él, las referentes a su posición (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 carácter (&) antes de una de sus letras, dicha letra
aparece subrayyada en el botón (como la “x” en el botón Exit de la figura anexa). Esto quiere decir
que, como es habitual en Windows, dicho botón puede activarse con el teclado por medio de la
combinación Alt+letra subrayada. Esta característica es común a muchos de los controles que
tienen propiedad Caption.
El evento que siempre suelen tener programado los botones de comandos es el evento Click.
Capítulo 4: Eventos, Propiedades y Controles página 55
4.3.2 Botones de opción (Option Button)
Además de las mencionadas para el caso anterior estos botones tienen la
propiedad Value, que en un determinado momento sólo 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 después cuantos botones de
opción se desee. En un mismo formulario se pueden colocar cuantos grupos de botones de opción se
quiera, cada uno de ellos agrupado dentro de su propio marco. Es muy importante colocar primero
el frame y después los botones de opción. Con esto se consigue que los botones de opción estén
agrupados, de modo que sólo uno de ellos pueda estar activado. Si no se coloca ningún frame todos
los botones de opción 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.
Sólo un grupo de botones de opción puede recibir el focus, no cada botón por separado.
Cuando el grupo tiene el focus, con las flechas del teclado (­ y ¯) se puede activar una u otra opción
sin necesidad de usar el ratón. También se puede utilizar Alt+carácter introduciendo antes de dicho
carácter un (&) en el Caption del botón de opción.
4.3.3 Botones de selección (Check Box)
La única diferencia entre estos botones y los anteriores es que en los
botones de selección puede haber más de uno con la propiedad Value a
True. Estos botones no forman grupo aunque estén dentro de un frame, y
reciben el focus individualmente. Se puede también utilizar el carácter (&)
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 programación.
4.3.4 Barras de desplazamiento (Scroll Bars)
En este tipo de control las propiedades más 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 clicar en la barra o en el botón 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
común para las barras de desplazamiento verticales y horizontales.
Además de las Scroll Bars horizontal y vertical, Visual Basic 6.0 dispone también del control
Slider, utilizado en los paneles de control de Windows, que tiene una función similar.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 56
4.3.5 Etiquetas (Labels)
En las etiquetas o labels la propiedad más importante es Caption, que contiene
el texto que aparece sobre este control. Esta propiedad puede ser modificada
desde programa, pero no interactivamente clicando sobre ella (a diferencia de
las cajas de texto, que se verán a continuación). Puede controlarse su tamaño,
posición, color de fondo y una especie de borde 3-D. Habitualmente las labels
no suelen recibir eventos ni contener código.
Las Labels tienen las propiedades AutoSize y WordWrap. La primera, cuando está a True,
ajusta el tamaño del control al del texto en él contenido. La segunda hace que el texto se distribuya
en varias líneas cuando no cabe en una sola.
4.3.6 Cajas de texto (Text Box)
La propiedad más importante de las cajas de texto es Text, que almacena el
texto contenido en ellas. También se suelen controlar las que hacen
referencia a su tamaño, posición y apariencia. En algún 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 sólo lectura. La propiedad MultiLine, que sólo se
aplica a las cajas de texto, determina si en una de ellas se pueden incluir más de una línea o si se
ignoran los saltos de línea. La justificación 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 diseño. En
modo de ejecución 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 misión de modo automático.
Otras propiedades importantes hacen referencia a la selección de texto dentro de la caja, que
sólo están disponibles en tiempo de ejecución. La propiedad SelStart sirve para posicionar el cursor
al comienzo del texto que se desea seleccionar (el primer carácter es el cero); SelLength indica el
número de caracteres o longitud de la selección; 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 ningún texto seleccionado, el texto de SelText se inserta en
la posición del cursor); para entresacar el texto seleccionado basta utilizar esta propiedad en alguna
expresión.
Los eventos que se programan son Change, cuando se quiere realizar alguna acción 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 introducción del código ASCII
13 (Intro) para detectar que ya se finalizado con la introducción de datos. También se utiliza la
propiedad MaxLength para determinar el número máximo 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 mayoría de las veces con esta finalidad), puede ser interesante utilizar el método
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
Capítulo 4: Eventos, Propiedades y Controles página 57
Roman, etc.), FontSize es un tipo Short que contiene el tamaño de la letra, y FontBold, FontItalic,
FontUnderline y FontStrikethrough son propiedades tipo Boolean que indican si el texto va a
tener esa característica o no.
4.3.7 Listas (List Box)
Una lista es un control en el que se pueden mostrar varios registros
o líneas, teniendo uno o varios de ellos seleccionado(s). Si en la
lista hay más registros de los que se pueden mostrar al mismo
tiempo, se añade automáticamente una scrollBar.
Para añadir o eliminar registros de la lista en modo de
ejecución se utilizan los métodos 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 diseño a través de la ventana de propiedades.
List permite también acceder a los elementos de la lista en tiempo de ejecución, para utilizar y/o
cambiar su valor. Para ello se pone en índice del elemento entre paréntesis (empezando a contar por
cero) a continuación de List, como se muestra a continuación por ejemplo, para cambiar el tercer
elemento:
lstName.List(2) = "Tercero"
Para añadir un registro en tiempo de ejecución se utiliza AddItem:
lstName.AddItem Registro_Añadido, posicion
donde posicion es un argumento opcional que permite especificar la posición en que se debe añadir.
Si se omite el registro se añade al final de la lista. Lo anterior es válido si la propiedad Sorted está a
False; si está a True el nuevo registro se añade en la posición ordenada que le corresponde. Para
eliminar un registro,
lstName.RemoveItem Posición_del_registro_en_la_lista
En el caso de que se quiera vaciar completamente el contenido de una lista se puede utilizar el
método Clear.
Dos propiedades interesantes de las listas son ListCount y ListIndex. La primera contiene el
número total de registros incluidos en la lista. La segunda permite acceder a una posición concreta
de la lista para añadir un registro nuevo en esa posición, borrar uno ya existente, seleccionarlo, etc.
Hay que recordar una vez más que los elementos de la lista se empiezan a numerar por cero. El
valor de propiedad ListIndex en cada momento coincide con el registro seleccionado y en el caso de
no haber ninguno seleccionado esta propiedad vale -1.
Es interesante saber que al seleccionar uno de los registros de la lista se activa el evento Click
de dicha lista.
Las listas permiten selecionar más de un elemento poniendo la propiedad MultiSelect a valor
1-Simple o 2-Extended. En el primer caso los elementos se seleccionan o se elimina la selección
simplemente clicando sobre ellos. En el segundo caso la forma de hacer selecciones múltiples es la
típica de Windows, utilizando las teclas Ctrl y Shift. Con selección múltile la propiedad SelCount
indica el número de elementos seleccionados, mientras que la propiedad Selected() es un array de
valores boolean que indica si cada uno de los elementos de la lista está seleccionado o no.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 58
4.3.8 Cajas combinadas (ComboBox)
Un ComboBox tiene muchas cosas en común con una lista. Por ejemplo los
métodos 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
más habitual y corresponde con el caso en el que sólo se muestra el registro
seleccionado, que es editable por el usuario, permaneciendo el resto oculto hasta que el
usuario despliega la lista completa clicando sobre el botón-flecha.
2. Style=1 ó Style=vbComboSimple (Simple Combo). En este caso el registro seleccionado
también 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 ejecución, 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.
4.3.9 Controles relacionados con ficheros
Trabajando en un entorno Windows 95/98/NT es habitual tener que abrir y cerrar
ficheros parar leer datos, guardar un documento, etc. Hay tres controles básicos que resultan de
suma utilidad en esta tarea. Son la lista de unidades lógicas o discos (Drive ListBox), la lista de
directorios (Dir ListBox) y la lista de ficheros (File ListBox). Estos controles se tratan con más
detalle en el Capítulo 7.
4.3.10 Control Timer
Si se desea que una acción suceda con cierta periodicidad se puede utilizar un control Timer.
Este control produce de modo automático un evento cada cierto número de milisegundos y es
de fundamental importancia para crear animaciones o aplicaciones con movimiento de objetos. La
propiedad más importante de un objeto de este tipo es Interval, que determina, precisamente, el
intervalo en milisegundos entre eventos consecutivos. La acción que se desea activar debe
programarse en el evento Timer de ese mismo control.
Si en algún momento se desea detener momentáneamente la acción periódica 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 también se consigue inhabilitar el Timer.
4.4 CAJAS DE DIÁLOGO ESTÁNDAR (CONTROLES COMMON DIALOG)
El control de cuadro de diálogo estándar de Windows 95/NT (Common Dialog) ofrece una forma
sencilla y eficiente de realizar algunas de las tareas más comunes de un programa, tales como la
Capítulo 4: Eventos, Propiedades y Controles página 59
selección de un fichero para lectura/escritura, la impresión de un fichero o la selección de un tipo de
letra o un color.
Lo primero que hay que hacer es ubicar el control en el formulario. El control se representará
como un icono de tamaño invariable. No es posible especificar la ubicación que tendrá la caja de
diálogo cuando se abra en la pantalla, ya que se trata de una propiedad no accesible por el usuario.
Un único cuadro de diálogo estándar puede bastar para realizar todas las funciones que se
deseen, es decir, no es necesario insertar un cuadro de diálogo para imprimir un texto y otro para
guardarlo, sino que ambos pueden compartir el mismo cuadro de diálogo simplemente invocando a
uno u otro tipo en tiempo de ejecución (no es posible indicarlo en tiempo de diseño). Para ello se
dispone de los métodos siguientes: ShowColor, ShowFont, ShowHelp, ShowOpen, ShowPrinter y
ShowSave. En ocasiones interesará introducir varios controles diferentes por motivos de claridad o
para que ciertas propiedades sean distintas.
Figura 4.4. Controles Common Dialog.
En la Figura 4.4 se pueden observar distintos tipos de control Common Dialog. Por ejemplo,
si se desea visualizar un cuadro de diálogo para abrir un fichero, habrá que escribir:
dlgAbrir.ShowOpen
donde dlgAbrir es el nombre asignado al control Common Dialog.
Las principales propiedades de este control en cada una de sus variantes se explican en los
apartados siguientes. La propiedad Flag existe para todos los controles y determina algunas de sus
características más importantes.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 60
4.4.1 Open/Save Dialog Control
Las propiedades más importantes de este control son:
· DefaultExt: Es la extensión por defecto a utilizar para abrir/salvar archivos. Con Save, si el
nombre del fichero se teclea sin extensión, se añade esta extensión por defecto.
· DialogTitle: Devuelve o da valor al título de la caja de diálogo (cadena de caracteres).
· FileName: Nombre completo del archivo a abrir/salvar, incluyendo el path.
· FileTitle: Nombre del archivo a abrir/salvar pero sin la ruta de acceso correspondiente.
· Filter: Contiene los filtros de selección que aparecerán indicados en la parte inferior de la
pantalla en la lista de tipos de archivo. Pueden indicarse múltiples tipos de archivo,
separándolos mediante un barra vertical ( Alt Gr +< 1> ). Su sintaxis es la siguiente:
Objeto.Filter = "(descripción a aparecer en la listbox)|filtro"
Por ejemplo:
"Texto (*.txt)|*.txt|Imágenes(*.bmp;*.ico)|*.bmp;*.ico"
· FilterIndex: Indica el índice (con respecto a la lista de tipos) del filtro por defecto. Se
empiezan a numerar por "1".
· InitDir: Contiene el nombre del directorio por defecto. Si no se especifica, se utiliza el
directorio actual.
· Flags: Esta propiedad puede tomar muchos valores con objeto de fijar los detalles
concretos de este control (por ejemplo, abrir un fichero en modo read only, avisar antes de
escribir sobre un fichero ya existente, etc.). Estos valores están definidos por constantes de
Visual Basic 6.0 cuyos nombres empiezan con las letras cdl. Para más información en el
Help de Common Dialog Control buscar Properties, Flags Properties (Open, Save As
Dialogs). Por ejemplo, el valor definido por la constante cdlOFNOverwritePrompt hace
que antes de escribir en un fichero ya existente se pida confirmación al usuario. Para
establecer varias opciones a la vez se le asigna a Flags la suma de las constantes
correspondientes. Las distintas constantes disponibles se pueden encontrar en el Help
buscando Constants/CommonDialog Control.
4.4.2 Print Dialog Control
Las propiedades más importantes de este control son:
· Copies: Determina el número de copias a realizar por la impresora.
· FromPage: Selecciona el número de página a partir del cual comienza el rango de
impresión.
· ToPage: Selecciona el número de página hasta la cual llega el rango de impresión.
· PrinterDefault: Cuando es True se imprime en el objeto Visual Basic Printer. Además las
opciones actuales de impresión que se cambien serán asignadas como las opciones de
impresión por defecto del sistema.
· Flags: Ver con ayuda del Help los posibles valores de esta propiedad.
Capítulo 4: Eventos, Propiedades y Controles página 61
4.4.3 Font Dialog Control
Las propiedades más importantes de este control son:
· Color: Color de impresión. Para usar esta propiedad hace falta establecer la propiedad
Flags al valor de la constante cdlCFEffects.
· FontBold, FontItalic, FontStrikethru, FontUnderline: Devuelve o asigna los valores de
los estilos de la fuente actual.
· FontName: Devuelve o asigna el nombre de la fuente en uso.
· FontSize: Devuelve o asigna el tamaño de la fuente en uso.
· Min y Max: Asigna o lee los valores del tamaño de fuente mínimo y máximo
respectivamente que aparecerán en la lista de selección de tamaños de la fuente.
· Flags: Indica si los tipos de letra que se van a mostrar son los de la pantalla
(cdlCFScreenFonts), los de la impresora (cdlCFPrinterFonts) o ambos (cdlCFBoth). Con
la constante cdlCFEffects se puede indicar que se permite cambiar efectos como el color,
subrayado y cruzado con una línea. Si Flags vale 0 da un error en tiempo de ejecución
inndicando que no hay fonts instaladas.
4.4.4 Color Dialog Control
Las propiedades más importantes de este control son:
· Color: Devuelve o asigna el valor del color actual.
· Flags: Ver con ayuda del Help los posibles valores de esta propiedad. Por ejemplo, con el
valor cdlCCFullOpen muestra el cuadro de diálogo completo, mientras que el valor
cdlCCPreventFullOpen muestra sólo los colores predefinidos, impidiendo definir otros
nuevos. Con el valor cdlCCRGBInit se establece el color inicial para el cuadro de diálogo.
4.5 FORMULARIOS MÚLTIPLES
Un programa puede contener más de un formulario. De hecho, habitualmente los programas
contienen múltiples formularios. Recuérdese que el formulario es la ventana de máximo 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 cuál debe ser el formulario principal en el menú
Project/Project Properties, en la lengüeta General, en la sección 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 serán cargados en su momento, a lo largo de la
ejecución del programa.
Para añadir en tiempo de diseño 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 ejecución un formulario distinto del inicial (o del que esté activo en
ese momento), se utiliza el método Show (frmName.Show). El método Hide oculta el formulario,
pero lo deja cargado; el método Activate lo vuelve a mostrar. El método Unload elimina los
elementos gráficos del formulario, pero no las variables y el código. El método Unload Me descarga
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 62
el propio formulario que lo llama. Para eliminar completamente un formulario se puede utilizar el
comando:
Set frmName = NOTHING
que llama al evento Terminate (hay que utilizar también los métodos Hide o Unload para que
desaparezca de la pantalla).
Para referirse desde un formulario a los objetos y variables de otro formulario se utiliza el
operador punto (frmName.Object.Property).
4.5.1 Apertura de controles en forma modal
En ciertas ocasiones se desea que el programa no realice ninguna acción hasta que el usuario cierre
una ventana o formulario en la que se le pregunta algo o en la que tiene que tomar alguna decisión.
En esos casos, al utilizar el método 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
4.5.2 Formularios MDI (Multiple Document Interface)
En algunos casos puede ser
interesante establecer una jerarquía
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 también todas las
que se han abierto desde ella y
dentro de ella. De esta forma una
misma aplicación 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 aplicación. En el mundo de las Windows de Microsoft a esto se
llama MDI (Multiple Document Interface). La Figura 4.5 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 aplicación sólo 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 aplicación 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 también se cierran todos los documentos que
Figura 4.5. Formularios MDI (Multiple Document Interface).
Capítulo 4: Eventos, Propiedades y Controles página 63
estuvieran abiertos. Los formularios Child se minimizan y maximizan dentro de los límites del
formulario MDI. Cuando están maximizados, su Caption aparece junto al Caption del formulario
MDI. Los formularios Child no tienen menús propios, sino que sus menús aparecen en la barra de
menús del formulario MDI.
En una aplicación con un formulario MDI y uno o más formularios Child, puede haber otros
formularios que no sean Child y que se abren fuera de los límites del formulario MDI cuando son
requeridos.
4.6 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 más de cada control.
Suponiendo que el sistema tenga memoria suficiente un array en Windows 95/98/NT podría llegar a
tener hasta 32767 elementos.
La utilidad principal de los arrays se presenta en aquellos casos en los que el programa debe
responder de forma semejante a un mismo evento sobre varios controles del mismo tipo. Los
ejemplos más claros son los botones de opción y los menús. En estos casos el programa responde de
manera semejante independientemente de cuál es la opción seleccionada. Los arrays de controles
comparten código, lo cual quiere decir que sólo hay que programar una función para responder a un
evento de un determinado tipo sobre cualquier control del array. Las funciones que gestionan los
eventos de un array tienen siempre u argumento adicional del tipo Index As Integer que indica qué
control del array ha recibido el evento.
Una opción avanzada de Visual Basic 6.0 permite crear objetos en tiempo de ejecución,
siempre que sean elementos de un array ya existente, con la instrucción Load. De forma análoga se
pueden destruir con Unload.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 64
5. MENÚS
Entre las capacidades de Visual Basic 6.0 no podía
faltar la de construir menús con gran facilidad. Sin
embargo, hay algunas diferencias respecto al modo el
que se construyen los controles. Para crear menús
Visual Basic dispone de una herramienta especial que se
activa mediante el comando Menu Editor del menú
Tools. El cuadro de diálogo que se abre se nuestra en la
Figura 5.1. Más adelante se verá cómo se utiliza esta
herramienta; antes, conviene recordar brevemente las
características más importantes de los menús de
Windows 95/98/NT.
Los menús presentan sobre los demás controles la
ventaja de que ocupan menos espacio en pantalla, pero
tienen el inconveniente de que sus posibilidades no
están a la vista más que cuando se despliegan.
5.1 INTRODUCCIÓN A LAS POSIBILIDADES DE LOS
MENÚS
La mayor parte de las aplicaciones de Windows 95
utilizan menús. Aunque todo el mundo está
familiarizado con sus funciones más básicas, conviene
ver algunas posibilidades menos usuales. Se utilizarán
para ello unas aplicaciones tan conocidas como Word y
Excel.
La Figura 5.2 recoge el aspecto del menú View de
Word 97, en el que conviene destacar las siguientes
características:
1. Lo primero que llama la atención es que los menús
aparecen divididos en grupos de opciones
separados por líneas horizontales.
2. Algunos items como Page Layout tienen un icono
resaltado a su izquierda. Esto quiere decir que ese
ítem es la opción elegida entre los cuatro items de
su grupo. En este sentido los menús se parecen a
los controles OptionButton. Visual Basic 6.0 no
permite hacer esto directamente, pero lo puede
simular.
3. Otros items como Ruler tienen una marca de
selección a su izquierda. En este caso el menú
realiza la función de las cajas de selección (CheckBox).
4. Todas las opciones del menú tienen una letra subrayada. La finalidad es poder desplegar y
activar los menús desde teclado, sin ayuda del ratón (con Alt y la letra subrayada).
Figura 5.1. Editor de menús de Visual Basic.
Figura 5.2. El menú View de Word 97.
Figura 5.3. El menú Format/Sheet de Excel 97.
Capítulo 5: Menús página 65
5. También se observa que el ítem Comments aparece en gris claro. Esto quiere decir que en este
momento no está activo y por tanto no es seleccionable.
6. Otros items como Toolbars están seguidos por un pequeño triángulo. Eso quiere decir que
existe un menú secundario con más opciones. Otros items como Zoom aparecen seguidos por
puntos suspensivos (...). Este es un convenio utilizado para indicar que eligiendo esa opción se
abrirá un cuadro de diálogo en el que habrá que tomar otras decisiones.
Por lo que respecta al menú de Excel 97 que aparece en la Figura 5.3 la característica más
importante es que tiene sub-menús (señalados mediante un pequeño triángulo a su derecha), que se
abren al colocar el cursor sobre el ítem correspondiente. Estos menús se suelen llamar menús en
cascada, y son muy frecuentes en Windows 95/98/NT.
Otra característica de los menús, que no aparece en la Figura 5.2 ni en la Figura 5.3, es la
posibilidad de definir combinaciones de teclas que realizan la misma función que una opción del
menú. Por ejemplo, en muchas aplicaciones Ctrl+C equivale a Edit/Copy y Ctrl+V a Edit/Paste.
Estas combinaciones de teclas se llaman accesos rápidos (shortcut) y hay que distinguirlas de
acceder a los menús mediante la tecla Alt y las letras subrayadas de los nombres.
5.2 EL EDITOR DE MENÚS (MENU EDITOR)
En la Figura 5.4 se vuelve a recoger -a
mayor tamaño y con algunos
elementos ya definidos- el editor de
menús mostrado en la Figura 5.1, que
se abre con Tools/Menu Editor o
clicando en el botón correspondiente
de la barra de herramientas.
Se llama título a cada elemento
que aparece en la barra de menús y
línea o ítem a cada elemento que
aparece al desplegarse un título. Para
introducir un nuevo título en la barra
de menús hay que definir, en la caja de
texto Caption de la Figura 5.4, el
nombre con el que se quiere que
aparezca. Si se desea acceder a dicho
título mediante teclado (Alt+letra), la
letra que se desea utilizar deberá ir
precedida por el carácter (&). Además,
y al igual que todos los controles de
Visual Basic 6.0, conviene que el
título tenga un nombre (caja de texto
Name) para que se pueda acceder a él desde programa. Los nombres de los títulos de los menús
suelen comenzar por las letras mnu, como por ejemplo mnuFile, mnuEdit o mnuHelp.
En la Figura 5.4 la caja de texto Index hace referencia a la posibilidad de crear arrays de
menús. Se puede definir también 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 esté activado o que sea
visible.
Figura 5.4. Definición de menús con Menu Editor.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 66
Se pueden introducir items subordinados a un título por medio
de la flecha hacia la derecha. Para ello basta definirlos del modo
habitual y luego clicar 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 5.4, Exit es una línea
subordinada del menú File, mientras que Undo, Repeat, Cut, Copy y
Paste son items subordinados del menú Edit. En este último caso se
ha introducido una línea de separación entre Repeat y Cut; para ello
basta introducir un ítem más cuyo caption sea el carácter menos (-).
La Figura 5.5 muestra el resultado de ejecutar la aplicación
cuyos menús están definidos en el Menu Editor de la Figura 5.4. Obsérvese la línea horizontal de
separación, 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 5.4 para Undo: primero se ponen las tres letras mnu, y después los nombres del título y
del ítem comenzando por mayúscula: mnuEditUndo. Caso que haya menús 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.
La Figura 5.4 es bastante auto-explicativa respecto a cómo se debe proceder para estructurar
un menú, añadiendo, borrando o cambiando de posición los distintos elementos. De forma
resumida, se pueden establecer las siguientes normas generales:
1. Para insertar un título o ítem basta seleccionar la línea por encima de la cual se quiere insertar
y clicar en el botón Insert. Para añadir un nuevo ítem al final de la lista se selecciona el último
elemento introducido y se clica en el botón Next. Para borrar un elemento, se selecciona y se
clica en el botón Delete.
2. Se puede cambiar de posición un título o ítem seleccionándolo y clicando en los botones que
muestran las flechas hacia arriba y hacia abajo. Para convertir un título 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 posición, según las normas explicadas anteriormente.
5.3 AÑADIR CÓDIGO A LOS MENÚS
Los items de los menús admiten un único evento: el evento click, que consiste en ser seleccionados
por medio del ratón o del teclado. Para añadir el código correspondiente basta elegir en el menú,
estando en modo diseño, el ítem correspondiente para que se abra la ventana de código en el
procedimiento ligado a ese evento. También puede buscarse directamente el objeto y el evento
correspondiente en las listas desplegables de la ventana de código.
En ocasiones habrá que cambiar las propiedades checked, active y visible desde los
procedimientos. A estas propiedades se accede del modo habitual, con el nombre del ítem y el
operador punto (.)
5.4 ARRAYS DE MENÚS
De la misma manera que pueden definirse arrays de controles, también pueden definirse arrays de
items (y de títulos) en un menú. La ventaja de definir arrays de items es que basta definir un único
procedimiento que se haga cargo del evento click de todos los items del array. Este procedimiento
Figura 5.5. Menú Edit sencillo.
Capítulo 5: Menús página 67
recibe como parámetro la variable entera Index, que indica que ítem del array ha sido seleccionado
por el usuario. Dentro de este procedimiento se podrá utilizar por ejemplo la sentencia Select Case
para tratar de forma adecuada cada uno de los casos.
5.5 EJEMPLO: MENÚ PARA DETERMINAR LAS CARACTERÍSTICAS DE UN TEXTO
La Figura 5.6 muestra un formulario que
contiene una caja de texto con una frase
(“Visual Basic es el lenguaje de programación
que hace más fácil el desarrollar aplicaciones
para Windows 95”) a la que se puede dar
formato desde el menú Text. El menú Text
tiene tres submenús: Font, Size y Style. El
menú File sólo tiene la opción Exit, que
termina la ejecución.
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 sub-menú Style tiene 2 opciones: Bold
e Italic. Los tipos de letra y los tamaños deben
actuar como los Option Buttons: sólo una opción puede estar seleccionada para el texto de la caja.
Sin embargo, los estilos Bold e Italic actúan como Checked Boxes: el texto puede ser a la vez Bold
e Italic, y puede no ser ninguna de las dos cosas.
Para los tamaños de letra se debe utilizar un array de menús 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 código del programa que se muestra a continuación. Nótese que con los menús
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 código se muestra a continuación:
Option Explicit
Private Sub Form_Load()
txtBox.Text = "Visual Basic es el lenguaje de programación " & _
"que hace más fácil el desarrollar aplicaciones para Windows 95"
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
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
Figura 5.6. Caja de texto con formatos desde menú.
ESIISS: Aprenda Visual Basic 6.0 como si estuviera en Primero página 68
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 = 10
Case 1
txtBox.Font.Size = 11
Case 2
txtBox.Font.Size = 12
Case 3
txtBox.Font.Size = 13
Case 4
txtBox.Font.Size = 14
End Select
mnuTextSizeA(Index).Checked = 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
5.6 MENÚS CONTEXTUALES (POPUP MENU)
Los menús contextuales aparecen cuando el usuario clica con el botón derecho sobre un elemento
de la aplicación. El programa debe reconocer el evento MouseUp o MouseDown, ver si el usuario
ha clicado con el botón derecho (argumento Button igual a 2) y llamar al método PopupMenu, que
tiene la siguiente forma general:
PopupMenu menuName [,flags[,x[,y]]]
donde menuName ee el nombre de un menú (con al menos un elemento), x e y son las coordenadas
base para hacer aparecer el menú contextual, y flags son unas constantes que determinan más en
concreto dónde y cómo se muestra el menú. Las constantes que determinan dónde aparece el menú
son: vbPopupMenuLeftAlign (default), vbPopupMenuCenterAlign y vbPopupMenuRightAlign. Por
otra parte vbPopupMenuLeftButton (default) y vbPopupMenuRightButton determinan si el comando
se activa con el botón izquierdo o con cualquiera de los dos botones. Las constantes se combina con
el operador Or. El nombre del menú que aparece en el método PopupMenu debe haber sido creado
con el Menu Editor, aunque puede tener la propiedad Visible a False, si no se desea que se vea.