You are on page 1of 16

Guía práctica de estudio y

ejercicios tema 3:
Procedimientos, Funciones
y Formularios multiples

Elaborado por:
Ing. Eduardo Díaz
FUNCIONES, PROCEDIMIENTOS Y FORMULARIOS MULTIPLES EN VISUAL
BASIC
Conceptos generales sobre funciones

Las aplicaciones informáticas que habitualmente se utilizan, incluso a nivel de


informática personal, suelen contener decenas y aún cientos de miles de líneas de código
fuente. A medida que los programas se van desarrollando y aumentan de tamaño, se
convertirían rápidamente en sistemas poco manejables si no fuera por la modularización,
que es el proceso consistente en dividir un programa muy grande en una serie de módulos
mucho más pequeños y manejables. A estos módulos se les suele denominar de distintas
formas (subprogramas, subrutinas, procedimientos, funciones,
etc.) según los distintos lenguajes. Sea cual sea la nomenclatura, la idea es sin embargo
siempre la misma: dividir un programa grande en un conjunto de subprogramas o
funciones más pequeñas que son llamadas por el programa principal; éstas a su vez llaman
a otras funciones más específicas y así sucesivamente.

La división de un programa en unidades más pequeñas o funciones presenta –entre otras


las ventajas siguientes:

1. Modularización. Cada función tiene una misión muy concreta, de modo que nunca
tiene un número de líneas excesivo y siempre se mantiene dentro de un tamaño manejable.
Además, una misma función (por ejemplo, un producto de matrices, una resolución de un
sistema de ecuaciones lineales, ...) puede ser llamada muchas veces en un mismo
programa, e incluso puede ser reutilizada por otros programas. Cada función puede ser
desarrollada y comprobada por separado.
2. Ahorro de memoria y tiempo de desarrollo. En la medida en que una misma función es
utilizada muchas veces, el número total de líneas de código del programa disminuye, y
también lo hace la probabilidad de introducir errores en el programa.
3. Independencia de datos y ocultamiento de información. Una de las fuentes más
comunes de errores en los programas de computador son los efectos colaterales o
perturbaciones que se pueden producir entre distintas partes del programa. Es muy
frecuente que al hacer una modificación para añadir una funcionalidad o corregir un error,
se introduzcan nuevos errores en partes del programa que antes funcionaban
correctamente. Una función es capaz de mantener una gran independencia con el resto
del programa, manteniendo sus propios datos y definiendo muy claramente la interfaz o
comunicación con la función que la ha llamado y con las funciones a las que llama, y no
teniendo ninguna posibilidad de acceso a la información que no le compete.

Funciones y procedimientos Sub en Visual Basic 6.0

En Visual Basic 6.0 se distingue entre funciones y procedimientos Sub. En ocasiones se


utiliza la palabra genérica procedimiento para ambos. La fundamental diferencia entre un
procedimiento Sub y una función es que ésta última puede ser utilizada en una expresión
porque tiene un valor de retorno. El valor de retorno ocupa el lugar de la llamada a la
función donde esta aparece. Por ejemplo, si en una expresión aparece sin(x) se calcula el
seno de la variable x y el resultado es el valor de retorno que sustituye a sin(x) en la
expresión en la que aparecía. Por tanto, las funciones devuelven valores, a diferencia de
los procedimientos que no devuelven ningún valor, y por tanto no pueden ser utilizadas
en expresiones. Un procedimiento Sub es un segmento de código independiente del resto,
que una vez llamado por el programa, ejecuta un número determinado de ESIISS:
Aprenda Visual Basic 6.0 como si estuviera en Primero página 38 instrucciones, sin
necesidad de devolver ningún valor al mismo (puede dar resultados modificando los
argumentos), mientras que una función siempre tendrá un valor de retorno.

Los nombres de los procedimientos tienen reglas de visibilidad parecidas a las de las
variables. Para llamar desde un formulario a un procedimiento Public definido en otro
formulario es necesario preceder su nombre por el del formulario en que está definido.
Sin embargo, si se desea llamar a un procedimiento definido en un módulo estándar
(*.bas) no es necesario precederlo del nombre del módulo más que si hay coincidencia de
nombre con otro procedimiento de otro módulo estándar.

Funciones (function)

La sintaxis correspondiente a una función es la siguiente:


[Static] [Private] Function nombre ([parámetros]) [As tipo]
[sentencias]
[nombre = expresion]
[Exit Function]
[sentencias]
[nombre = expresion]
End Function

Donde nombre es el nombre de la función. Será de un tipo u otro dependiendo del dato
que devuelva. Para especificar el tipo se utiliza la cláusula As Tipo (Integer, Long, Single,
Double, Currency, String o Variant). parámetros son los argumentos que son pasados
cuando se llama a la función. Visual Basic asigna el valor de cada argumento en la
llamada al parámetro que ocupa su misma posición. Si no se indica un tipo determinado
los argumentos son Variant por defecto. Como se verá en un apartado posterior, los
argumentos pueden ser pasados por referencia o por valor.

