INICIO EN VISUAL BASIC
A WEB 100% MEXICANA
________________________________________________
________________________________________________
EVENTOS Y PROPIEDADES RELACIONADAS CON GRÁFICOS
El evento Paint
El evento Paint se ejecuta cuando un objeto -de tipo form o PictureBox- se hace visible. Su finalidad es que el resultado de los métodos gráficosy del método Print aparezcan en el objeto correspondiente. Hay que tener en cuenta que si se introducen métodos gráficos en el procedimiento Form_load su resultado no aparece al hacerse visible el formulario (es como si se dibujara sobre el formulario antes de que éste existiera). Para que el resultados de Print y de los métodos gráficos aparezcan al hacerse visible el formulario, deben introducirse en el procedimiento Paint_form. También los controlespictureBox tienen evento Paint, que se ejecuta al hacerse visibles.
El evento Paint tiene mucha importancia en relación con el refresco de los gráficos y con la velocidad de ejecución de los mismos. En los apartados siguientes se completará la explicación de este tema.
La propiedad DrawMode
Esta es una propiedad bastante importante y difícil de manejar, sobre todo si se quieren realizar cierto tipo de acciones con los métodos gráficos. La opción por defecto es la nº 13:Copy Pen.
La propiedad DrawMode controla cómo se dibujan los controles Line y Shape, así como los resultados de los métodos gráficosPSet, Line y Circle. La opción por defecto hace que cada elemento gráfico se dibuje con el color correspondiente (por defecto elforeColor) sobre lo dibujado anteriormente. En ocasiones esto no es lo más adecuado pues, por ejemplo, si se superponen dos figuras del mismo color o si se dibuja con el backColor, los gráficos resultan indistinguibles.
Para entender cómo funciona DrawMode es necesario tener claros los conceptos de color complementario y combinación de dos colores . El color complementario de un color es el color que sumado con él da el blanco (&HFFFFFF&). Por ejemplo, el color complementario del rojo (&H0000FF&) es el cyan (&HFFFF00&).
El color complementario se puede obtener mediante la simple resta del color blanco menos el color original. Por su parte la combinación de dos colores es el color que resulta de aplicar el operador lógico Or: el color resultante tiene sus bits a 1 si alguno o los dos de los colores originales tiene a 1 el bit correspondiente. La explicación de los distintos valores de la propiedad DrawMode que se obtiene del Help es la siguiente:
Existen muchisimas distintas aplicaciones de esta propiedad
Planos de dibujo (Layers)
Visual Basic considera tres planos superpuestos (layers): el plano frontal, el plano intermedio y el plano de fondo. Es importante saber en qué plano se introduce cada elemento gráfico para entender cuándo unos elementos se superpondrán a otros en la pantalla. En principio, los tres planos se utilizan del siguiente modo:
En el plano frontal (Front) se dibujan todos los controles, excepto los controles gráficos y las labels.
En el plano intermedio se representan los controles gráficos y labels.
En el plano de fondo se representa el color de fondo y el resultado de los métodos gráficos. Estas reglas tienen excepciones que dependen de la propiedad AutoRedraw, de la propiedad ClipControl y de si los métodos gráficos se utilizan o no asociados al eventoPaint.
La propiedad AutoRedraw
Esta propiedad tiene una gran importancia. En principio, todas las aplicaciones de Windows permiten superponer ventanas y/u otros elementos gráficos, recuperando completamente el contenido de cualquier ventana cuando ésta se selecciona de nuevo y viene a primer plano (es la ventana activa). A esto se llama redibujar (redraw) la ventana. Cualquier aplicación que se desarrolle en Visual Basic 6.0 debe ser capaz de redibujarse correctamente, pero para ello el programador debe conocer algo de la propiedad AutoRedraw. Por defecto, Visual Basic redibuja siempre los controles que aparecen en un formulario. Esto no sucede sin embargo con el resultado de los métodos gráficosy de Print. Para que la salida de estos métodos se redibuje es necesario adoptar uno de los dos métodos siguientes: Si en el form o pictureBox la propiedad AutoRedraw está enFalse:
• Si los métodos gráficosy Print están en el procedimiento correspondiente al eventoPaint se redibujan en el plano de fondo (los métodos vuelven a ejecutarse, por lo que el proceso puede ser lento en ciertos casos).
• Si los métodos gráficosy Print están fuera del eventoPaint no se redibujan.
Si en el form o pictureBox la propiedad AutoRedraw está enTrue:
• Si los métodos gráficosy Print están en el eventoPaint se ignoran.
• Si los métodos gráficos y Print están fuera del evento Paint se redibujan guardando en memoria una copia de la zona de pantalla a refrescar. Este es la forma más rápida de conseguir que los gráficos y el texto se redibujen. Tiene el inconveniente de necesitar más memoria. La propiedad AutoRedraw de los forms y de las pictureBox es independiente, por lo que las dos formas anteriores de conseguir que los gráficos se redibujen se pueden utilizar conjuntamente, por ejemplo una en el formulario y otra en las pictureBox.
La propiedad ClipControl
Por defecto esta propiedad de las forms y pixtureBox está enTrue. En este caso los controles están siempre por encima de la salida de los métodos gráficos, por lo que nunca por ejemplo una línea se dibujará sobre un botón o una barra de desplazamiento (los controles están siempre en el plano frontal o en el plano intermedio, según se ha explicado antes). Cuando la propiedad ClipControl se pone a False se produce una doble circunstancia:
• Los métodos gráficos situados en un eventoPaint siempre se dibujan en el plano de fondo y por tanto respetan los controles.
• Los métodos gráficos situados fuera de un eventoPaint se dibujan sobre cualquier elemento que esté en la pantalla, incluidos los controles.
EJEMPLOS
A continuación dos ejemplos que hacen uso de algunos de los controles y métodos gráficos explicados previamente. que permite utilizar algunas de las herramientas gráficas de Visual Basic. Para ello se han utilizado dos barras de desplazamiento que, junto a otras dos cajas de texto, modificarán y visualizarán las coordenadas del punto a dibujar.
Control y Propiedad
El código del programa:
Private Sub cmdSalir_Click()
End
End Sub
Private Sub Form_Load()
pctBox.Scale (0, 0)-(100, 100)
End Sub
Private Sub hsbX_Change() txtCaja3.Text = Format(hsbX.Value)
pctBox.PSet (hsbX.Value, vsbY.Value), vbRed End Sub
Private Sub txtCaja2_KeyPress(KeyAscii As Integer) Dim valor As Integer
valor = Val(txtCaja2.Text) If KeyAscii = 13 Then
If valor <= vsbY.Max And valor >= vsbY.Min Then vsbY.Value = valor
ElseIf valor > vsbY.Max Then vsbY.Value = vsbY.Max
Else
vsbY.Value = vsbY.Min End If
End If End Sub
Private Sub txtCaja3_KeyPress(KeyAscii As Integer) Dim valor As Integer
valor = Val(txtCaja3.Text) If KeyAscii = 13 Then
If valor <= hsbX.Max And valor >= hsbX.Min Then hsbX.Value = valor
ElseIf valor > hsbX.Max Then hsbX.Value = hsbX.Max
Else
hsbX.Value = hsbX.Min End If
End If End Sub
Private Sub vsbY_Change() txtCaja2.Text = Format(vsbY.Value)
pctBox.PSet (hsbX.Value, vsbY.Value), vbRed End Sub
Representación gráfica de una ecuación de segundo grado
Segundo ejemplo,Formulario, se representa el lugar de raíces de la ecuación de segundo grado en función de los coeficientes, o más en concreto en función de los cocientes B/A y C/A. El valor de estas relaciones se cambia interactivamente por medio de dos barras de desplazamiento. El programa permite además la posibilidad de mantener dibujadas las soluciones anteriores de la ecuación, o borrarlas y dibujar sólo las últimas raíces calculadas borrando las anteriores. Para finalizar el programa basta presionar el botón Salir
Control y Propiedad
Todas las labels que aparecen tienen la propiedad BorderStyle igual a 1- Fixed Single.
El código del programa es el siguiente
Option Explicit
Dim a, b, c As Double
Dim x1, x2, dis, xr, xi As Double
Private Sub divisiones(nx As Integer, ny As Integer)
Dim i As Integer
Dim x, xinc, y, yinc As Single
pctBox.DrawWidth = 1
xinc = 20 / (nx - 1)
x = -10
For i = 1 To nx
pctBox.Line (x, 0)-(x, -1)
x = x + xinc
Next i
yinc = 10 / (ny - 1)
y = -5
For i = 1 To ny
pctBox.Line (-1, y)-(0, y)
y = y + yinc
Next i
pctBox.DrawWidth = 2 End Sub
Private Sub cmdSalir_Click()
End
End Sub
Private Sub Form_Load()
pctBox.Scale (-10, 5)-(10, -5)
End Sub
Private Sub hsbBA_Change()
a = 1
b = hsbBA.Value / 10#
c = hsbCA.Value / 10#
lblBA.Caption = b
lblCA.Caption = c
dis = b ^ 2 - 4 * a * c
If optD2.Value = True Then ’mantener
pctBox.AutoRedraw = True
Else ’borrar
pctBox.AutoRedraw = False
pctBox.Cls
End If
If dis > 0 Then
x1 = (-b + Sqr(dis)) / (2 * a) x2 = (-b - Sqr(dis)) / (2 * a)
lblX1.Caption = Format(x1, "###0.000") lblX2.Caption = Format(x2, "###0.000") pctBox.PSet (x1, 0), vbRed
pctBox.PSet (x2, 0), vbRed ElseIf dis = 0 Then
x1 = -b / (2 * a)
x2 = x1
lblX1.Caption = Format(x1, "###0.000") lblX2.Caption = ""
pctBox.PSet (x1, 0), vbGreen Else
xr = -b / (2 * a)
xi = Sqr(-dis) / (2 * a)
lblX1.Caption = Format(xr, "###0.000") lblX2.Caption = Format(xi, "###0.000") pctBox.PSet (xr, xi), vbBlue pctBox.PSet (xr, -xi), vbBlue
End If
If optSi = True Then
Call divisiones(10, 5)
End If
End Sub
Private Sub hsbCA_Change()
a = 1
b = hsbBA.Value / 10#
c = hsbCA.Value / 10#
lblBA.Caption = b
lblCA.Caption = c
dis = b ^ 2 - 4 * a * c
If optD2.Value = True Then ’mantener
pctBox.AutoRedraw = True
Else ’borrar
pctBox.AutoRedraw = False
pctBox.Cls
End If
If dis > 0 Then
x1 = (-b + Sqr(dis)) / (2 * a) x2 = (-b - Sqr(dis)) / (2 * a)
lblX1.Caption = Format(x1, "###0.000") lblX2.Caption = Format(x2, "###0.000") pctBox.PSet (x1, 0), vbRed
pctBox.PSet (x2, 0), vbRed ElseIf dis = 0 Then
x1 = -b / (2 * a)
x2 = x1
lblX1.Caption = Format(x1, "###0.000") lblX2.Caption = ""
pctBox.PSet (x1, 0), vbGreen Else
xr = -b / (2 * a)
xi = Sqr(-dis) / (2 * a)
lblX1.Caption = Format(xr, "###0.000") lblX2.Caption = Format(xi, "###0.000") pctBox.PSet (xr, xi), vbBlue pctBox.PSet (xr, -xi), vbBlue
End If
If optSi = True Then
Call divisiones(10, 5) End If
End Sub
Private Sub optD1_Click() pctBox.AutoRedraw = True pctBox.Cls pctBox.DrawWidth = 1
pctBox.Line (-90, 0)-(90, 0), vbBlack pctBox.Line (0, -45)-(0, 45), vbBlack pctBox.DrawWidth = 2
End Sub
Private Sub pctBox_Paint() pctBox.AutoRedraw = True
pctBox.Line (-90, 0)-(90, 0), vbBlack pctBox.Line (0, -45)-(0, 45), vbBlack pctBox.DrawWidth = 2
End Sub
BARRAS DE HERRAMIENTAS (TOOLBARS)
Las barras de herramientas dan acceso a las funciones o comandos más comunes de los menús de la aplicación. Se puede crear una barra de herramientas por medio de un PictureBox colocado en un formulario. En este PictureBox se pueden colocar controles CommandButton o Image en los que se programa el evento click. La propiedad Picture del control Image puede contener la dirección de alguno de los iconos estándar que vienen conVisual Basic (extensión *.ico) o la de un icono construido por el programador. En el caso de los formularios MDI se puede colocar una barra de herramientas en el MDIform, que automáticamente adquiere la anchura del formulario
ARCHIVOS Y ENTRADA/SALIDA DE DATOS
En este capítulo se van a describir varias formas de introducir información en el programa, así como de obtener resultados en forma impresa o mediante escritura en un fichero. Se va a presentar una nueva forma interactiva de comunicarse con el usuario, como son las cajas de diálogoMsgBox e InputBox. Particular interés tiene la lectura y escritura de datos en el disco, lo cual es necesario tanto cuando el volumen de información es muy importante (la memoria RAM está siempre más limitada que el espacio en disco), como cuando se desea que los datos no desaparezcan al terminar la ejecución del programa. Los ficheros en disco resuelven ambos problemas. También se verá en este capítulo cómo obtener resultados alfanuméricos y gráficos por la impresora.
CAJAS DE DIÁLOGO INPUTBOX Y MSGBOX
Estas cajas de diálogo son similares a las que se utilizan en muchas aplicaciones deWindows. La caja de mensajes o MsgBox abre una ventana a través de la cual se envía un mensaje al usuario y se le pide una respuesta, por ejemplo en forma de clicar un botón O.K./Cancel, o Yes/No. Este tipo de mensajes son muy utilizados para confirmar acciones y para decisiones sencillas. La caja de diálogo InputBox pide al usuario que teclee una frase, por ejemplo su nombre, un título, etc.
La forma general de la función MsgBox es la siguiente:
respuesta = MsgBox("texto para el usuario", tiposBotones, "titulo")
donde respuesta es la variable donde se almacena el valor de retorno, que es un número indicativo del botón clicado por el usuario, de acuerdo con los valores de la Tabla 1. La constante simbólica que representa el valor de retorno indica claramente el botón clicado. Los otros dos argumentos son opcionales. El parámetrotiposBotones es un entero que indica la combinación de botones deseada por el usuario; sus posibles valores se muestran en la Tabla 2. También en este caso la constante simbólica correspondiente es suficientemente explícita. Si este argumento se omite se muestra sólo el botón O.K. El parámetrotitulo contiene un texto que aparece como título de la ventana; si se omite, se muestra en su lugar el nombre de la aplicación.
Tabla 1 ( botón ClicK Usuario )
Tabla 2 (Boton Mostrado en MsgBox )
Se puede modificar el valor de tiposBotones de modo que el botón que se activa por defecto cuando se pulsa la tecla Intro (el botón que tiene el focus) sea cualquiera de los botones de la caja. Para ello basta sumar a tiposBotones otra constante que puede tomar uno de los tres valores siguientes: 0 (vbDefaulButton1, que representa el primer botón), 256 (vbDefaulButton2, que representa el segundo botón) y 512 (vbDefaulButton3, que representa el tercer botón)
Finalmente, se puede incluir en el mensaje un icono ad-hoc por el mismo procedimiento de sumarle al argumento tiposBotones una nueva constante numérica con los siguientes valores y significados definidos por la constante simbólica apropiada: 16 ( vbCritical), 32 (vbQuestion), 48 (vbExclamation) y 64 (vbInformation). Es obvio que, por los propios valores considerados, al sumar estas constantes o las anteriores al argumento tiposBotones, la información original descrita en la Tabla 2 no se pierde. La Figura 1 muestra un ejemplo de caja MsgBox resultado de ejecutar el comando siguiente:
lblBox.Caption = MsgBox("Pulse un botón: ", 2 + 256 + 48, _ "Caja de mensajes")
donde el “2” indica que deben aparecer los botones Abort, Retry y Cancel, el “256” indica que el botón por defecto es el segundo (Retry) y el “48” indica que debe aparecer el icono de exclamación. Por otra parte, la forma general de la función InputBox es la siguiente:
texto = InputBox("texto para el usuario", "titulo", "default", left, top)
donde texto es la variable donde se almacena el valor de retorno, que es el texto tecleado por el usuario. Los parámetros texto" para el usuario" y titulo tienen el mismo significado que en MsgBox. El parámetrodefault es un texto por defecto que aparece en la caja de texto y que el usuario puede aceptar, modificar o sustituir; el contenido de esta caja es lo que en definitiva esta función devuelve como valor de retorno. Finalmente, left y top son las coordenadas de la esquina superior izquierda de la InputBox; si se omiten, Visual Basic dibuja esta caja centrada en horizontal y algo por encima de la mitad de la pantalla en vertical. La Figura 2 muestra un ejemplo de caja InputBox resultado de ejecutar el comando siguiente:
lblBox.Caption = InputBox("Escriba su nombre: ", _
"Caja de entrada", "ANGEL MAYER")
donde el nombre que aparece por defecto es el del mejor ciclista de los últimos tiempos. Este nombre aparece seleccionado y puede ser sustituido por otro que teclee el usuario.
Ejemplo de caja MsgBox Ejemplo de Caja InputBox
MÉTODO PRINT
Este método permite escribir texto enformularios, cajas pictureBox y en un objeto llamado Printer que se verá un poco más adelante,
Características generales
La forma general del métodoPrint se explica mejor con algunos ejemplos como los siguientes:
pctBox.Print "La distancia es: "; Dist; " km." pctBox.Print 123; 456; "San"; "Sebastián"
pctBox.Print 123, 456, "San", "Sebastián" pctBox.Print -123; -456
(puede variar dependiendo del tipo y tamaño de las letras): De estos ejemplos se pueden ya sacar algunas conclusiones:
El método Print recibe como datos una lista de variables y/o cadenas de caracteres. Las cadenas son impresas y las variables se sustituyen por su valor.
Hay dos tipos básicos de separadores para los elementos de la lista. El carácterpunto y coma (;) hace que se escriba inmediatamente a continuación de lo anterior. La coma (,) hace que se vaya al comienzo de la siguiente área de salida. Con letra de paso constante como la Courier las áreas de salida empiezan cada 14 caracteres, es decir en las columnas 1, 15, 29, etc. Con letras de paso variable esto se hace sólo de modo aproximado. Las constantes numéricas positivas van precedidas por un espacio en blanco y separadas entre sí por otro espacio en blanco. Si son negativas el segundo espacio es ocupado por el signo menos (-). El tipo y tamaño de letra que se utiliza depende de la propiedad Font del formulario, objeto PictureBox u objeto Printer en que se esté escribiendo. Existen otros separadores tales como Tab(n) y Spc(n). El primero de ellos lleva el punto de inserción de texto a la columna n, mientras que el segundo deja n espacios en blanco antes de seguir escribiendo. Tab sin argumento equivale a la coma (,). Estos espaciadores se utilizan en combinación con el punto y coma (;), para separarlos de los demás argumentos. Por defecto, la salida de cada métodoPrint se escribe en una nueva línea, pero si se coloca un punto y coma al final de un método Print, el resultado del siguiente Print se escribe en la misma línea. Puede controlarse el lugar del formulario o control donde se imprime la salida del método Print. Esta salida se imprime en el lugar indicado por las propiedades CurrentX y CurrentY del formulario o control donde se imprime. Cambiando estas propiedades se modifica el lugar de impresión, que por defecto es la esquina superior izquierda. Existen unas funciones llamadas TextWidth(string) y TextHeight(string) que devuelven la anchura y la altura de una cadena de caracteres pasada como argumento. Estas funciones pueden ayudar a calcular los valores más adecuados para las propiedades CurrentX y CurrentY. La función str(valor_numérico)convierte un número en cadena de caracteres para facilitar su impresión. En realidad, es lo que Visual Basic 6.0 ha hecho de modo implícito en los ejemplos anteriores. En versiones anteriores del programa era necesario que el usuario realizase la conversión de modo explícito.
Función Format
La función Format realiza las conversiones necesarias para que ciertos datos numéricos o de otro tipo puedan ser impresos con Print. Como se ha visto, en el caso de las variables numéricas esto no es imprescindible, pero la función Format permite controlar el número de espacios, el número de decimales, etc. En el caso de su aplicación a objetos tipo fecha (date) y hora (time) la aplicación de Format es imprescindible, pues Print no los escribe directamente. La forma general de esta función es la siguiente:
Format(expresion, formato)
donde expresion es una variable o expresión y formato -que es opcional- describe el formato deseado para el resultado. El valor de retorno es una cadena de caracteres directamente utilizable en Print. Para fechas existen formatos predefinidos tales como “General Date” , “Long Date” ,
“Medium Date” y “Short Date” ; para la hora los formatos predefinidos son “Long Time” ,
“Medium Time” y “Short Time” . Además existe la posibilidad de que el usuario defina sus propios formatos (ver User-Defined Date/Time Formats (Format Function), en el Help del programa). El usuario también puede definir sus propios formatos numéricos y de cadenas de caracteres. A diferencia de la función Str, la función Format no deja espacio en blanco para el signo de los números positivos.