El nombre de la función, que es el valor de retorno, actúa como una variable dentro del
cuerpo de la función. El valor de la variable expresion es almacenado en el propio nombre
de la función. Si no se efectúa esta asignación, el resultado devuelto será 0 si la función
es numérica, nulo ("") si la función es de caracteres, o Empty si la función es Variant.

Exit Function permite salir de una función antes de que ésta finalice y devolver así el
control del programa a la sentencia inmediatamente a continuación de la que efectuó la
llamada a la función.

La sentencia End Function marca el final del código de la función y, al igual que la Exit
Function, devuelve el control del programa a la sentencia siguiente a la que efectuó la
llamada, pero lógicamente una vez finalizada la función.

La llamada a una función se hace de diversas formas. Por ejemplo, una de las más usuales
es la siguiente:

variable = nombre([argumentos])
donde argumentos son un lista de constantes, variables o expresiones separadas por comas
que son pasadas a la función. En principio, el número de argumentos debe ser igual al
número de parámetros de la función. Los tipos de los argumentos deben coincidir con los
tipos de sus correspondientes parámetros, de lo contrario puede haber fallos importantes
en la ejecución del programa. Esta regla no rige si los argumentos se pasan por valor
(concepto que se verá más adelante).

En cada llamada a una función hay que incluir los paréntesis, aunque ésta no tenga
argumentos.

Procedimientos Sub

La sintaxis que define un procedimiento Sub es la siguiente:

[Static] [Private] Sub nombre [(parámetros)]


[sentencias]
[Exit Sub]
[sentencias]
End Sub

La explicación es análoga a la dada para funciones.

La llamada a un procedimiento Sub puede ser de alguna de las dos formas siguientes:
Call nombre[(argumentos)] o bien, sin pasar los argumentos entre paréntesis, sino
poniéndolos a continuación del nombre simplemente separados por comas: nombre
[argumentos]

A diferencia de una función, un procedimiento Sub no puede ser utilizado en una


expresión pues no devuelve ningún valor. Por supuesto una función puede ser llamada al
modo de un procedimiento Sub, pero en esta caso no se hace nada con el valor devuelto
por la función.

El siguiente ejemplo corresponde a un procedimiento Sub que devuelve una variable F


que es la raíz cuadrada de un número N.

Sub Raiz (N As Double, F As Double)


If N < 0 Then
Exit Sub 'Se mandaría un mensaje de error
Else
F = Sqr(N)
End If
End Sub
La llamada a este procedimiento Sub puede ser de cualquiera de las dos formas siguientes:
Raiz N, F
Call Raiz(N, F)
En el ejemplo anterior, el resultado obtenido al extraer la raíz cuadrada al número N se
devuelve en la variable F pasada como argumento, debido a que como se ha mencionado
anteriormente, un procedimiento Sub no puede ser utilizado en una expresión.

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

Eventos, Propiedades y Controles


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 eel 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

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.
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.

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.

CONTROLES V.S

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.

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.
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 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.

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 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
Clic 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).

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 Trae 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
lapantalla 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.

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.
-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). 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;

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.

MENUS

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 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.

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 combinan 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.

Ejercicios:
1.- Crea un programa que calcule el IVA de un producto. Tomando en cuenta si el monto
es mayor a 100 mil se cobrará un IVA del 21&, si el monto es mayor a 500 mil se cobrará
un IVA de 12%. El valor de este producto se pasará por teclado y nos mostrará el valor
final. Por ejemplo, si introducimos 100000 como valor de producto, el IVA es 21 y el
valor final es 112000 Bs.

2.- Realiza una función que nos indica si un número es múltiplo de otro. Pedimos los dos
números por teclado.
Esta función debe devolver un Booleano, donde verdadero significa que si es multiplo y
falso que no lo es.
Según este valor, que muestre por consola si es múltiplo o no.

3.- Crea una función que calcule el factorial de un número. Pide un número por teclado.
Para calcular el factorial, se multiplica los números anteriores hasta llegar a uno. Por
ejemplo, si introducimos un 5, realizara esta operación 5*4*3*2*1=120.

4.- Realice una funciónque calcule el sueldo de un trabajador semanal, sabiendo que traba
de lunes a viernes 8 horas diarias, introduzca por teclado la cantidad de horas y el costo
de las mismas, si trabajas más horas se consideran extras, las cuales se la pagaran de
acuerdo a lo siguiente: si trabaja hasta 5 horas se la pagaran al doble del costo normal,
pero si trabajas mas de 5 horas solamente esas se la pagaría al triple del costo de las horas
normales. Ejemplo: Si trabaja 40 horas, se calcula el sueldo normal Si trabajas 44 horas
solo 4 horas se la pagaran al doble y las otras 40 se la pagaran normal, Si trabaja 48 horas,
las primeras 40 se la pagaran normal, las 5 se la pagarán al doble y las otras 3 al triple.
5.- Realice una función que dados 3 números distintos verifique cual es el mayor, el medio
y el menor, deben de verificar que sean distintos.

You might also like