30.04.2013 Views

1. Visual Basic - Curso completo teoria y practica

1. Visual Basic - Curso completo teoria y practica

1. Visual Basic - Curso completo teoria y practica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CAPÍTULO 1<br />

FUNDAMENTOS<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> es un conjunto de herramientas que<br />

posibilitan el desarrollo de aplicaciones para Windows de una<br />

manera rápida y sencilla, basado en el lenguaje BASIC y en la<br />

programación orientada a objetos.<br />

La palabra “<strong>Visual</strong>” hace referencia al método que se<br />

utiliza para crear la interfaz gráfica de usuario. En lugar de<br />

escribir numerosas líneas de código para implementar la<br />

interfaz, simplemente se utiliza el ratón para agregar objetos<br />

prefabricados en el lugar deseado dentro de la pantalla.<br />

La palabra “<strong>Basic</strong>” hace referencia al lenguaje BASIC<br />

(Beginners All-Purpose Symbolic Instruction Code), un lenguaje<br />

utilizado por más programadores que ningún otro lenguaje en la<br />

historia de la informática. <strong>Visual</strong> <strong>Basic</strong> ha evolucionado a<br />

partir del lenguaje BASIC original y ahora contiene centenares<br />

de instrucciones, funciones y palabras clave, muchas de las<br />

cuales están directamente relacionadas con la interfaz gráfica<br />

de Windows.<br />

El lenguaje de programación <strong>Visual</strong> <strong>Basic</strong> no es exclusivo<br />

de Microsoft <strong>Visual</strong> <strong>Basic</strong>. Este lenguaje es utilizado también<br />

por Microsoft Excel, Microsoft Access y muchas otras<br />

Pág. 1


aplicaciones Windows. El lenguaje de programación <strong>Visual</strong> <strong>Basic</strong><br />

Script para programar en Internet es un subconjunto del<br />

lenguaje <strong>Visual</strong> <strong>Basic</strong>. De tal forma, que la inversión realizada<br />

en el aprendizaje de <strong>Visual</strong> <strong>Basic</strong> le ayudará a abarcar estas<br />

otras áreas.<br />

EJECUTANDO VISUAL BASIC<br />

Si ya tiene instalado <strong>Visual</strong> <strong>Basic</strong>, para ejecutarlo<br />

proceda igual que con cualquier otra aplicación Windows: hacer<br />

click en el icono correspondiente.<br />

En seguida se presentará una ventana similar a la figura<br />

siguiente:<br />

Pág. 2


En la ventana anterior indicar el tipo de proyecto que<br />

desea crear (para nuestro caso seleccionar EXE estándar) y dar<br />

click sobre el botón “Abrir”. En ese instante se presentará el<br />

Entorno Integrado de Desarrollo (IDE) de <strong>Visual</strong> <strong>Basic</strong>:<br />

Los elementos que componen el IDE de <strong>Visual</strong> <strong>Basic</strong> son:<br />

• Barra de menús • Barra de herramientas<br />

• Cuadro de herramientas • Diseñador de formularios<br />

• Explorador de proyectos • Ventana de propiedades<br />

• Posición del formulario • Menús contextuales<br />

Barra de menús<br />

Pág. 3


Presenta las órdenes que se utilizan para desarrollar una<br />

aplicación. Las opciones más utilizadas son: Archivo, Edición,<br />

Ver, Ventana y Ayuda. Se proporcionan otros menús para tener<br />

acceso a funciones específicas de programación como Proyecto,<br />

Formato o Depuración.<br />

Barra de herramientas<br />

Facilita el acceso rápido a las órdenes más comúnmente<br />

utilizadas. Omitimos el significado de cada botón porque le<br />

será mostrado al pasar el puntero del ratón sobre cada uno de<br />

ellos.<br />

Puede visualizar otras barras de herramientas ejecutando<br />

la opción Barra de herramientas del Menú Ver.<br />

Cuadro de herramientas<br />

Proporciona un conjunto de herramientas que permiten<br />

diseñar la interfaz gráfica de usuario.<br />

Pág. 4


Icono Descripción<br />

Puntero<br />

Cuadro de imagen<br />

Etiqueta<br />

Cuadro de texto<br />

Marco<br />

Botón de comando<br />

Casilla de verificación<br />

Botón de opción<br />

Cuadro combinado<br />

Cuadro de lista<br />

Barra de desplazamiento horizontal<br />

Barra de desplazamiento vertical<br />

Cronómetro<br />

Cuadro de lista de unidades<br />

Cuadro de lista de directorios<br />

Cuadro de lista de archivos<br />

Formas<br />

Líneas<br />

Imagen<br />

Contenedor OLE<br />

Pág. 5


Para utilizar algún objeto simplemente debe hacer doble<br />

click sobre el icono correspondiente, luego puede cambiar su<br />

posición y sus dimensiones.<br />

Diseñador de formularios<br />

Es la ventana sobre la que colocaremos los objetos<br />

(controles) de la interfaz de usuario.<br />

Explorador de proyectos<br />

Contiene el conjunto de archivos que constituyen la<br />

aplicación o proyecto.<br />

Pág. 6


Ventana de propiedades<br />

Como veremos más adelante, cada objeto lleva asociado un<br />

conjunto de propiedades. Para ver o especificar los valores de<br />

las propiedades de los objetos, utilizaremos la ventana de<br />

propiedades.<br />

Posición del formulario<br />

Esta ventana le permite especificar la posición de los<br />

formularios de la aplicación.<br />

Menús contextuales<br />

Pág. 7


Es un menú emergente que presenta órdenes específicas<br />

relativas a un determinado objeto. Para abrir un menú<br />

contextual, dar click derecho sobre el objeto. Por ejemplo, al<br />

dar click derecho sobre el formulario se presenta el siguiente<br />

menú contextual.<br />

Ventana de código<br />

Se presenta cuando se hace doble click sobre un objeto que<br />

se encuentra en el Diseñador de formularios. Esta ventana<br />

muestra dos cuadros combinados (combos) en la parte superior,<br />

en una aparece el nombre del objeto (izquierda) y en la otra el<br />

nombre del evento (derecha).<br />

Pág. 8


MI PRIMERA APLICACIÓN<br />

Hay tres pasos principales para crear una aplicación en<br />

<strong>Visual</strong> <strong>Basic</strong>:<br />

• Crear la interfaz.<br />

• Establecer propiedades.<br />

• Escribir el código.<br />

Para ver como se realiza esto, siga los pasos del<br />

siguiente ejemplo para crear una aplicación sencilla que<br />

consiste en un formulario y un botón de comando. Cuando haga<br />

click en el botón de comando aparecerá el mensaje “<strong>Visual</strong> <strong>Basic</strong><br />

es fácil” en un cuadro de diálogo predefinido.<br />

Creación de la interfaz<br />

Para el desarrollo del presente ejemplo proceda a crear<br />

una nueva aplicación. En seguida añadir un botón de comando al<br />

formulario, para ello en el Cuadro de herramientas, dar doble<br />

click sobre el control deseado, tal como se indica en la figura<br />

siguiente:<br />

Pág. 9


mostrada:<br />

La apariencia de la interfaz debe ser similar a la figura<br />

Estableciendo las propiedades<br />

Para ver las propiedades de un objeto, simplemente debe<br />

seleccionarlo y pulsar la tecla F4. Por ejemplo la figura<br />

siguiente muestra las propiedades del botón de comando y<br />

podemos ver que la propiedad Caption tiene el valor “Command1”.<br />

Pág. 10


Puede cambiar el valor de cualquier propiedad<br />

seleccionándolo de la ventana anterior y simplemente<br />

modificando su valor, por ejemplo para el caso anterior<br />

establezca el valor de la propiedad Caption de “Command1” a<br />

“Haga click aquí”.<br />

De manera similar proceda cambiar la propiedad Caption del<br />

formulario a “Mi primera aplicación”. La apariencia de la<br />

interfaz debe ser similar a la figura mostrada:<br />

Pág. 11


Escribiendo el código<br />

Para ingresar el código a la aplicación debe dar doble<br />

click sobre el control al cual asociaremos dicho código. Para<br />

nuestro caso dar doble click sobre el botón de comando e<br />

ingresar el código que se indica a continuación:<br />

Para guardar la aplicación que acaba de crear, seleccione<br />

la opción Guardar Proyecto del Menú Archivo.<br />

Bueno, ahora sólo falta que ejecute su aplicación. Para<br />

ello simplemente debe pulsar la tecla F5. El resultado debe ser<br />

similar al siguiente:<br />

Pág. 12


CAPÍTULO 2<br />

LOS OBJETOS<br />

<strong>Visual</strong> <strong>Basic</strong> se basa en la programación orientada a<br />

objetos (POO), la cual es una forma de programación que utiliza<br />

objetos (similares a los objetos del mundo real) para la<br />

solución de problemas. La POO permite descomponer un problema<br />

en bloques relacionados. Cada bloque pasa a ser un objeto<br />

autocontenido que contiene sus propios datos e instrucciones.<br />

De esta manera, la complejidad se reduce y se pueden realizar<br />

programas más largos de una manera sencilla.<br />

MECANISMOS BÁSICOS DE LA POO<br />

Los mecanismos básicos de la programación orientada a<br />

objetos son:<br />

• Objetos<br />

• Propiedades<br />

• Métodos<br />

• Eventos<br />

• Mensajes<br />

• Clases<br />

Pág. 13


Objetos<br />

Un objeto es una entidad que tiene atributos particulares<br />

(propiedades) y unas formas de operar sobre ellos (métodos).<br />

Por tanto, un objeto contiene variables que especifican su<br />

estado y operaciones que definen su comportamiento.<br />

Son ejemplos de objetos: formularios, botones de comando,<br />

cuadros de texto, etiquetas, etc.<br />

Propiedades<br />

Las propiedades representan las características del<br />

objeto. Hay propiedades particulares, como Caption que la<br />

poseen los botones de comando por ejemplo, y genéricas como<br />

Name que la poseen todos lo objetos.<br />

Métodos<br />

Los métodos son procedimientos asociados a un objeto. Se<br />

ejecutan como respuesta a un evento, por ejemplo al dar click<br />

en un botón de comando. También pueden ser invocados<br />

explícitamente en el programa.<br />

Eventos<br />

Un evento es la capacidad de un objeto de reaccionar<br />

cuando ocurre una determinada acción (acción y reacción). Como<br />

respuesta a un evento se envía un mensaje y se ejecuta un<br />

determinado método (procedimiento).<br />

Pág. 14


Mensajes<br />

Un mensaje es una llamada a un método (procedimiento), de<br />

tal forma que cuando un objeto recibe un mensaje la respuesta a<br />

ese mensaje es ejecutar el procedimiento asociado.<br />

Cuando se ejecuta un programa orientado a objetos, los<br />

objetos están constantemente recibiendo, interpretando y<br />

respondiendo a mensajes de otros objetos.<br />

Clases<br />

Una clase es una descripción para producir objetos de esa<br />

clase o tipo. Es decir se trata de una generalización de un<br />

tipo específico de objetos. En otras palabras, un objeto es una<br />

variable del tipo definido por una clase. Por ejemplo, piense<br />

en un molde para hacer pasteles, el molde es la clase y los<br />

pasteles los objetos.<br />

CARACTERÍSTICAS DE LA POO<br />

Las características fundamentales de la programación<br />

orientada a objetos son:<br />

• Abstracción<br />

• Encapsulamiento<br />

• Herencia<br />

• Polimorfismo<br />

Pág. 15


Abstracción<br />

La abstracción permite no detenernos en los detalles<br />

concretos del funcionamiento de las cosas, sino centrarnos en<br />

los aspectos que realmente nos importan y nos son útiles en un<br />

determinado momento, en cierta medida, se podría decir que es<br />

“úsese el objeto y olvídese de como funciona en forma interna”.<br />

Por ejemplo, para manejar una computadora no necesitamos<br />

saber como funcionan sus circuitos electrónicos, en términos de<br />

corriente, tensión, etc.<br />

Encapsulamiento<br />

Esta característica permite ver un objeto como una “caja<br />

negra” autocontenida en la que se ha metido de alguna manera<br />

toda la información que maneja dicho objeto. Esto permite<br />

manipular los objetos como unidades básicas, permaneciendo<br />

oculta su estructura interna.<br />

Herencia<br />

La herencia es la característica que permite compartir<br />

automáticamente propiedades y métodos entre objetos. Es decir,<br />

se pueden crear nuevas clases de objetos en base a clases<br />

existentes. Más concreto, un objeto puede heredar un conjunto<br />

general de propiedades y métodos a las que puede añadir<br />

Pág. 16


aquellas características que son específicas suyas. El usuario<br />

de <strong>Visual</strong> <strong>Basic</strong> no dispone de esta característica.<br />

Polimorfismo<br />

Polimorfismo, del griego cuyo significado es “muchas<br />

formas”, es la característica que permite implementar múltiples<br />

formas de un mismo método, dependiendo cada una de ellas de la<br />

clase sobre la que se realiza la implementación. Esto hace<br />

posible que se puede acceder a una variedad de métodos<br />

distintos (todos con el mismo nombre) utilizando exactamente el<br />

mismo medio de acceso.<br />

LOS OBJETOS DE VISUAL BASIC<br />

<strong>Visual</strong> <strong>Basic</strong> soporta la abstracción, la encapsulación, el<br />

polimorfismo y la reutilización de código.<br />

La reutilización de código es la capacidad de trasladar<br />

características de un objeto a otro, lo que se logra con alguna<br />

forma de herencia. Esto se consigue mediante la creación y uso<br />

del objeto.<br />

Los objetos de <strong>Visual</strong> <strong>Basic</strong> están divididos en dos tipos:<br />

controles y contenedores.<br />

Los controles son un medio gráfico que permiten a los<br />

usuarios interactuar con la aplicación para la manipulación de<br />

datos y ejecución de tareas. Son ejemplo de controles:<br />

etiquetas, cuadros de texto, botones de comando, casillas de<br />

Pág. 17


verificación, botones de opción, cuadros de lista, cuadros<br />

combinados, etc.<br />

Los contenedores son objetos que pueden incluir otros<br />

objetos y permiten el acceso a los objetos que contienen. Entre<br />

los más utilizados tenemos a los formularios, marcos y<br />

cuadrículas.<br />

El formulario más los controles constituyen la interfaz de<br />

la aplicación.<br />

REFERENCIANDO OBJETOS<br />

La sintaxis para referenciar objetos es la siguiente:<br />

OBJETO.PROPIEDAD = VALOR<br />

Por ejemplo, para establecer el título de un formulario a<br />

“<strong>Visual</strong> <strong>Basic</strong> es fácil”, la orden sería:<br />

Form<strong>1.</strong>Caption = “<strong>Visual</strong> <strong>Basic</strong> es fácil”<br />

LOS EVENTOS<br />

Cada objeto responde a un conjunto de eventos. Como<br />

respuesta a un evento se ejecuta un determinado procedimiento.<br />

Los procedimientos asociados a un evento presentan la forma:<br />

Private Sub OBJETO_EVENTO()<br />

End Sub<br />

SENTENCIAS<br />

Pág. 18


Para aclarar este concepto desarrollaremos la siguiente<br />

aplicación, la cual consiste en un formulario, un cuadro de<br />

texto y un botón de comando. El usuario debe ingresar un<br />

mensaje en el cuadro de texto y al pulsar el botón de comando,<br />

el mensaje recientemente ingresado, se coloca como título del<br />

formulario.<br />

Para ello proceda a construir la interfaz mostrada en la<br />

figura anterior. Luego, dar doble click sobre el botón de<br />

comando e ingrese el siguiente código:<br />

Private Sub Command1_Click()<br />

End Sub<br />

Form<strong>1.</strong>Caption = Text<strong>1.</strong>Text<br />

Seguidamente guarde y proceda ejecutar su aplicación. Como<br />

puede verificar, el evento Click se dispara cada vez que el<br />

usuario pulsa (hace click) sobre un control.<br />

CONVENCIÓN DE NOMBRES PARA LOS OBJETOS<br />

Pág. 19


La convención a seguir en la presente guía - para dar<br />

nombre a los objetos - consiste en utilizar ciertos prefijos,<br />

los cuales indicaran el tipo de objeto del que se trata.<br />

Prefijo Objeto<br />

Frm Formulario<br />

Fra Marco<br />

Lbl Etiqueta<br />

Txt Cuadro de texto<br />

Cmd Botón de comando<br />

Chk Casilla de verificación<br />

Opt Botón de opción<br />

Lst Cuadro de lista<br />

Cbo Cuadro combinado<br />

Tim Cronómetro<br />

HS Barra de desplazamiento horizontal<br />

VS Barra de desplazamiento vertical<br />

Pic Cuadro de imagen<br />

Img Imagen<br />

Drv Cuadro de lista de unidades<br />

Dir Cuadro de lista de directorios<br />

Fil Cuadro de lista de archivos<br />

Ole Contenedor OLE<br />

Grd Cuadrícula<br />

Pág. 20


Gra Gráfico<br />

Ctr Control (se utiliza en procedimientos cuando<br />

el tipo de control es desconocido)<br />

CAPÍTULO 3<br />

EL LENGUAJE<br />

<strong>Visual</strong> <strong>Basic</strong> es un lenguaje de programación basado en el<br />

lenguaje BASIC, al cual incorpora la funcionalidad de la<br />

programación orientada a objetos.<br />

El código de <strong>Visual</strong> <strong>Basic</strong> se almacena en módulos, donde<br />

cada módulo está subdividido en distintas secciones, una para<br />

cada objeto del módulo. Cada sección de código puede contener<br />

uno o más procedimientos, formados por declaraciones de<br />

constantes y variables, expresiones, sentencias de control y<br />

llamadas a procedimientos y/o funciones.<br />

En este capítulo vamos a analizar los diferentes elementos<br />

que intervienen al momento de realizar el código para una<br />

aplicación.<br />

TIPOS DE DATOS<br />

Los datos con los que trabajaremos probablemente incluyan<br />

información relacionada con números, dinero, nombres,<br />

Pág. 21


descripciones, fechas, etc. Cada dato corresponde a un<br />

determinado tipo, es decir, pertenece a una categoría de datos<br />

que se manipulan de maneras similares.<br />

Tipo Descripción Rango<br />

Integer Entero (2 bytes) -32768 a 32767<br />

Long Entero largo (4 bytes) -2147483648 a<br />

Single Punto flotante de simple<br />

precisión (4 bytes)<br />

Double Punto flotante de doble<br />

precisión (8 bytes)<br />

Currency Monetario (8 bytes) +/-<br />

2147483647<br />

-3.40E+38 a<br />

3.40E+38<br />

-<strong>1.</strong>79D+308 a<br />

<strong>1.</strong>79D+308<br />

Byte Carácter (1 byte) 0 a 255<br />

String Cadena de caracteres (1<br />

byte por carácter)<br />

922337203685477.5807<br />

Aproximadamente<br />

hasta 64K (65400<br />

caracteres)<br />

Boolean Lógico (2 bytes) True o False<br />

Date Fecha/Hora (8 bytes) 01/ENERO/100 a<br />

Variant<br />

(por omisión)<br />

31/DICIEMBRE/9999<br />

Cualquier tipo de dato Con números hasta el<br />

intervalo de un tipo<br />

Double.<br />

Con caracteres 22<br />

Pág. 22


IDENTIFICADORES<br />

bytes + 1 byte por<br />

carácter<br />

Los identificadores son nombres dados a los elementos de<br />

una aplicación, tales como constantes, variables,<br />

procedimientos, funciones, objetos, etc. Un identificador es<br />

una secuencia de caracteres que puede ser de hasta 255<br />

caracteres. Para la construcción de identificadores debemos<br />

tener presente las siguientes reglas:<br />

• Deben comenzar con una letra y no puede contener espacios en<br />

blanco.<br />

• Letras, dígitos y caracteres subrayados están permitidos<br />

después del primer carácter.<br />

• No se puede utilizar una palabra reservada como<br />

identificador. Una palabra reservada tiene un significado<br />

especial para <strong>Visual</strong> <strong>Basic</strong>.<br />

CONSTANTES<br />

Una constante almacena un dato cuyo valor no cambia<br />

durante la ejecución de un programa. Para declarar una<br />

constante utilice la siguiente sintaxis:<br />

Const NOMBRE_CONSTANTE [As TIPO] = VALOR<br />

Pág. 23


Si no se declara el tipo de constante (utilizando As TIPO)<br />

se asigna a la constante el tipo de dato más apropiado a su<br />

valor.<br />

El valor de una constante puede ser numérico,<br />

alfanumérico, carácter o de tipo fecha y hora. Por ejemplo:<br />

VARIABLES<br />

Const MAXIT = 25<br />

Const PI As Double = 3.141592<br />

Const CADENA As String = “<strong>Visual</strong> <strong>Basic</strong> es fácil”<br />

Const FECHA_POR_DEFECTO = #01/01/99#<br />

Una variable almacena un dato cuyo valor puede cambiar<br />

durante la ejecución de un programa. Para declarar una variable<br />

utilice la siguiente sintaxis:<br />

Dim NOMBRE_VARIABLE [As TIPO]<br />

Cuando se declara una variable y no se especifica su tipo<br />

(con As TIPO), se asume que es de tipo Variant.<br />

La instrucción Dim puede realizar más de una declaración,<br />

teniendo en cuenta que la cláusula opcional As TIPO le permite<br />

definir el tipo de dato de cada variable que vaya a declarar.<br />

Por ejemplo:<br />

Dim X, Y As Integer<br />

Pág. 24


La sentencia anterior le puede inducir a pensar que X e Y<br />

son de tipo Integer, lo cual no es cierto, pues X es de tipo<br />

Variant (por omisión) e Y es de tipo Integer.<br />

sintaxis:<br />

Para asignar valores a una variable, utilizar la siguiente<br />

NOMBRE_VARIABLE = VALOR<br />

A manera de ejemplo considere lo siguiente:<br />

Dim CANTIDAD As Integer, PRECIO As Double, TOTAL As Double<br />

CANTIDAD = 30<br />

PRECIO = <strong>1.</strong>5<br />

TOTAL = CANTIDAD * PRECIO<br />

OPERADORES<br />

Los operadores son símbolos que indican cómo serán<br />

manipulados los operandos. Los operandos son los datos<br />

(constantes y/o variables) sobre los que actúa los operadores<br />

para producir un determinado resultado.<br />

Operadores aritméticos<br />

Operador Significado<br />

^ Exponenciación<br />

- Menos unario<br />

Pág. 25


* / Multiplicación y división<br />

\ División entera<br />

Mod Resto de una división entera<br />

+ - Suma y resta<br />

Operadores relacionales<br />

Operador Significado<br />

= Igual que<br />

<br />

<<br />

><br />

<br />

Diferente que<br />

Menor que<br />

Mayor que<br />

Operadores lógicos<br />

Menor o igual que<br />

Mayor o igual que<br />

Operador Significado<br />

Not Negación<br />

And Conjunción<br />

Or Disyunción inclusiva<br />

Xor Disyunción exclusiva<br />

Eqv Equivalencia (opuesto a Xor)<br />

Imp Implicación (falso si primer operando<br />

verdadero y segundo operando falso)<br />

Pág. 26


Operadores de cadenas de caracteres<br />

Operador Significado<br />

&<br />

Concatenación<br />

Like Compara dos cadenas de caracteres<br />

SENTENCIAS<br />

Una sentencia es una línea de código que indica una o más<br />

operaciones a realizar. Una línea puede incluir varias<br />

sentencias, separadas unas de otras por dos puntos. Por<br />

ejemplo:<br />

Dim CANTIDAD As Integer, PRECIO As Double, TOTAL As Double<br />

CANTIDAD = 30 : PRECIO = <strong>1.</strong>5 : TOTAL = CANTIDAD * PRECIO<br />

Una sentencia <strong>Visual</strong> <strong>Basic</strong> puede escribirse en más de una<br />

línea física utilizando el carácter de continuación de línea<br />

(un espacio en blanco seguido del carácter de subrayado). Por<br />

ejemplo:<br />

Dim CH4_ENTRADA As Double, CH4_SALIDA As Double, _<br />

CH4_GENERA As Double, CH4_CONSUME AS Double<br />

ENTRADA Y SALIDA DE DATOS<br />

<strong>Visual</strong> <strong>Basic</strong> posee una serie de objetos (controles) que<br />

pueden ser utilizados como mecanismos de entrada y salida (E/S)<br />

de datos. Sin embargo, estos serán estudiados en capítulos<br />

posteriores.<br />

Pág. 27


Otra posibilidad de proporcionar datos o de visualizarlos<br />

durante la ejecución de una aplicación es utilizando cajas de<br />

diálogos predefinidas. Debido a que esta es la forma más simple<br />

de realizar la E/S de datos nos ocuparemos de ella.<br />

Entrada de datos<br />

La entrada de datos permite proporcionar valores durante<br />

la ejecución de una aplicación. Estos valores son ingresados<br />

generalmente mediante el teclado y asignados a variables del<br />

programa. En <strong>Visual</strong> <strong>Basic</strong> una forma de ingresar datos a la<br />

aplicación es utilizando la caja de diálogo predefinida<br />

provista por la función InputBox. Su sintaxis es la siguiente:<br />

VARIABLE = InputBox(MENSAJE [, TÍTULO] [, PREDETERMINADO])<br />

Donde MENSAJE es el mensaje que indica al usuario el tipo<br />

de información que debe ingresar. Por ejemplo, las sentencias:<br />

Dim EDAD As Integer<br />

EDAD = InputBox(“Ingrese su edad?”)<br />

Da lugar a que <strong>Visual</strong> <strong>Basic</strong> presente la siguiente caja de<br />

diálogo solicitando la información requerida:<br />

Pág. 28


Como puede observar, el resto de los parámetros son<br />

opcionales. TÍTULO es el texto que se muestra en la barra de<br />

título del cuadro de diálogo, si se omite TÍTULO, el nombre de<br />

la aplicación es la que se muestra en la barra de título.<br />

PREDETERMINADO es una expresión de cadena que aparece en el<br />

cuadro de texto como respuesta predeterminada si no se<br />

proporciona ningún otro texto. Si se omite PREDETERMINADO el<br />

cuadro de texto se muestra vacío. A manera de ejemplo considere<br />

lo siguiente:<br />

Dim EDAD As Integer<br />

EDAD = InputBox(“Ingrese su edad?”, “Ficha de datos”, 18)<br />

En este caso se visualiza la caja de diálogo que se<br />

presenta en la figura siguiente:<br />

Pág. 29


Salida de datos<br />

La salida de datos generalmente consiste en tomar la<br />

información de la memoria y mostrarla en pantalla. Para<br />

realizar la operación de salida de datos en <strong>Visual</strong> <strong>Basic</strong>,<br />

podemos utilizar el procedimiento MsgBox, cuya sintaxis es como<br />

sigue:<br />

MsgBox MENSAJE [, ICONO, TÍTULO]<br />

MENSAJE es La cadena que se muestra como salida en la caja<br />

de diálogo. ICONO es se refiere al estilo de icono que se va ha<br />

utilizar y TÍTULO es una texto que se mostrará en la barra de<br />

título de la caja de diálogo. Por ejemplo:<br />

Dim EDAD As Integer<br />

EDAD = InputBox(“Ingrese su edad?”)<br />

EDAD = EDAD + 10<br />

MsgBox “Dentro de 10 años su edad será:” & Str(EDAD)<br />

Si ejecuta el código anterior e ingresa su edad (en mi<br />

caso 29 años) la salida debe ser similar a la figura siguiente:<br />

Pág. 30


Para que pueda ejecutar el código anterior, proceda a<br />

crear una nueva aplicación y haga doble click sobre el<br />

formulario, luego ingrese el código anterior:<br />

Private Sub Form_Load()<br />

Dim EDAD As Integer<br />

EDAD = InputBox(“Ingrese su edad?”)<br />

EDAD = EDAD + 10<br />

MsgBox “Dentro de 10 años su edad será:” & Str(EDAD)<br />

End Sub<br />

A manera de observación cabe señalar que la función Str()<br />

se utiliza para convertir una expresión numérica a una cadena<br />

de caracteres.<br />

ESTRUCTURAS DE CONTROL<br />

Las estructuras de control permiten tomar decisiones y<br />

realizar un proceso repetidas veces (procesos iterativos). Para<br />

ello <strong>Visual</strong> <strong>Basic</strong> dispone de las siguientes estructuras de<br />

control: If . . . Then . . . Else, If . . . Then . . . ElseIf,<br />

Select Case, For . . . Next, While . . . . Wend, Do . . . Loop<br />

y GoTo.<br />

Estructura If . . . Then . . . Else<br />

Este tipo de estructura evalúa una determinada condición y<br />

en función a ello ejecuta uno de entre dos posibles grupos de<br />

sentencias. Su sintaxis es la siguiente:<br />

Pág. 31


If CONDICIÓN Then<br />

Else<br />

End If<br />

SENTENCIAS_VERDADERAS<br />

SENTENCIAS_FALSAS<br />

Si CONDICIÓN es verdadera se ejecuta el grupo de<br />

SENTENCIAS_VERDADERAS. Si CONDICIÓN es falsa se ejecuta el<br />

grupo de SENTENCIAS_FALSAS.<br />

Por ejemplo, el siguiente código determina si un entero A<br />

es o no divisible por otro entero B:<br />

Dim A As Integer, B As Integer<br />

A = InputBox(“Ingrese A?”)<br />

B = InputBox(“Ingrese B?”)<br />

If A Mod B = 0 Then<br />

Else<br />

End If<br />

MsgBox Str(A) & “ es divisible por ” & Str(B)<br />

MsgBox Str(A) & “ no es divisible por ” & Str(B)<br />

Estructura If . . . Then . . . ElseIf<br />

Este tipo de estructura se utiliza para elegir una de<br />

entre múltiples alternativas. Su sintaxis es como sigue:<br />

If CONDICIÓN_1 Then<br />

Pág. 32


SENTENCIAS_1<br />

ElseIf CONDICIÓN_2 Then<br />

Else<br />

SENTENCIAS_2<br />

.<br />

.<br />

.<br />

SENTENCIAS_FALSAS<br />

End If<br />

Si CONDICIÓN_1 es verdadera se ejecuta el grupo de<br />

SENTENCIAS_1, y si es no se cumple, se evalúan secuencialmente<br />

las condiciones siguientes hasta Else, ejecutándose las<br />

sentencias correspondientes al primer ElseIf cuya condición sea<br />

verdadera. Si todas las condiciones son falsas, se ejecutan las<br />

SENTENCIAS_FALSAS correspondientes a Else.<br />

Por ejemplo considere el siguiente código, el cual imprime<br />

el nombre del mes correspondiente a los números del 1 al 12.<br />

Dim N As Integer<br />

N = InputBox(“Ingrese N?”)<br />

If N = 1 Then<br />

MsgBox “Enero”<br />

ElseIf N = 2 Then : MsgBox “Febrero”<br />

ElseIf N = 3 Then : MsgBox “Marzo”<br />

ElseIf N = 4 Then : MsgBox “Abril”<br />

ElseIf N = 5 Then : MsgBox “Mayo”<br />

Pág. 33


ElseIf N = 6 Then : MsgBox “Junio”<br />

ElseIf N = 7 Then : MsgBox “Julio”<br />

ElseIf N = 8 Then : MsgBox “Agosto”<br />

ElseIf N = 9 Then : MsgBox “Setiembre”<br />

ElseIf N = 10 Then : MsgBox “Octubre”<br />

ElseIf N = 11 Then : MsgBox “Noviembre”<br />

ElseIf N = 12 Then : MsgBox “Diciembre”<br />

Else : MsgBox “Error de datos”<br />

End If<br />

Estructura Select Case<br />

Este estructura es una alternativa a la estructura<br />

If . . . Then . . . ElseIf, cuando lo que necesita es comparar<br />

la misma expresión con diferentes valores. Su sintaxis es la<br />

siguiente:<br />

Select Case EXPRESIÓN_TEST<br />

End Select<br />

Case EXPRESIÓN_1<br />

SENTENCIAS_1<br />

Case EXPRESIÓN_2<br />

SENTENCIAS_2<br />

.<br />

.<br />

.<br />

Case Else<br />

SENTENCIAS_FALSAS<br />

Pág. 34


En este caso se comprueba el valor de EXPRESIÓN_TEST<br />

frente a la lista expresiones EXPRESIÓN_1, EXPRESIÓN_2, . . . y<br />

así sucesivamente, y busca el primer Case que incluya el valor<br />

evaluado en EXPRESIÓN_TEST, ejecutando a continuación el bloque<br />

de sentencias correspondiente. Si no existe un valor igual a<br />

EXPRESIÓN_TEST, entonces se ejecuta las SENTENCIAS_FALSAS<br />

correspondientes al Case Else.<br />

A manera de ejemplo vamos a codificar el programa de la<br />

sección anterior el cual imprime el nombre del mes<br />

correspondiente a los números del 1 al 12. Pero en esta vez<br />

utilizaremos la estructura Select Case (compare con cual de<br />

ambas estructuras es más cómodo trabajar).<br />

Dim N As Integer<br />

N = InputBox(“Ingrese N?”)<br />

Select Case N<br />

Case 1 : MsgBox “Enero”<br />

Case 2 : MsgBox “Febrero”<br />

Case 3 : MsgBox “Marzo”<br />

Case 4 : MsgBox “Abril”<br />

Case 5 : MsgBox “Mayo”<br />

Case 6 : MsgBox “Junio”<br />

Case 7 : MsgBox “Julio”<br />

Case 8 : MsgBox “Agosto”<br />

Case 9 : MsgBox “Setiembre”<br />

Pág. 35


Case 10 : MsgBox “Octubre”<br />

Case 11 : MsgBox “Noviembre”<br />

Case 12 : MsgBox “Diciembre”<br />

Case Else<br />

End Select<br />

MsgBox “Error de datos”<br />

Cabe destacar que Select Case también se puede utilizar de<br />

la siguiente manera:<br />

Dim X As Integer<br />

X = InputBox(“Ingrese X?”)<br />

Select Case X<br />

Case 1<br />

Case 2, 3<br />

MsgBox “X = 1”<br />

MsgBox “X = 2 o X = 3”<br />

Case 4 To 10<br />

Case Else<br />

End Select<br />

Estructura For . . . Next<br />

MsgBox “4


ser conocido de antemano. Su sintaxis es la que se presenta a<br />

continuación:<br />

For CONTADOR = INICIO To FINAL [Step INCREMENTO/DECREMENTO]<br />

Next<br />

SENTENCIAS_REPETITIVAS<br />

[Exit For]<br />

Donde la variable CONTADOR es inicializada con el valor de<br />

INICIO y se incrementa o decrementa hasta un valor FINAL.<br />

INCREMENTO/DECREMENTO define la manera en que cambia el valor<br />

de la variable CONTADOR en cada iteración.<br />

La sentencia Exit For permite salir del bucle For . . . Next<br />

antes de que este finalice.<br />

Por ejemplo, el siguiente código imprime los cuadrados de<br />

los números enteros del 1 al 25.<br />

Dim C As Integer<br />

For C = 1 To 25<br />

Next<br />

Print C<br />

Para que este código funcione correctamente debe<br />

establecer la propiedad AutoRedraw del formulario a True.<br />

Estructura While . . . Wend<br />

La estructura While . . . Wend es aquella en la que el<br />

número de iteraciones no se conoce por anticipado y el cuerpo<br />

Pág. 37


del bucle se repite mientras se cumple una determinada<br />

condición. Su sintaxis es la siguiente:<br />

While CONDICIÓN<br />

Wend<br />

SENTENCIAS_REPETITIVAS<br />

La estructura While . . . Wend evalúa la CONDICIÓN en cada<br />

iteración y si el resultado es verdadero continúa su ejecución.<br />

El bucle termina cuando CONDICIÓN es falsa.<br />

A manera de ejemplo, considere el siguiente código, el<br />

cual imprime en pantalla la suma de los N primeros números<br />

naturales, es decir S = 1 + 2 + 3 + 4 + . . . + N<br />

Dim N As Integer, S As Integer<br />

S = 0<br />

N = InputBox(“Ingrese N?”)<br />

While N 0<br />

Wend<br />

S = S + N<br />

N = N - 1<br />

MsgBox “La suma es S= ” & Str(S)<br />

Estructura Do . . . Loop<br />

Esta estructura ejecuta un bucle mientras una condición<br />

dada sea cierta, o hasta que una condición dada sea cierta. La<br />

Pág. 38


condición puede ser verificada antes o después de ejecutarse el<br />

cuerpo del bucle. Su sintaxis es:<br />

Formato 1: Do [While/Until] CONDICIÓN<br />

SENTENCIAS_REPETITIVAS<br />

[Exit Do]<br />

Loop<br />

Formato 2: Do<br />

SENTENCIAS_REPETITIVAS<br />

[Exit Do]<br />

Loop [While/Until] CONDICIÓN<br />

Esta estructura (como se puede observar en ambos formatos)<br />

permite realizar varias estructuras diferentes dependiendo si<br />

la condición de terminación está al principio o al final del<br />

cuerpo del bucle.<br />

Como ejemplo, consideremos el siguiente programa, el cual<br />

calcula el factorial de un entero N ingresado por teclado:<br />

Dim N As Integer, FACT As Integer, C As Integer<br />

FACT = 1<br />

C = 1<br />

N = InputBox(“Ingrese N?”)<br />

Do<br />

FACT = FACT * C<br />

C = C + 1<br />

Loop While C


MsgBox “El factorial de ” & Str(N) & “ es=” & Str(FACT)<br />

Sentencia GoTo<br />

Transfiere el control a una línea específica de código,<br />

identificada por una etiqueta o por un número de línea. Su<br />

sintaxis es:<br />

GoTo ETIQUETA/NUMERO_LÍNEA<br />

Aunque el uso del GoTo se ha depreciado considerablemente,<br />

en el presente trabajo no se juzgará su validez. Sin embargo,<br />

se ha establecido que no hay situaciones de programación que<br />

requieran el uso del GoTo, es decir, no es un elemento<br />

necesario para hacer <strong>completo</strong> el lenguaje.<br />

Sin embargo, el GoTo es un convenio que, si su usa con<br />

cuidado, puede ser beneficioso en ciertas situaciones de<br />

programación.<br />

Por ejemplo podría escribir un bucle para imprimir los<br />

cuadrados de los números enteros del 1 al 25.<br />

Dim X As Integer<br />

X = 0<br />

LABEL1:<br />

X = X + 1<br />

Print X ^ 2<br />

If X < 25 Then GoTo LABEL1<br />

Pág. 40


Un uso abusivo de la sentencia GoTo da lugar a códigos<br />

difíciles de interpretar y de mantener. Por ello, se recomienda<br />

su uso solamente en ocasiones excepcionales. La tarea que vaya<br />

a desempeñar una sentencia GoTo puede suplirse utilizando<br />

cualquiera de las estructuras de control vistas en las<br />

secciones anteriores.<br />

ARREGLOS<br />

Un arreglo o matriz es una estructura de datos en la que<br />

se almacena una colección finita de datos del mismo tipo, que<br />

comparten un nombre común, a los que se puede acceder por la<br />

posición (índice) que ocupa cada uno de ellos dentro del<br />

arreglo. Cada elemento del arreglo es una variable que puede<br />

contener un número o una cadena de caracteres, dependiendo del<br />

tipo de arreglo que se declare.<br />

Los arreglos en <strong>Visual</strong> <strong>Basic</strong> se clasifican en estáticos y<br />

dinámicos.<br />

Arreglos estáticos<br />

Son aquellos arreglos cuyo tamaño no puede cambiar en<br />

tiempo de ejecución. La declaración de un arreglo estático se<br />

puede realizar mediante la siguiente sintaxis:<br />

Dim NOMBRE_ARREGLO(DIMENSONES) As TIPO<br />

Pág. 41


Donde DIMENSIONES es una lista de números, separados por<br />

comas y que definen las dimensiones del arreglo. Esta lista<br />

puede ser de la siguiente forma:<br />

DIMENSIÓN_1, DIMENSIÓN_2, DIMENSIÓN_3, . . ., DIMENSIÓN_ K<br />

Para el caso de un arreglo formado por “ K ” dimensiones,<br />

es decir un arreglo K -dimensional.<br />

A manera de ejemplo considere los siguientes casos que se<br />

pueden presentar:<br />

Dim LISTA(9) As Integer<br />

Dim MATRIZ(4, 3) As Double<br />

Dim NOMBRES(19) As String * 30<br />

En el primer caso se declara un arreglo unidimensional de<br />

10 elementos de tipo entero (por defecto los elementos de un<br />

arreglo se numeran a partir de 0).<br />

En el segundo caso se define de un arreglo bidimensional<br />

de 20 elementos (5 filas por 4 columnas) de tipo punto flotante<br />

en doble precisión.<br />

En el tercer caso se define una arreglo unidimensional de<br />

20 elementos de tipo cadena de caracteres (cada elemento tiene<br />

una longitud fija de 30 caracteres).<br />

Como se observa la numeración de los elementos de un<br />

arreglo por defecto comienza en cero, para hacer que la<br />

Pág. 42


numeración comience en 1, debe ingresar la siguiente orden en<br />

la sección de Declaraciones del módulo de formulario:<br />

Luego, para declarar los mismos arreglos de los casos<br />

anteriores, las sentencias serían las siguientes:<br />

Dim LISTA(10) As Integer<br />

Dim MATRIZ(5, 4) As Double<br />

Dim NOMBRES(20) As String * 30<br />

Establecer la sentencia Option Base a 1 o trabajar con el<br />

valor predeterminado (cero) queda a consideración del lector.<br />

Arreglos dinámicos<br />

Son aquellos arreglos en los que su tamaño puede definirse<br />

o modificarse en tiempo de ejecución. Para declara una arreglo<br />

dinámico utilice la siguiente sintaxis:<br />

sintaxis:<br />

Dim NOMBRE_ARREGLO() As TIPO<br />

Para definir el tamaño del arreglo utilizar la siguiente<br />

Pág. 43


ReDim NOMBRE_ARREGLO(NÚMERO_ELEMENTOS)<br />

Cada vez que se ejecuta la sentencia ReDim, todos los<br />

valores almacenados en el arreglo se pierden. Para definir o<br />

cambiar el tamaño del arreglo conservando los valores del mismo<br />

use la siguiente sintaxis:<br />

ReDim Preserve NOMBRE_ARREGLO(NÚMERO_ELEMENTOS)<br />

Para liberar el espacio de memoria utilizado por arreglos<br />

dinámicos que ya no son útiles, utilizar la sintaxis:<br />

Erase NOMBRE_ARREGLO<br />

La orden Erase asigna cero a cada elemento de los arreglos<br />

numéricos y nulo (“”) a cada elemento de los arreglos de cadena<br />

de caracteres.<br />

A manera de ejemplo considere el siguiente código que<br />

declara y hace uso de un arreglo dinámico:<br />

Dim I As Integer, N As Integer, TEMP() As Integer<br />

N = InputBox(“Ingrese N?”)<br />

ReDim TEMP(N - 1)<br />

For I = 0 To N - 1<br />

Next<br />

TEMP(I) = I + 1<br />

Print TEMP(I)<br />

Erase TEMP<br />

Pág. 44


REGISTROS<br />

Un registro es un nuevo tipo de dato, que se define como<br />

una colección de datos de diferentes tipos, conocidos como<br />

“campos”, los cuales se encuentran evidentemente relacionados.<br />

Un registro sólo se puede ser creado en la sección de<br />

declaraciones de un módulo. La sintaxis correspondiente es:<br />

Private Type NOMBRE_REGISTRO<br />

End Type<br />

DECLARACIONES_DE_LOS_MIEMBROS<br />

Por ejemplo considere el siguiente código que define la<br />

estructura ALUMNO:<br />

Private Type ALUMNO<br />

End Type<br />

ID_ALUMNO As String * 7<br />

NOMBRE As String * 25<br />

DIRECCION As String * 35<br />

TELEFONO As String * 7<br />

ESTADO As Boolean<br />

Luego, podemos declarar una variable tipo ALUMNO de la<br />

siguiente forma:<br />

Dim X As ALUMNO<br />

Pág. 45


Para referirse a un determinado miembro del registro se<br />

utiliza el operador selector de campos ( . ), veamos:<br />

X.ID_ALUMNO = “980976G”<br />

X.NOMBRE = “Carlos Castillo Peralta”<br />

X.DIRECCION = “Jr. C. Richardson 412 Chorrillos”<br />

X.TELEFONO = “2510850”<br />

X.ESTADO = True<br />

Las mismas órdenes del párrafo anterior se pueden escribir<br />

de una manera más fácil, más legible y más eficiente si utiliza<br />

la sentencia With . . . End With, del siguiente modo:<br />

With X<br />

End With<br />

FUNCIONES<br />

. ID_ALUMNO = “980976G”<br />

.NOMBRE = “Carlos Castillo Peralta”<br />

.DIRECCION = “Jr. C. Richardson 412 Chorrillos”<br />

.TELEFONO = “2510850”<br />

.ESTADO = True<br />

Las funciones son uno de los elementos básicos en<br />

programación. A continuación serán estudiadas detalladamente.<br />

Declaración de una función<br />

Pág. 46


Una función es un procedimiento que cuando se ejecuta<br />

devuelve un único resultado al procedimiento que la invocó. La<br />

sintaxis correspondiente a la declaración de una función es:<br />

Function NOMBRE_FUNCIÓN([LISTA_PARÁMETROS]) [As TIPO]<br />

SENTENCIAS<br />

[NOMBRE_FUNCIÓN = VALOR_RETORNADO]<br />

[Exit Function]<br />

End Function<br />

Donde LISTA_PARÁMETROS es una secuencia de variables<br />

separadas por comas que se corresponden con los argumentos<br />

pasados cuando es invocada la función.<br />

Para especificar el tipo de datos que será retornado por<br />

la función utilice la cláusula opcional As TIPO, el tipo es<br />

Variant por omisión.<br />

El valor retornado por la función es almacenado en su<br />

propio nombre, es decir en NOMBRE_FUNCIÓN, que actúa como<br />

variable dentro del cuerpo de la función. Si no se efectúa esta<br />

asignación el valor devuelto será cero si la función es de tipo<br />

numérica, nulo (“”) si la función es de tipo cadena, o vacío<br />

(Empty) si la función es de tipo Variant.<br />

La cláusula opcional Exit Function permite salir de una<br />

función antes de que la función finalice, en caso sea esto<br />

necesario.<br />

Pág. 47


La sintaxis para la llamada a una función es de la<br />

siguiente forma:<br />

VARIABLE = NOMBRE_FUNCIÓN([LISTA_ARGUMENTOS])<br />

Donde LISTA_ARGUMENTOS es una secuencia de constantes,<br />

variables o expresiones separadas por comas. El número de<br />

argumentos debe ser igual al número de parámetros de la<br />

función. Los tipos de los argumentos deben coincidir con los<br />

tipos de sus correspondientes parámetros.<br />

A manera de ejemplo considere la implementación de la<br />

siguiente función:<br />

2<br />

f ( x)<br />

= x + 2x<br />

+ 3<br />

En la sección de Declaraciones del módulo de formulario<br />

ingrese el siguiente código:<br />

Function F(X As Double) As Double<br />

F = X ^ 2 + 2 * X + 3<br />

End Function<br />

Para invocar la función creada recientemente, codifique<br />

las siguientes líneas:<br />

Dim A As Double, RESP As Double<br />

A = InputBox(“Ingrese A?”)<br />

RESP = F(A)<br />

Pág. 48


MsgBox (Str(RESP))<br />

Paso de argumentos a una función<br />

El paso de argumentos a una función es la forma como se<br />

ingresan los datos y variables al interior de la función y se<br />

presenta de dos formas:<br />

• Por referencia<br />

• Por valor<br />

Paso de argumentos por referencia<br />

En las funciones de <strong>Visual</strong> <strong>Basic</strong>, los argumentos se pasan<br />

por referencia (forma por defecto), de este modo cualquier<br />

cambio de valor que sufra un parámetro en el cuerpo de la<br />

función, también se produce en el argumento correspondiente de<br />

la llamada a la función. Esta forma de pasar los argumentos a<br />

una función es útil para funciones que devuelven más de un<br />

valor. Por ejemplo, considere la siguiente función que calcula<br />

2<br />

las raíces reales de una ecuación cuadrática Ax + Bx + C = 0 .<br />

Function RAIZ(A As Double, B As Double, C As Double, _<br />

Dim D As Double<br />

D = B ^ 2 - 4 * A * C<br />

If D >= 0 Then<br />

X1 As Double, X2 As Double) As Boolean<br />

X1 = (-B - Sqr(D)) / (2 * A)<br />

X2 = (-B + Sqr(D)) / (2 * A)<br />

Pág. 49


Else<br />

End If<br />

End Function<br />

RAIZ = True ' Verdadero si hay raíces reales<br />

RAIZ = False ' Falso si no hay raíces reales<br />

La llamada a esta función se puede realizar de la manera<br />

que se presenta a continuación:<br />

Dim A As Double, B As Double, C As Double<br />

Dim X1 As Double, X2 As Double<br />

A = InputBox(“Ingrese A?”)<br />

B = InputBox(“Ingrese B?”)<br />

C = InputBox(“Ingrese C?”)<br />

If RAIZ(A, B, C, X1, X2) Then<br />

Else<br />

End If<br />

MsgBox “X1= ” & Str(X1)<br />

MsgBox “X2= ” & Str(X2)<br />

MsgBox “NO EXISTEN RAÍCES REALES”<br />

Paso de argumentos por valor<br />

Cuando se ejecuta una función, se podrá especificar que el<br />

valor de un argumento no sea cambiado por esta función, pasando<br />

dicho argumento por valor. Para ello se debe anteponer la<br />

Pág. 50


palabra reservada ByVal a la declaración del parámetro en la<br />

cabecera de la función. Por ejemplo:<br />

Function F(ByVal X As Double) As Double<br />

F = X ^ 2 + 2 * X + 3<br />

End Function<br />

La cabecera de la función F especifica que X será pasado<br />

por valor y no por referencia.<br />

Funciones recursivas<br />

Se dice que una función es recursiva si se llama a sí<br />

misma. Por ejemplo la función FACTORIAL cuyo código se presenta<br />

a continuación es recursiva:<br />

Function FACTORIAL(N As Integer) As Long<br />

If N 0 Then<br />

Else<br />

End If<br />

End Function<br />

PROCEDIMIENTOS<br />

FACTORIAL = FACTORIAL(N - 1) * N<br />

FACTORIAL = 1<br />

La sintaxis para definir un procedimiento es la<br />

siguiente:<br />

Private Sub NOMBRE_PROCEDIMIENTO([LISTA_PARÁMETROS])<br />

Pág. 51


End Sub<br />

SENTENCIAS<br />

[Exit Sub]<br />

La explicación es análoga a la dada para las funciones.<br />

Sin embargo, un procedimiento no puede ser utilizado en una<br />

expresión, ya que un procedimiento no retorna ningún valor a<br />

través de su nombre.<br />

La llamada a un procedimiento puede ser realizada de<br />

alguna de las dos formas siguientes:<br />

Call NOMBRE_PROCEDIMIENTO([LISTA_ARGUMENTOS])<br />

ó<br />

NOMBRE_PROCEDIMIENTO([LISTA_ARGUMENTOS])<br />

Por ejemplo, el siguiente código corresponde a un<br />

procedimiento que calcula e imprime la suma de los N primeros<br />

números naturales impares, es decir: S = 1 + 3 + 5 + . . . + N<br />

Private Sub SUMA_IMPAR(N As Integer)<br />

Dim S As Integer, I As Integer<br />

S = 0<br />

For I = 1 To N<br />

If I Mod 2 0 Then<br />

End If<br />

S = S + I<br />

Pág. 52


Next<br />

End Sub<br />

MsgBox “La suma es S= ” & Str(S)<br />

La llamada a este procedimiento podría ser de la forma:<br />

Call SUMA_IMPAR(25)<br />

Pág. 53


CAPÍTULO 4<br />

USO DE LOS CONTROLES<br />

Los controles son aquellos objetos que se encuentran<br />

dentro de un contenedor y que permiten la interacción entre el<br />

usuario y la aplicación, ya sea para manipular datos y/o<br />

ejecutar tareas.<br />

En <strong>Visual</strong> <strong>Basic</strong>, los controles suelen ser agrupados en<br />

tres categorías:<br />

• Controles básicos<br />

• Controles complementarios<br />

• Controles externos<br />

Los controles básicos son las etiquetas, cuadros de texto<br />

y botones de comando, pues utilizando estos tres controles se<br />

puede construir cualquier interfaz.<br />

Los controles complementarios son el resto de los<br />

controles, por ejemplo una casilla de verificación, un cuadro<br />

combinado o un cronómetro.<br />

Los controles externos se refieren a aquellos controles<br />

creados por terceros. Este tipo de controles son llamados<br />

ActiveX.<br />

Pág. 54


CONTROLES BÁSICOS<br />

Los controles básicos lo conforman las etiquetas, cuadros<br />

de texto y botones de comando, debido a que cualquier interfaz<br />

se puede implementar con sólo estos tres objetos.<br />

Etiqueta<br />

Una etiqueta es un control que permite presentar texto de<br />

solo lectura. Se utiliza para mostrar títulos y mensajes que<br />

por lo general no cambian. Sin embargo, si lo desea, puede<br />

escribir procedimientos que cambien el texto mostrado por una<br />

etiqueta como respuesta a eventos en tiempo de ejecución.<br />

Propiedad Descripción<br />

Alignment Especifica<br />

texto.<br />

la forma como se alineará el<br />

AutoSize Especifica si se cambia automáticamente el<br />

tamaño del control para que quepan sus<br />

contenidos.<br />

BackColor, Especifica el color de fondo y de primer<br />

ForeColor<br />

plano empleado para mostrar el texto.<br />

BackStyle Especifica si el fondo del control es<br />

transparente u opaco.<br />

Caption Especifica<br />

control.<br />

el texto que se muestra en el<br />

WordWrap Especifica si la etiqueta se extiende a más<br />

de una línea cuando el texto es amplio.<br />

Pág. 55


Cuadro de texto<br />

Un cuadro de texto es un control en el que el usuario<br />

pueda ingresar datos desde el teclado o visualizar un resultado<br />

generado por la aplicación. El valor de un cuadro de texto por<br />

lo general se asocia a una variable de memoria.<br />

Propiedad Descripción<br />

Enabled Habilita o deshabilita el control, es decir<br />

si se puede o no modificar el contenido.<br />

Locked Permite bloquear el acceso al control en<br />

MaxLenght<br />

tiempo de ejecución.<br />

Especifica la longitud máxima (en caracteres)<br />

que puede escribirse en el control.<br />

MultiLine Especifica si el control admitirá múltiples<br />

líneas.<br />

PasswordChar Determina si se muestran en el control los<br />

caracteres escritos por el usuario o los<br />

caracteres de marcador de posición.<br />

ScrollBars Especifica si se muestran las barras de<br />

desplazamiento horizontales o verticales.<br />

SelLength Especifica el número de caracteres<br />

SelStart<br />

seleccionados.<br />

Especifica el inicio del texto seleccionado.<br />

Si su valor es 0, el texto seleccionado<br />

SelText<br />

comienza por el primer carácter.<br />

Contiene el texto seleccionado.<br />

Text Contiene el texto introducido en el control.<br />

Puede inicializar el contenido en tiempo de<br />

diseño.<br />

Pág. 56


Los eventos asociados a un cuadro de texto son los<br />

siguientes:<br />

Evento Descripción<br />

Change Ocurre cuando se cambia el contenido del<br />

KeyPress<br />

control utilizando el teclado o el ratón.<br />

Ocurre cuando se pulsa una tecla.<br />

Botón de comando<br />

Un botón de comando es un control que suele emplearse para<br />

ejecutar una acción, como cerrar un formulario, imprimir un<br />

informe, etc.<br />

Propiedad Descripción<br />

Cancel Especifica si el control responderá a la<br />

Caption<br />

tecla ESC, por lo general para terminar la<br />

aplicación.<br />

Muestra un título para el control.<br />

Default Especifica si el control responderá a la<br />

Enabled<br />

tecla ENTRAR, sin importar la ubicación del<br />

enfoque.<br />

Permite habilitar o deshabilitar el control.<br />

Picture Especifica<br />

control.<br />

una imagen tipo icono para el<br />

Style Especifica la apariencia del control, ya sea<br />

estándar (estilo estándar de Windows) o<br />

gráfica (con una imagen personalizada).<br />

Pág. 57


Los botones de comando suelen responder al evento Click,<br />

cuya descripción es:<br />

Evento Descripción<br />

Click Ocurre cuando el usuario hace click sobre el<br />

control.<br />

A manera de ejemplo vamos a desarrollar la siguiente<br />

aplicación. Esta consiste en un cajero automático el cual<br />

permite manipular cierta cantidad de dinero para lo cual<br />

dispone de los siguientes billetes: S/. 10.00; S/. 20.00;<br />

S/. 50.00; S/. 100.00 y S/. 200.00. Elaborar una aplicación que<br />

permita la lectura de la cantidad a retirar e indique el menor<br />

número de billetes a utilizar.<br />

Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

6 etiquetas<br />

Pág. 58


6 cajas de texto<br />

3 botones de comando<br />

Una vez ubicados los controles, establezca las propiedades<br />

según se indica:<br />

Form1<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Label5<br />

Nombre FrmCajero<br />

BorderStyle 3-Fixed Dialog<br />

Caption Cajero automático<br />

Nombre LblCantidad<br />

AutoSize True<br />

Caption Cantidad a retirar:<br />

Nombre LblB10<br />

AutoSize True<br />

Caption Billetes de S/. 10<br />

Nombre LblB20<br />

AutoSize True<br />

Caption Billetes de S/. 20<br />

Nombre LblB50<br />

AutoSize True<br />

Caption Billetes de S/. 50<br />

Pág. 59


Label6<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Text5<br />

Text6<br />

Command1<br />

Nombre LblB100<br />

AutoSize True<br />

Caption Billetes de S/. 100<br />

Nombre LblB200<br />

AutoSize True<br />

Caption Billetes de S/. 200<br />

Nombre TxtCantidad<br />

Text<br />

Nombre TxtB10<br />

Text<br />

Nombre TxtB20<br />

Text<br />

Nombre TxtB50<br />

Text<br />

Nombre TxtB100<br />

Text<br />

Nombre TxtB200<br />

Text<br />

Pág. 60


Command2<br />

Command3<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Para añadir código a la aplicación haga doble click sobre<br />

el botón “Aceptar” e ingrese lo siguiente:<br />

Private Sub CmdAceptar_Click()<br />

Dim C As Integer, B200 As Integer, B100 As Integer, _<br />

B50 As Integer, B20 As Integer, B10 As Integer<br />

C = Val(TxtCantidad)<br />

If C Mod 10 = 0 Then<br />

Else<br />

B200 = C \ 200 : C = C Mod 200<br />

B100 = C \ 100 : C = C Mod 100<br />

B50 = C \ 50 : C = C Mod 50<br />

B20 = C \ 20 : B10 = C Mod 20<br />

TxtB200 = Str(B200)<br />

TxtB100 = Str(B100)<br />

TxtB50 = Str(B50)<br />

TxtB20 = Str(B20)<br />

TxtB10 = Str(B10)<br />

Pág. 61


End Sub<br />

End If<br />

MsgBox “Cantidad a retirar debe ser múltiplo de 10”<br />

TxtCantidad = “”<br />

TxtCantidad.SetFocus<br />

Luego, haga doble click sobre el botón “Limpiar” y añada<br />

el siguiente código:<br />

Private Sub CmdLimpiar_Click()<br />

End Sub<br />

TxtCantidad = “”<br />

TxtB200 = “”<br />

TxtB100 = “”<br />

TxtB50 = “”<br />

TxtB20 = “”<br />

TxtB10 = “”<br />

TxtCantidad.SetFocus<br />

Finalmente dar doble click sobre el botón “Salir” y añada<br />

el siguiente código:<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Pág. 62


En el código anterior hemos utilizado el método SetFocus<br />

para enfocar la caja de texto TxtCantidad, esto es, para<br />

posicionar el cursor sobre ella.<br />

CONTROLES COMPLEMENTARIOS<br />

Los controles complementarios se utilizan como alternativa<br />

a los controles básicos en aplicaciones en las cuales su uso<br />

facilita o mejora el diseño de la interfaz. Como el lector<br />

podrá verificar, algunos controles son más adecuados que otros<br />

dependiendo del tipo de aplicación que se pretenda desarrollar.<br />

Marco<br />

Un marco es un objeto contenedor que puede utilizarse para<br />

agrupar casillas de verificación, botones de opción, botones de<br />

comando, etc.<br />

Propiedad Descripción<br />

Caption Muestra un título para el control.<br />

Casilla de verificación<br />

Una casilla de verificación se utiliza para alternar entre<br />

dos posibles valores (Activado/Desactivado). Cada casilla de<br />

verificación es independiente de las demás ya que cada una<br />

tiene su propio nombre (Name). Puede utilizar casillas de<br />

verificación en grupos para mostrar múltiples opciones entre<br />

Pág. 63


las cuales el usuario puede seleccionar todas las que desee a<br />

la vez.<br />

Propiedad Descripción<br />

Caption Muestra un título para el control.<br />

Value Devuelve o establece el estado del control,<br />

puede ser: Desactivado (0), Activado (1).<br />

Click.<br />

Las casillas de verificación suelen responder al evento<br />

Botón de opción<br />

Un botón de opción se utiliza para alternar entre dos<br />

posibles valores (Activado/Desactivado), de manera similar a<br />

las casillas de verificación, la diferencia radica en que de un<br />

grupo de botones de opción el usuario sólo puede seleccionar un<br />

único botón a la vez.<br />

Propiedad Descripción<br />

Caption Muestra un título para el control.<br />

Value Devuelve o establece el estado del control,<br />

puede ser: Desactivado (Falso), Activado<br />

(True).<br />

Click.<br />

Los botones de opción también suelen responder al evento<br />

Pág. 64


A manera de ejemplo vamos a desarrollar la siguiente<br />

aplicación, la cual permite cambiar el aspecto de un cuadro de<br />

texto, el usuario debe elegir el color (rojo, verde, azul) y el<br />

estilo (negrita, cursiva, subrayado) de la fuente a utilizar.<br />

Adicionalmente, cuando el usuario active la casilla de<br />

verificación “Convertir a mayúsculas”, todo el texto que haya<br />

escrito en el cuadro de texto se presentará en mayúsculas y<br />

todo texto que escriba a continuación (mientras la opción esté<br />

activada) también deberá aparecer en mayúsculas.<br />

Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

1 cuadro de texto<br />

2 marcos<br />

3 botones de opción<br />

4 casillas de verificación<br />

Pág. 65


Una vez ubicados los controles, establezca las propiedades<br />

según se indica:<br />

Form1<br />

Text1<br />

Frame1<br />

Frame2<br />

Option1<br />

Option2<br />

Nombre FrmEditor<br />

BorderStyle 3-Fixed Dialog<br />

Caption Editor<br />

Nombre TxtMensaje<br />

ForeColor &H000000FF&<br />

Text<br />

Nombre FraColor<br />

Caption Color<br />

Nombre FraEstilo<br />

Caption Estilo<br />

Nombre OptRojo<br />

Caption Rojo<br />

ForeColor &H000000FF&<br />

Value True<br />

Nombre OptVerde<br />

Caption Verde<br />

ForeColor &H00008000&<br />

Pág. 66


Option3<br />

Check1<br />

Check2<br />

Check3<br />

Check4<br />

Nombre OptAzul<br />

Caption Azul<br />

ForeColor &H00C00000&<br />

Nombre ChkNegrita<br />

Caption Negrita<br />

Font Arial (Negrita)<br />

Nombre ChkCursiva<br />

Caption Cursiva<br />

Font Arial (Cursiva)<br />

Nombre ChkSubrayado<br />

Caption Subrayado<br />

Font Arial (Subrayado)<br />

Nombre ChkMayuscula<br />

Caption Convertir a mayúsculas<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el código que se indica a continuación:<br />

Private Sub OptRojo_Click()<br />

End Sub<br />

If OptRojo.Value Then<br />

End If<br />

TxtMensaje.ForeColor = RGB(255, 0, 0)<br />

Pág. 67


Private Sub OptVerde_Click()<br />

End Sub<br />

If OptVerde.Value Then<br />

End If<br />

TxtMensaje.ForeColor = RGB(0, 255, 0)<br />

Private Sub OptAzul_Click()<br />

End Sub<br />

If OptAzul.Value Then<br />

End If<br />

TxtMensaje.ForeColor = RGB(0, 0, 255)<br />

Private Sub ChkNegrita_Click()<br />

If ChkNegrita.Value Then<br />

Else<br />

End Sub<br />

End If<br />

TxtMensaje.Font.Bold = True<br />

TxtMensaje.Font.Bold = False<br />

Private Sub ChkCursiva_Click()<br />

If ChkCursiva.Value Then<br />

Else<br />

End Sub<br />

End If<br />

TxtMensaje.Font.Italic = True<br />

TxtMensaje.Font.Italic = False<br />

Pág. 68


Private Sub ChkSubrayado_Click()<br />

If ChkSubrayado.Value Then<br />

Else<br />

End Sub<br />

End If<br />

TxtMensaje.Font.Underline = True<br />

TxtMensaje.Font.Underline = False<br />

Private Sub ChkMayuscula_Click()<br />

End Sub<br />

If ChkMayuscula.Value Then<br />

End If<br />

TxtMensaje = UCase(TxtMensaje)<br />

Private Sub TxtMensaje_KeyPress(KeyAscii As Integer)<br />

End Sub<br />

Dim CAR As String * 1<br />

If ChkMayuscula.Value Then<br />

End If<br />

CAR = UCase(Chr(KeyAscii))<br />

KeyAscii = Asc(CAR)<br />

La función RGB() especifica el color que se asigna a la<br />

propiedad ForeColor.<br />

La función UCase() retorna una cadena de caracteres en<br />

mayúsculas.<br />

Pág. 69


Cuadro de lista<br />

Un cuadro de lista es un control que presenta una lista de<br />

elementos en la que el usuario puede seleccionar uno o más de<br />

dichos elementos. Si el número de elementos supera el número<br />

que puede mostrarse, se agregará automáticamente una barra de<br />

desplazamiento al control.<br />

Propiedad Descripción<br />

List Contiene los elementos de la lista. Puede<br />

definirlos en tiempo de diseño.<br />

ListCount Especifica el número de elementos de la<br />

ListIndex<br />

lista. Su valor siempre es uno más que el<br />

mayor valor de ListIndex.<br />

Especifica el número de orden que ocupa el<br />

elemento seleccionado en la lista. Toma el<br />

valor de 0 para el primer elemento, si no ha<br />

selecciona ninguno retorna -<strong>1.</strong><br />

MultiSelect Especifica si se pueden seleccionar varios<br />

elementos de la lista.<br />

SelCount Devuelve el número de elementos<br />

Selected<br />

seleccionados.<br />

Especifica si un elemento de la lista está<br />

seleccionado.<br />

Sorted Especifica si los elementos de la lista se<br />

ordenan alfabéticamente.<br />

Text Especifica el valor del elemento seleccionado<br />

en ese instante. El valor es tratado como una<br />

cadena de caracteres.<br />

Pág. 70


Los métodos que se pueden utilizar para un cuadro de lista<br />

son los siguientes:<br />

Método Descripción<br />

AddItem Agrega un nuevo elemento a la lista.<br />

Clear Elimina todos los elementos contenidos en la<br />

lista.<br />

RemoveItem Elimina en elemento de la lista.<br />

Cuadro combinado<br />

Un cuadro combinado es una mezcla de un cuadro de texto<br />

con una lista. En él no sólo se podrá ingresar un dato sino<br />

también seleccionarlo de la lista. Presenta las mismas<br />

propiedades, eventos y métodos que el cuadro de lista a<br />

excepción de lo siguiente:<br />

Propiedad Descripción<br />

Style Especifica si el control se comporta como un<br />

cuadro de texto o como una lista desplegable.<br />

Un cuadro de texto permite ingresar valores.<br />

Una lista desplegable sólo permite<br />

seleccionar valores. El valor predeterminado<br />

es 0-vbComboDropDown, e incluye una lista<br />

desplegable y un cuadro de texto. El valor<br />

1-vbComboSimple incluye tan solo cuadro de<br />

texto. El valor 2-Dropdown List incluye sólo<br />

una lista desplegable.<br />

Pág. 71


Como ejemplo del uso de listas vamos a desarrollar una<br />

aplicación que permita ingresar el nombre de un curso, el cual<br />

pasa a formar parte de una lista de espera antes de ser<br />

programado para su dictado. Los cursos deben ser seleccionados<br />

de la lista de espera y trasladados a la lista de cursos<br />

programados y viceversa.<br />

Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

3 etiquetas<br />

1 cuadro de texto<br />

2 listas<br />

5 botones de comando<br />

Pág. 72


indica:<br />

Form1<br />

Label1<br />

Label2<br />

Label3<br />

Text1<br />

List1<br />

List2<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre Frm<strong>Curso</strong>s<br />

BorderStyle 3-Fixed Dialog<br />

Caption <strong>Curso</strong>s<br />

Nombre Lbl<strong>Curso</strong><br />

AutoSize True<br />

Caption Ingrese nuevo curso:<br />

Nombre LblSeleccionar<br />

AutoSize True<br />

Caption Seleccione un curso:<br />

Nombre LblProgramado<br />

AutoSize True<br />

Caption <strong>Curso</strong> programado:<br />

Nombre Txt<strong>Curso</strong><br />

Text<br />

Nombre LstSeleccionar<br />

Nombre LstProgramado<br />

Pág. 73


Command1<br />

Command2<br />

Command3<br />

Command4<br />

Command5<br />

Nombre CmdAgregar<br />

Caption<br />

Picture C:\FundVB\Bitmaps\AddItem.Bmp<br />

Style 1-Graphical<br />

Nombre CmdAgregarTodo<br />

Caption<br />

Picture C:\FundVB\Bitmaps\AddAll.Bmp<br />

Style 1-Graphical<br />

Nombre CmdQuitar<br />

Caption<br />

Picture C:\FundVB\Bitmaps\Remove.Bmp<br />

Style 1-Graphical<br />

Nombre CmdQuitarTodo<br />

Caption<br />

Picture C:\FundVB\Bitmaps\RemoveAll.Bmp<br />

Style 1-Graphical<br />

Nombre CmdAnnadir<br />

Caption &Añadir<br />

Default True<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub CmdAnnadir_Click()<br />

Pág. 74


End Sub<br />

LstSeleccionar.AddItem Txt<strong>Curso</strong><br />

Txt<strong>Curso</strong> = “”<br />

Txt<strong>Curso</strong>.SetFocus<br />

Private Sub CmdAgregar_Click()<br />

End Sub<br />

Dim CURSO As String, I As Integer<br />

CURSO = LstSeleccionar.Text<br />

I = LstSeleccionar.ListIndex<br />

If LstSeleccionar.ListIndex >= 0 Then<br />

End If<br />

LstProgramado.AddItem CURSO<br />

LstSeleccionar.RemoveItem I<br />

Private Sub CmdQuitar_Click()<br />

End Sub<br />

Dim CURSO As String, I As Integer<br />

CURSO = LstProgramado.Text<br />

I = LstProgramado.ListIndex<br />

If LstProgramado.ListIndex >= 0 Then<br />

End If<br />

LstSeleccionar.AddItem CURSO<br />

LstProgramado.RemoveItem I<br />

Private Sub CmdAgregarTodo_Click()<br />

Dim I As Integer<br />

Pág. 75


For I = 0 To LstSeleccionar.ListCount - 1<br />

Next<br />

End Sub<br />

LstProgramado.AddItem LstSeleccionar.List(I)<br />

LstSeleccionar.Clear<br />

Private Sub CmdQuitarTodo_Click()<br />

Dim I As Integer<br />

For I = 0 To LstProgramado.ListCount - 1<br />

Next<br />

End Sub<br />

LstSeleccionar.AddItem LstProgramado.List(I)<br />

LstProgramado.Clear<br />

Seguidamente mostraremos un ejemplo del uso de los cuadros<br />

combinados. Para tal fin vamos a desarrollar una aplicación que<br />

permita realizar consultas acerca de un determinado curso. La<br />

relación de cursos se presentará mediante un cuadro combinado,<br />

del cual el usuario debe seleccionar el curso de su interés y<br />

en seguida se presentará el nombre del profesor encargado del<br />

curso (teoría), el nombre del jefe de práctica (laboratorio),<br />

así como los horarios de teoría y de laboratorio,<br />

respectivamente.<br />

Pág. 76


Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

indica:<br />

Form1<br />

1 etiqueta<br />

1 cuadro de texto<br />

1 cuadro combinado<br />

1 botón de comando<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre FrmConsulta<strong>Curso</strong>s<br />

BorderStyle 3-Fixed Dialog<br />

Caption Consulta de cursos<br />

Pág. 77


Label1<br />

Text1<br />

Combo1<br />

Nombre Lbl<strong>Curso</strong>s<br />

Caption <strong>Curso</strong>s:<br />

Nombre Txt<strong>Curso</strong><br />

MultiLine True<br />

ScrollBars<br />

Text<br />

2-Vertical<br />

Nombre Cbo<strong>Curso</strong>s<br />

Text<br />

Command1<br />

Style 2-Dropdown List<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Dim Matriz(5, 3) As String<br />

Private Sub Form_Load()<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel I”<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel II”<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel I”<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel II”<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel I”<br />

Cbo<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel II”<br />

Pág. 78


End Sub<br />

Matriz(0, 0) = “Castillo Peralta, Carlos”<br />

Matriz(1, 0) = “Castillo Peralta, Carlos”<br />

Matriz(2, 0) = “Linares Alarcon, Adams”<br />

Matriz(3, 0) = “Castillo Peralta, Carlos”<br />

Matriz(4, 0) = “Córdoba Saavedra, Javier”<br />

Matriz(5, 0) = “Castillo Peralta, Carlos”<br />

Matriz(0, 1) = “Sa 08-11”<br />

Matriz(1, 1) = “Sa 14-17”<br />

Matriz(2, 1) = “Sa 08-11”<br />

Matriz(3, 1) = “Do 08-11”<br />

Matriz(4, 1) = “Sa 14-17”<br />

Matriz(5, 1) = “Sa 17-20”<br />

Matriz(0, 2) = “Castillo Peralta, Carlos”<br />

Matriz(1, 2) = “Linares Alarcon, Adams”<br />

Matriz(2, 2) = “Montes Tejada, Estela”<br />

Matriz(3, 2) = “Linares Alarcon, Adams”<br />

Matriz(4, 2) = “Córdoba Saavedra, Javier”<br />

Matriz(5, 2) = “Córdoba Saavedra, Javier”<br />

Matriz(0, 3) = “Sa 11-13”<br />

Matriz(1, 3) = “Do 08-10”<br />

Matriz(2, 3) = “Sa 11-13”<br />

Matriz(3, 3) = “Do 14-16”<br />

Matriz(4, 3) = “Sa 18-20”<br />

Matriz(5, 3) = “Do 08-10”<br />

Pág. 79


Private Sub Cbo<strong>Curso</strong>s_Click()<br />

End Sub<br />

Dim P_TEORIA As String, H_TEORIA As String<br />

Dim P_LAB As String, H_LAB As String<br />

P_TEORIA = “Profesor de teoría: ” & _<br />

Matriz(Cbo<strong>Curso</strong>s.ListIndex, 0)<br />

H_TEORIA = “Horario de teoría: ” & _<br />

Matriz(Cbo<strong>Curso</strong>s.ListIndex, 1)<br />

P_LAB = “Jefe de práctica: ” & _<br />

Matriz(Cbo<strong>Curso</strong>s.ListIndex, 2)<br />

H_LAB = “Horario laboratorio: ” & _<br />

Matriz(Cbo<strong>Curso</strong>s.ListIndex, 3)<br />

Txt<strong>Curso</strong> = P_TEORIA & vbCrLf & H_TEORIA & vbCrLf & _<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

P_LAB & vbCrLf & H_LAB<br />

La constante vbCrLf es una combinación de retorno de carro<br />

y avance de línea, es equivalente a Chr(13) + Chr(10).<br />

Para este ejemplo en particular hemos almacenado la<br />

información en memoria RAM mediante el uso de un arreglo<br />

bidimensional (Matriz).<br />

Pág. 80


Cronómetro<br />

Un cronómetro sirve para controlar el tiempo transcurrido<br />

desde el inicio de una acción.<br />

Propiedad Descripción<br />

Interval Especifica el número de milisegundos que se<br />

esperará para disparar el evento Timer.<br />

El control Cronómetro responde al evento Timer, cuya<br />

descripción es:<br />

Evento Descripción<br />

Timer Ocurre cuando el número de milisegundos<br />

especificado<br />

transcurrido.<br />

en la propiedad Interval ha<br />

A manera de ejemplo vamos a desarrollar la siguiente<br />

aplicación que simula el funcionamiento de un reloj digital.<br />

Pág. 81


Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles sobre el formulario:<br />

indica:<br />

Form1<br />

Label1<br />

Text1<br />

Timer1<br />

Command1<br />

1 etiqueta<br />

1 cuadro de texto<br />

1 cronómetro<br />

1 botón de comando<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre FrmReloj<br />

BorderStyle 3-Fixed Dialog<br />

Caption Reloj digital<br />

Nombre LblHora<br />

Caption Hora<br />

Nombre TxtHora<br />

Text<br />

Nombre Timer1<br />

Interval 500<br />

Nombre CmdTerminar<br />

Caption &Terminar<br />

Pág. 82


Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub Form_Activate()<br />

End Sub<br />

TxtHora = Time()<br />

Private Sub Timer1_Timer()<br />

End Sub<br />

If TxtHora Time() Then<br />

End If<br />

TxtHora = Time()<br />

Private Sub CmdTerminar_Click()<br />

End<br />

End Sub<br />

Cuadro de imagen<br />

Un cuadro de imagen se utiliza para mostrar un archivo de<br />

imagen (BMP, GIF o JPG). Recorta el gráfico si el control no es<br />

lo bastante grande para mostrar la imagen completa.<br />

Propiedad Descripción<br />

AutoSize Especifica si el control ajusta<br />

automáticamente su tamaño para mostrar un<br />

gráfico <strong>completo</strong>.<br />

Picture Especifica<br />

control.<br />

el archivo de imagen para el<br />

Pág. 83


El evento que suele manejarse para este control es<br />

MouseMove, cuya descripción es:<br />

Evento Descripción<br />

MouseMove Ocurre cuando el usuario mueve el ratón sobre<br />

el control.<br />

Imagen<br />

Un control imagen se utilizará para mostrar un archivo de<br />

imagen (BMP, GIF o JPG) de manera similar a un Cuadro de<br />

imagen. Sin embargo, este control utiliza menos recursos del<br />

sistema y se actualiza con más rapidez que un cuadro de imagen.<br />

Propiedad Descripción<br />

Picture Especifica<br />

control.<br />

el archivo de imagen para el<br />

Stretch Especifica como se ajusta el tamaño del<br />

archivo gráfico para que quepa dentro del<br />

control imagen.<br />

Para este control también se suele manejar el evento<br />

MouseMove.<br />

Barras de desplazamiento horizontal<br />

Una barra de desplazamiento horizontal representa un valor<br />

entero, la cual tiene un cuadrado que se desplaza a lo largo de<br />

la misma para fijar un valor.<br />

Pág. 84


La posición más a la izquierda se corresponde con el valor<br />

mínimo, la posición más a la derecha con el valor máximo, y<br />

cualquier otra posición es un valor entre ellos dos.<br />

Propiedad Descripción<br />

Max Especifica el valor máximo que puede tomar la<br />

propiedad Value.<br />

Min Especifica el valor mínimo que puede tomar la<br />

propiedad Value.<br />

LargeChange Especifica en cuanto cambiará el valor de la<br />

propiedad Value cuando el usuario haga click<br />

antes o después del cuadrado de<br />

SmallChange<br />

desplazamiento.<br />

Especifica en cuanto cambiará el valor de la<br />

propiedad Value cuando el usuario haga click<br />

en alguna de las flechas de los extremos de<br />

la barra.<br />

Value Especifica el valor del control, este se<br />

encuentra siempre entre los valores de las<br />

propiedades Min y Max.<br />

Las barras de desplazamientos responden a los eventos:<br />

Evento Descripción<br />

Change Ocurre inmediatamente después que el cuadrado<br />

de desplazamiento ha sido movido.<br />

Scroll Ocurre mientras el cuadrado de desplazamiento<br />

está siendo movido (este evento sólo ocurre<br />

cuando el cuadrado es arrastrado).<br />

Barras de desplazamiento vertical<br />

Pág. 85


Una barra de desplazamiento vertical representa un valor<br />

entero, la cual tiene un cuadrado que se desplaza a lo largo de<br />

la misma para fijar un valor.<br />

La posición más hacia arriba se corresponde con el valor<br />

mínimo, la posición más hacia abajo se corresponde con el valor<br />

máximo, y cualquier otra posición es un valor entre ellos dos.<br />

Las propiedades y eventos de las barras de desplazamiento<br />

horizontal y vertical son análogas.<br />

Como ejemplo, vamos a construir una aplicación que permita<br />

cambiar el color de fondo de un cuadro de imagen, mediante tres<br />

barras de desplazamiento (rojo, verde y azul).<br />

Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

3 etiquetas<br />

Pág. 86


indica:<br />

Form1<br />

Label1<br />

Label2<br />

Label3<br />

HScroll1<br />

HScroll2<br />

3 barras de desplazamiento horizontal<br />

1 cuadro de imagen<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre FrmColores<br />

BorderStyle 3-Fixed Dialog<br />

Caption Colores<br />

Nombre LblRojo<br />

Caption Rojo<br />

Nombre LblVerde<br />

Caption Verde<br />

Nombre LblAzul<br />

Caption Azul<br />

Nombre HSRojo<br />

LargeChange 10<br />

Max 255<br />

Min 0<br />

SmallChange 1<br />

Value 255<br />

Pág. 87


HScroll3<br />

Picture1<br />

Nombre HSVerde<br />

LargeChange 10<br />

Max 255<br />

Min 0<br />

SmallChange 1<br />

Value 0<br />

Nombre HSAzul<br />

LargeChange 10<br />

Max 255<br />

Min 0<br />

SmallChange 1<br />

Value 0<br />

Nombre PicFondo<br />

BackColor &H000000FF&<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub HSRojo_Change()<br />

End Sub<br />

PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul)<br />

Private Sub HSVerde_Change()<br />

End Sub<br />

PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul)<br />

Private Sub HSAzul_Change()<br />

Pág. 88


End Sub<br />

PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul)<br />

En el código anterior se debió colocar HSRojo.Value,<br />

HSVerde.Value y HSAzul.Value, pero debido a que la propiedad<br />

Value es por defecto se puede omitir.<br />

Cuadro de lista de unidades<br />

Un cuadro de lista de unidades permite al usuario<br />

seleccionar una unidad de disco válida en tiempo de ejecución.<br />

Utilice este control para presentar una lista de todas las<br />

unidades válidas del sistema.<br />

Propiedad Descripción<br />

Drive Especifica la unidad seleccionada en tiempo<br />

de ejecución.<br />

Este control responde al evento Change, cuya descripción<br />

es la siguiente:<br />

Evento Descripción<br />

Change Ocurre cuando el usuario hace click sobre la<br />

unidad que desea seleccionar. El evento<br />

Change también ocurre si se selecciona la<br />

unidad mediante el teclado.<br />

Cuadro de lista de directorios<br />

Pág. 89


Un cuadro de lista de directorios muestra directorios y<br />

rutas de acceso en tiempo de ejecución. Utilice este control<br />

para mostrar una lista jerárquica de directorios.<br />

Propiedad Descripción<br />

Path Especifica la ruta de acceso actual.<br />

Un cuadro de lista de directorios también responde al<br />

evento Change.<br />

Cuadro de lista de archivos<br />

Un cuadro de lista de archivos encuentra y muestra los<br />

archivos del directorio especificado por la propiedad Path en<br />

tiempo de ejecución. Utilice este control para mostrar una<br />

lista de los archivos seleccionados por tipo.<br />

Propiedad Descripción<br />

Path Especifica la ruta de acceso actual.<br />

Pattern Especifica el tipo de archivo que se desea<br />

visualizar en el control.<br />

List Devuelve los elementos contenidos en la parte<br />

de lista del control.<br />

ListIndex Especifica el índice del elemento<br />

seleccionado actualmente en el control.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

permita el manejo de unidades, carpetas y archivos. El usuario<br />

Pág. 90


puede seleccionar la unidad actual de trabajo, la carpeta y el<br />

archivo y poder visualizar su contenido (en este caso archivos<br />

gráficos *.JPG).<br />

Para el desarrollo de la presente aplicación proceda a<br />

ubicar los siguientes controles en el formulario:<br />

indica:<br />

Form1<br />

4 etiquetas<br />

1 cuadro de lista de unidades<br />

1 cuadro de lista de directorios<br />

1 cuadro de lista de archivos<br />

1 imagen<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre FrmVisor<br />

Caption Visor<br />

Pág. 91


Label1<br />

Label2<br />

Label3<br />

Label4<br />

Drive1<br />

Dir1<br />

File1<br />

Image1<br />

Nombre LblUnidad<br />

Caption Unidad<br />

Nombre LblCarpeta<br />

Caption Carpeta<br />

Nombre LblArchivo<br />

Caption Archivo<br />

Nombre LblVista<br />

Caption Vista previa<br />

Nombre Drive1<br />

Nombre Dir1<br />

Nombre File1<br />

Pattern *.JPG<br />

Nombre ImgVista<br />

Stretch True<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub Drive1_Change()<br />

Pág. 92


On Error GoTo DRIVE_ERROR<br />

Dir<strong>1.</strong>Path = Drive<strong>1.</strong>Drive<br />

Exit Sub<br />

DRIVE_ERROR:<br />

End Sub<br />

MsgBox “ERROR: Unidad no preparada”, vbCritical, “Error”<br />

Exit Sub<br />

Private Sub Dir1_Change()<br />

End Sub<br />

File<strong>1.</strong>Path = Dir<strong>1.</strong>Path<br />

Private Sub File1_Click()<br />

End Sub<br />

Dim ARCHIVO As String<br />

ARCHIVO = File<strong>1.</strong>Path & “\”<br />

ARCHIVO = ARCHIVO & File<strong>1.</strong>List(File<strong>1.</strong>ListIndex)<br />

ImgVista.Picture = LoadPicture(ARCHIVO)<br />

La instrucción On Error activa una rutina de control de<br />

errores y especifica la ubicación de la misma en un<br />

procedimiento.<br />

LA FUNCIÓN MSGBOX<br />

A menudo habrá situaciones en las cuales tendrá que<br />

presentar algún mensaje (por ejemplo una pregunta) y en función<br />

Pág. 93


de la respuesta del usuario se ejecutará una determinada<br />

acción.<br />

La función MsgBox() muestra un cuadro de diálogo<br />

predefinido y retorna un valor de tipo entero dependiendo del<br />

botón seleccionado por el usuario. Su sintaxis es de la<br />

siguiente forma:<br />

VALOR = MsgBox(MENSAJE [, BOTÓN + ICONO, TÍTULO])<br />

Donde MENSAJE se refiere a una expresión de cadena que se<br />

muestra como mensaje en el cuadro de diálogo.<br />

BOTÓN es una expresión numérica que se refiere al tipo y<br />

cantidad de botones a utilizar.<br />

ICONO es una expresión numérica que se refiere al estilo<br />

de icono que se va ha utilizar.<br />

TÍTULO es una texto que se mostrará en la barra de título<br />

de la caja de diálogo.<br />

Tipo de botón<br />

Valor Botón Nombre<br />

0 Aceptar vbOKOnly<br />

Pág. 94


1 Aceptar y Cancelar vbOKCancel<br />

2 Anular, Reintentar, Ignorar vbAbortRetryIgnore<br />

3 Sí, No y Cancelar vbYesNoCancel<br />

4 Sí y No vbYesNo<br />

5 Reintentar y Cancelar vbRetryCancel<br />

Tipo de icono<br />

Valor Icono Nombre<br />

16 Mensaje crítico vbCritical<br />

32 Signo de interrogación vbQuestion<br />

48 Signo de exclamación vbExclamation<br />

64 Signo de información vbInformation<br />

Valores retornados<br />

Valor Botón Nombre<br />

1 Aceptar vbOK<br />

2 Cancelar vbCancel<br />

3 Anular vbAbort<br />

4 Reintentar vbRetry<br />

5 Ignorar vbIgnore<br />

6 Sí vbYes<br />

7 No vbNo<br />

Como ejemplo vamos a construir un formulario que presente<br />

un botón “Salir”, de tal forma que cuando el usuario pulse<br />

dicho botón se presente el siguiente mensaje:<br />

Pág. 95


En caso de que el usuario elija la opción “Sí”, la<br />

aplicación debe terminar. En caso contrario, es decir si el<br />

usuario elige la opción “No”, se debe proseguir con la<br />

aplicación.<br />

Para el desarrollo del presente ejemplo, proceda a ubicar<br />

sobre el formulario un botón de comando (CmdSalir), a<br />

continuación ingresar el siguiente código:<br />

Private Sub CmdSalir_Click()<br />

End Sub<br />

Dim RESP As Integer<br />

RESP = MsgBox(“Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Pregunta”)<br />

If RESP = vbYes Then<br />

End If<br />

End<br />

Para ilustrar mejor el uso de la función MsgBox() vamos a<br />

desarrollar la siguiente aplicación que permite mostrar los<br />

diferentes tipos de botones e iconos generados por la función.<br />

Pág. 96


Para ello proceda a ubicar los siguientes controles en el<br />

formulario:<br />

indica:<br />

Form1<br />

List1<br />

List2<br />

Command1<br />

2 cuadros de lista<br />

1 botón de comando<br />

En seguida proceda a establecer las propiedades según se<br />

Nombre FrmFuncionMsgBox<br />

BorderStyle 3-Fixed Dialog<br />

Caption Función MsgBox<br />

Nombre LstBoton<br />

Nombre LstIcono<br />

Pág. 97


Nombre CmdMensaje<br />

Caption &Mensaje<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub Form_Load()<br />

End Sub<br />

LstBoton.AddItem “Aceptar”<br />

LstBoton.AddItem “Aceptar y Cancelar”<br />

LstBoton.AddItem “Anular, Reintentar, Ignorar”<br />

LstBoton.AddItem “Sí, No y Cancelar”<br />

LstBoton.AddItem “Sí y No”<br />

LstBoton.AddItem “Reintentar y Cancelar”<br />

LstIcono.AddItem “Mensaje crítico”<br />

LstIcono.AddItem “Signo de interrogación”<br />

LstIcono.AddItem “Signo de exclamación”<br />

LstIcono.AddItem “Signo de información”<br />

Private Sub CmdMensaje_Click()<br />

End Sub<br />

Dim RESP As Integer, BOTON As Integer, ICONO As Integer<br />

BOTON = LstBoton.ListIndex<br />

ICONO = (LstIcono.ListIndex + 1) * 16<br />

RESP = MsgBox(“Hola Mundo”, BOTON + ICONO, “Ejemplo”)<br />

Pág. 98


CAPÍTULO 5<br />

EL FORMULARIO<br />

Un formulario es un objeto contenedor que sirve para<br />

diseñar la interfaz de usuario. En el formulario se colocan los<br />

controles para que el usuario pueda interactuar con la<br />

aplicación de una manera fácil e intuitiva.<br />

Los formularios tienen sus propias propiedades, eventos y<br />

métodos con los que se puede controlar su apariencia y<br />

comportamiento, muchos de los cuales ya han sido utilizados en<br />

las aplicaciones de los capítulos anteriores y que a<br />

continuación pasamos a describir.<br />

Pág. 99


Propiedad Descripción<br />

AutoRedraw Especifica si se activa el redibujado<br />

automático del formulario.<br />

BackColor Especifica el color de fondo del formulario.<br />

BorderStyle Especifica un estilo de borde para el<br />

formulario.<br />

Caption Especifica el texto que se muestra en la<br />

barra de título del formulario.<br />

ControlBox Especifica si aparece un icono de menú<br />

ForeColor<br />

desplegable en el ángulo superior izquierdo<br />

del formulario.<br />

Especifica el color de primer plano utilizado<br />

para mostrar texto sobre el formulario.<br />

Height Especifica el alto del formulario. Se mide en<br />

“twips”.<br />

Icon Especifica el icono que se muestra para un<br />

formulario.<br />

MaxButton Especifica si el formulario tiene un botón<br />

Maximizar.<br />

MinButton Especifica si el formulario tiene un botón<br />

Minimizar.<br />

Picture Especifica el archivo de imagen que se va ha<br />

mostrar como fondo para el formulario.<br />

StartUpPosition Especifica la posición del formulario la<br />

Visible<br />

primera vez que se ejecuta.<br />

Establece si el formulario es visible o está<br />

oculto.<br />

Width Especifica el ancho del formulario. Se mide<br />

en “twips”.<br />

WindowState Establece el estado del formulario (normal,<br />

minimizado o maximizado).<br />

Pág. 100


Nota<br />

Un twip es una unidad independiente de la pantalla<br />

utilizada para asegurar que la colocación y la proporción de<br />

los elementos de la pantalla de la aplicación son los mismos en<br />

todos los sistemas de pantallas. Un twip es igual a 1/20 de un<br />

punto de impresora. Existen aproximadamente 1440 twips en una<br />

pulgada o 567 twips en un centímetro.<br />

Los eventos a los que responde un formulario son los<br />

siguientes:<br />

Evento Descripción<br />

Activate Ocurre cuando el formulario se convierte en<br />

ventana activa.<br />

Deactivate Ocurre cuando el formulario deja de ser la<br />

ventana activa.<br />

Load Ocurre cuando el formulario se carga en la<br />

memoria.<br />

MouseDown Ocurre cuando el usuario pulsa el botón<br />

derecho del ratón sobre el formulario.<br />

QueryUnload Ocurre antes de iniciarse el proceso de<br />

descarga<br />

Unload).<br />

del formulario (antes del evento<br />

Resize Ocurre cuando se muestra primero el<br />

Unload<br />

formulario o se cambian sus dimensiones.<br />

Ocurre cuando el formulario se descarga de la<br />

memoria.<br />

Pág. 101


Los métodos que se pueden utilizar con un formulario son<br />

los siguientes:<br />

Método Descripción<br />

Hide Oculta un formulario.<br />

PopupMenu Presenta un menú popup en la posición actual<br />

del ratón.<br />

Print Imprime un valor sobre el formulario.<br />

Refresh Vuelve a pintar un formulario y actualiza<br />

Show<br />

todos los valores contenidos en él.<br />

Muestra un formulario y determina si es modal<br />

o carece de modo. Si el formulario a mostrar<br />

no está cargado <strong>Visual</strong> <strong>Basic</strong> lo carga<br />

automáticamente.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

utilice dos formularios. Desde el primer formulario el usuario<br />

podrá ir al segundo formulario y viceversa.<br />

Pág. 102


Para el desarrollo de la presente aplicación proceda a<br />

crear un nuevo proyecto. Seguidamente debe ubicar dos botones<br />

de comando en el formulario. Luego establezca las siguientes<br />

propiedades:<br />

Form1<br />

Command1<br />

Command2<br />

Nombre Form1<br />

Caption Primer formulario<br />

Nombre CmdIr<br />

Caption &Ir<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Seguidamente procede a ingresar el código que se muestra a<br />

continuación:<br />

Private Sub CmdIr_Click()<br />

End Sub<br />

Form2.Show<br />

Form<strong>1.</strong>Hide<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Pág. 103


Luego debe añadir un formulario adicional al proyecto.<br />

Para tal fin, seleccione el menú Proyecto y elija la opción<br />

Agregar formulario.<br />

Del cuadro de diálogo que se presenta elija el icono<br />

Formulario y haga click en el botón “Abrir”, tal como se indica<br />

en la figura. En ese instante se añadirá un nuevo formulario al<br />

proyecto. Luego, proceda a ubicar un botón de comandos en el<br />

formulario que acaba de añadir y establezca las siguientes<br />

propiedades:<br />

Form2<br />

Nombre Form2<br />

Caption Segundo formulario<br />

ControlBox False<br />

Pág. 104


Command2<br />

Nombre CmdVolver<br />

Caption &Volver<br />

En seguida proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub CmdVolver_Click()<br />

End Sub<br />

Form<strong>1.</strong>Show<br />

Form2.Hide<br />

ESTILOS DE FORMULARIO<br />

<strong>Visual</strong> <strong>Basic</strong> cuenta con seis diferentes estilos de<br />

formulario, cuya descripción es la siguiente:<br />

Valor Estilo Descripción<br />

0 None No presenta ningún borde.<br />

1 Fixed Single Puede incluir un Menú de control,<br />

una Barra de título , un botón<br />

Maximizar y un botón Minimizar.<br />

Sólo puede cambiar de tamaño<br />

mediante los botones Maximizar y<br />

2 Sizable<br />

Minimizar.<br />

(Predeterminado). Puede cambiar de<br />

tamaño mediante cualquiera de los<br />

elementos opcionales de borde<br />

indicados para Fixed Single.<br />

Pág. 105


Valor Estilo Descripción<br />

3 Fixed Dialog Puede incluir un Menú de control y<br />

una Barra de título, pero no los<br />

botones Maximizar ni Minimizar. No<br />

puede cambiar de tamaño.<br />

4 Fixed ToolWindow Sólo muestra el botón Cerrar y el<br />

texto de la barra de título aparece<br />

5 Sizable ToolWindow<br />

con un tamaño de fuente reducido.<br />

No puede cambiar su tamaño.<br />

Sólo muestra el botón Cerrar y el<br />

texto de la barra de título aparece<br />

con un tamaño de fuente reducido.<br />

Puede cambiar de tamaño.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

permita representar los diferentes estilos de formulario de<br />

<strong>Visual</strong> <strong>Basic</strong>.<br />

Pág. 106


Para el desarrollo de la presente aplicación proceda a<br />

crear un nuevo proyecto y luego ubique los siguientes controles<br />

en el formulario:<br />

1 cuadro de lista<br />

2 botones de comando<br />

Luego debe establecer las propiedades que se indican a<br />

continuación:<br />

Form1<br />

List1<br />

Command1<br />

Command2<br />

Nombre FrmPrincipal<br />

Caption Estilos de formulario<br />

BorderStyle 3-Fixed Dialog<br />

Nombre LstTipoForm<br />

List 0-None<br />

1-Fixed Single<br />

2-Sizable<br />

3-Fixed Dialog<br />

4-Fixed ToolWindow<br />

5-Sizable ToolWindow<br />

Nombre CmdMostrar<br />

Caption &Mostrar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Pág. 107


Seguidamente procede a ingresar el código que se muestra a<br />

continuación:<br />

Private Sub Form_Load()<br />

End Sub<br />

Load FrmNone<br />

Load FrmFixedSingle<br />

Load FrmSizable<br />

Load FrmFixedDialog<br />

Load FrmFixedToolWindow<br />

Load FrmSizableToolWindow<br />

Private Sub CmdMostrar_Click()<br />

End Sub<br />

Dim OP As Integer<br />

OP = LstTipoForm.ListIndex<br />

Select Case OP<br />

Case 0 : FrmNone.Show vbModal<br />

Case 1 : FrmFixedSingle.Show vbModal<br />

Case 2 : FrmSizable.Show vbModal<br />

Case 3 : FrmFixedDialog.Show vbModal<br />

Case 4 : FrmFixedToolWindow.Show vbModal<br />

Case 5 : FrmSizableToolWindow.Show vbModal<br />

Case Else<br />

End Select<br />

MsgBox “Debe seleccionar estilo de formulario”<br />

Pág. 108


Private Sub LstTipoForm_DblClick()<br />

End Sub<br />

Call CmdMostrar_Click<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Seguidamente proceda a añadir los formularios para las<br />

diferentes opciones del cuadro de lista. Cambie los nombres de<br />

los formularios según se indica:<br />

Formulario Nombre<br />

Form2 FrmNone<br />

Form3 FrmFixedSingle<br />

Form4 FrmSizable<br />

Form5 FrmFixedDialog<br />

Form6 FrmFixedToolWindow<br />

Form7 FrmSizableToolWindow<br />

Luego debe activar el formulario FrmNone, ubicar un botón<br />

de comandos sobre el mismo y establecer las siguientes<br />

propiedades:<br />

Form2<br />

Nombre FrmNone<br />

BorderStyle 0-None<br />

Caption None<br />

Pág. 109


Command1<br />

Nombre CmdVolver<br />

Caption &Volver<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el código que se muestra a continuación:<br />

Private Sub CmdVolver_Click()<br />

End Sub<br />

Unload Me<br />

Para concluir con el diseño de la aplicación, simplemente<br />

repita el procedimiento anterior para los demás tipos de<br />

formularios.<br />

Como habrá podido observar, al mostrar un formulario<br />

mediante el método Show podemos hacerlo de forma modal<br />

(vbModal) o no modal (opción por defecto). Un formulario modal<br />

es aquel que necesita cerrarse antes de pasar el enfoque a otro<br />

formulario. Un formulario no modal no requiere cerrarse para<br />

pasar el enfoque a otro formulario.<br />

PASANDO VALORES ENTRE FORMULARIOS<br />

Muchas veces se requieren pasar valores de un formulario a<br />

otro, esto se puede realizar mediante el uso módulos estándar,<br />

los cuales son contenedores de procedimientos y declaraciones a<br />

los que tienen acceso otros módulos de la aplicación.<br />

Pág. 110


Como ejemplo vamos a construir la siguiente aplicación, la<br />

cual envía un mensaje de texto del primer formulario hacia el<br />

segundo formulario.<br />

Para el desarrollo de la presente aplicación proceda a<br />

crear un nuevo proyecto y añada un formulario adicional, de tal<br />

forma que tenga los formularios Form1 y Form2. Seguidamente<br />

ubicar los siguientes controles:<br />

Form1 Form2<br />

Text1 TxtMensaje1 Text1 TxtMensaje2<br />

Command1 CmdEnviar Command1 CmdRecibir<br />

Command2 CmdSalir Command2 CmdVolver<br />

A continuación proceda a ingresar el código que se indica<br />

para el primer formulario (Form1):<br />

Pág. 111


Private Sub CmdEnviar_Click()<br />

End Sub<br />

Mensaje = TxtMensaje1<br />

Form<strong>1.</strong>Hide<br />

Form2.Show<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Para el segundo formulario (Form2) proceda a ingresar el<br />

código siguiente:<br />

Private Sub CmdRecibir_Click()<br />

End Sub<br />

TxtMensaje2 = Mensaje<br />

Private Sub CmdVolver_Click()<br />

End Sub<br />

Form2.Hide<br />

Form<strong>1.</strong>Show<br />

Seguidamente debe añadir un módulo estándar al proyecto,<br />

para ello, seleccione el Menú Proyecto y elija la opción<br />

Agregar módulo, se debe presentar un cuadro de diálogo similar<br />

a la figura mostrada, en el cual debe dar click en el botón<br />

“Abrir”.<br />

Pág. 112


Seguidamente proceda a declarar la variable Mensaje como<br />

“pública” en la sección de declaraciones del módulo que acaba<br />

de añadir:<br />

Una variable pública (Public) es una variable que se<br />

declara a nivel de módulo y se le puede acceder desde cualquier<br />

otro módulo.<br />

Pág. 113


FORMULARIOS MDI<br />

Un formulario MDI (Interfaz de Documentos Múltiples) es<br />

una ventana que actúa como fondo de una aplicación y es el<br />

contenedor (ventana padre) de otros formularios (ventanas<br />

hijas).<br />

En una aplicación MDI pueden haber varias ventanas hijas,<br />

pero sólo una ventana padre por aplicación. Para que una<br />

ventana actúe como hija debe tener su propiedad MDIChild<br />

establecida a True.<br />

Como ejemplo vamos a desarrollar una aplicación MDI que<br />

incluya tres ventanas hijas. Para tal fin proceda a crear un<br />

nuevo proyecto y seguidamente agregar dos formularios (simples)<br />

al mismo.<br />

Pág. 114


No olvide establecer la propiedad MDIChild de los<br />

formularios Form1, Form2 y Form3 a True.<br />

Luego, debemos agregar el formulario MDI, para ello<br />

acceder al Menú Proyecto y elegir la opción Agregar formulario<br />

MDI, del cuadro de diálogo que se presenta hacer click en el<br />

botón “Abrir”.<br />

A continuación dar doble click sobre el formulario MDI e<br />

ingresar el siguiente código:<br />

Private Sub MDIForm_Load()<br />

End Sub<br />

Form<strong>1.</strong>Show<br />

Form2.Show<br />

Form3.Show<br />

Pág. 115


Ahora sólo tiene que indicarle a <strong>Visual</strong> <strong>Basic</strong> que el<br />

formulario de arranque (inicial) será el formulario MDI. Para<br />

ello vaya al Menú Proyecto y elija la opción Propiedades de<br />

Proyecto. En el cuadro combinado “Objeto inicial” seleccionar<br />

MDIForm1, tal como se indica en la figura:<br />

Eso es todo, ahora simplemente tiene que ejecutar su<br />

aplicación.<br />

Cabe destacar que en los formularios MDI por lo general no<br />

se pueden incluir controles, debido a ello se suele trabajar<br />

con menús de opciones o barras de herramientas para indicar<br />

alguna acción a realizar.<br />

Pág. 116


CREACIÓN DE MENÚS<br />

Un menú es un conjunto de opciones que se presentan al<br />

usuario, entre las cuales debe elegir una de ellas. Dependiendo<br />

de la decisión se realizarán una serie de acciones.<br />

Para diseñar un menú cualquiera dar click derecho sobre el<br />

formulario y del menú emergente que se presenta elegir la<br />

opción Editor de menús.<br />

Pág. 117


<strong>Basic</strong>.<br />

En seguida se ha de presentar el Editor de menús de <strong>Visual</strong><br />

Para crear un menú, tener en cuenta los siguiente<br />

procedimientos:<br />

• Ingresar el Editor de menús.<br />

• Introducir el título del menú en el cuadro de texto Caption,<br />

el cual aparecerá en la barra de menús.<br />

• Introducir un nombre para el menú en el cuadro de texto Name,<br />

el cual será utilizado en el código para referirse al menú.<br />

• Introducir los elementos que componen el menú, para ello<br />

escriba en los cuadros de texto Caption y Name el título y el<br />

nombre del correspondiente elemento del menú.<br />

Pág. 118


• Para diferenciar un elemento del menú del propio menú, hay<br />

que sangrar el título del elemento, para tal fin,<br />

selecciónelo y haga click en el botón flecha hacia la derecha<br />

( ).<br />

• Un elemento de menú puede ser una orden (si el elemento<br />

siguiente aparece sangrado al mismo nivel) o un submenú (si<br />

el elemento siguiente aparece sangrado un nivel más).<br />

• Utilizando separadores puede agrupar las órdenes en función<br />

de lo que realizan. Para insertar un separador, escriba un<br />

único guión (-) en el cuadro Caption del Editor de menús.<br />

Tiene que especificar también un nombre para el separador.<br />

• Para añadir un acelerador (una tecla o combinación de teclas<br />

que permiten activar un menú), utilizar la propiedad<br />

Shortcut.<br />

• La propiedad Checked es útil para indicar si una orden está<br />

activa o no lo está. Cuando se especifica esta propiedad<br />

aparece una marca (3) a la izquierda del elemento de menú.<br />

• La propiedad Enabled es útil para desactivar una orden en un<br />

momento en el cual no tiene sentido que esté activa.<br />

• La propiedad Visible es útil cuando durante la ejecución se<br />

desea ocultar un elemento de menú.<br />

• Cerrar el Editor de menús, para ello una vez que haya<br />

finalizado su diseño pulse el botón “Aceptar”.<br />

Pág. 119


Como ejercicio intente construir el menú mostrado en la<br />

figura anterior.<br />

Caption Name ShortCut<br />

&Archivo MnuArchivo Ninguno<br />

. . . &Artículo MnuArchivoArticulo Ninguno<br />

. . . &Cliente MnuArchivoCliente Ninguno<br />

. . . &Vendedor MnuArchivoVendedor Ninguno<br />

. . . - MnuArchivoLinea Ninguno<br />

. . . &Salir MnuArchivoSalir Ctrl + X<br />

&Proceso MnuProceso Ninguno<br />

. . . &Pedido MnuProcesoPedido Ninguno<br />

. . . &Facturación MnuProcesoFacturacion Ninguno<br />

&Reporte MnuReporte Ninguno<br />

. . . &Registro de ventas MnuReporteRegVentas Ninguno<br />

. . . Catálogo de &artículos<br />

Ninguno<br />

. . . - MnuReporteLinea Ninguno<br />

. . . &Cliente del mes MnuReporteClienteMes Ninguno<br />

. . . &Vendedor del mes MnuReporteVendMes Ninguno<br />

Ay&uda MnuAyuda Ninguno<br />

. . . &Contenido MnuAyudaContenido Ninguno<br />

. . . &Indice MnuAyudaIndice Ninguno<br />

. . . &Búsqueda MnuAyudaBusqueda Ninguno<br />

. . . - MnuAyudaLinea Ninguno<br />

. . . &Acerca de MnuAyudaAbout Ninguno<br />

Pág. 120


Para probar el menú que acaba de crear, ingrese el<br />

siguiente código:<br />

Private Sub MnuArchivoArticulo_Click()<br />

End Sub<br />

MsgBox “Seleccionó la opción Artículo”<br />

Private Sub MnuArchivoCliente_Click()<br />

End Sub<br />

MsgBox “Seleccionó la opción Cliente”<br />

Private Sub MnuArchivoVendedor_Click()<br />

End Sub<br />

MsgBox “Seleccionó la opción Vendedor”<br />

Private Sub MnuArchivoSalir_Click()<br />

End Sub<br />

Unload Me<br />

Private Sub MDIForm_Unload(Cancel As Integer)<br />

End Sub<br />

Dim RESP As Integer<br />

RESP = MsgBox(“¿Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Pregunta”)<br />

If RESP = vbYes Then<br />

End<br />

Else: Cancel = True<br />

End If<br />

Pág. 121


Luego al ejecutar su aplicación y seleccionar el menú<br />

Archivo, opción Artículo, el resultado será similar a la figura<br />

mostrada:<br />

Hasta ahora hemos programado la salida de una aplicación,<br />

asociando el código al botón “Salir”. Sin embargo, cuando el<br />

usuario hace click en el botón “Cerrar” de la barra de título o<br />

en la opción “Salir” del Menú de control del formulario, el<br />

código escrito para el botón “Salir” es ignorado.<br />

Para remediar esta situación, en el ejemplo anterior<br />

cuando el usuario pulsa el botón “Salir”, se invoca al evento<br />

Unload. La palabra reservada “Me” proporciona una forma de<br />

referirse al formulario desde donde se está ejecutando el<br />

código.<br />

Recordar que el evento Unload del formulario se<br />

desencadena cuando el usuario intenta cerrar el formulario<br />

mediante cualquiera de las formas descritas anteriormente.<br />

Para determinar si ocurre la descarga del formulario<br />

utilice el parámetro Cancel. Si Cancel es False ocurre la<br />

descarga, si Cancel es True impide que el formulario se quite.<br />

CREACIÓN DE UNA BARRA DE HERRAMIENTAS<br />

Pág. 122


Una barra de herramientas contiene botones con las<br />

opciones más utilizadas de un menú, de tal manera que el<br />

usuario haciendo click en dicho control activaría la opción<br />

indicada de una manera más rápida.<br />

Para crear una barra de herramientas debemos utilizar dos<br />

controles que no están en la lista de controles estándar, por<br />

tanto debemos agregar dichos controles que se encuentran en el<br />

componente Microsoft Windows Common Controls 6.0, tal como se<br />

indica a continuación:<br />

Pág. 123


Como ejemplo, vamos a crear la barra de herramientas de la<br />

figura mostrada:<br />

Para ello, ubicar un control ImageList sobre el<br />

formulario, para establecer sus propiedades dar click derecho<br />

sobre el control y elija la opción Propiedades.<br />

Pág. 124


Se ha de presentar un cuadro de diálogo similar a la<br />

figura mostrada:<br />

Activar la ficha Imágenes y pulsar el botón “Insertar<br />

imagen” para seleccionar las imágenes que se incluirán en el<br />

control ImageList.<br />

Para el ejemplo, debe incluir ocho imágenes que<br />

corresponden a cada uno de los botones de la barra de<br />

herramientas.<br />

Concluido el proceso anterior, proceda a ubicar un control<br />

Toolbar sobre el formulario. Luego hacer click derecho sobre<br />

dicho control y del menú emergente que se presenta seleccionar<br />

la opción Propiedades. Del cuadro de diálogo que se presenta en<br />

la ficha General establecer las siguientes propiedades:<br />

Pág. 125


Luego, en la ficha Botones pulse el botón “Insertar<br />

botón”. En el cuadro de texto Image se debe indicar un número<br />

que corresponde al orden de imagen a mostrar.<br />

Pág. 126


El lector debe continuar con este proceso hasta completar<br />

los botones restantes, según:<br />

Index ToolTipText Image<br />

1 Artículo 1<br />

2 Cliente 2<br />

3 Vendedor 3<br />

4 Pedido 4<br />

5 Facturación 5<br />

6 Registro de ventas 6<br />

7 Catálogo de artículos 7<br />

8 Ayuda 8<br />

Como el código a ejecutar tiene que ser el mismo cuando el<br />

usuario elija una opción del menú o de un click sobre un botón<br />

de la barra de herramientas se pueden programar procedimientos<br />

de usuario que realicen dichas tareas, luego se deben invocar a<br />

estos procedimientos tanto para las opciones del menú como para<br />

la barra de herramientas.<br />

Sin embargo, para el ejemplo el código es muy sencillo, ya<br />

que sólo muestra un mensaje con la opción seleccionada (esto<br />

por razones de simplicidad). Para probar la funcionalidad de la<br />

barra de herramientas que acaba de crear ingrese el siguiente<br />

código:<br />

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)<br />

Pág. 127


Select Case Button.Index<br />

End Sub<br />

End Select<br />

Case 1: MsgBox “Seleccionó la opción Artículo”<br />

Case 2: MsgBox “Seleccionó la opción Cliente”<br />

Case 3: MsgBox “Seleccionó la opción Vendedor”<br />

Case 4: MsgBox “Seleccionó la opción Pedido”<br />

Case 5: MsgBox “Seleccionó la opción Facturación”<br />

Case 6: MsgBox “Seleccionó la opción Registro de ventas”<br />

Case 7: MsgBox “Seleccionó opción Catálogo de artículos”<br />

Case 8: MsgBox “Seleccionó la opción Ayuda”<br />

El evento ButtonClick se dispara cuando el usuario hace<br />

click sobre un botón de la barra de herramientas. La propiedad<br />

Index permite identificar el número de botón pulsado.<br />

CREACIÓN DE UNA BARRA DE ESTADO<br />

Una barra de estado es un marco que se ubica en la parte<br />

inferior del formulario y puede contener varios paneles que<br />

informan al usuario acerca del estado de la aplicación. Para<br />

crear una barra de estado utilizar el control StatusBar, el<br />

cual forma de los controles personalizados que se encuentran en<br />

el componente Microsoft Windows Common Controls 6.0.<br />

Como ejemplo vamos a crear una barra de estado similar a<br />

la de la figura mostrada:<br />

Pág. 128


Para ello ubicar un control StatusBar sobre el formulario,<br />

dar click derecho sobre el mismo y en la ficha Paneles incluir<br />

una imagen para la hora del sistema.<br />

Pág. 129


El resto de propiedades se establecerán mediante código al<br />

momento de la carga del formulario.<br />

Private Sub MDIForm_Load()<br />

Dim I As Integer<br />

For I = 1 To 2<br />

Next<br />

End Sub<br />

StatusBar<strong>1.</strong>Panels.Add ' Se agregan 2 paneles más<br />

With StatusBar<strong>1.</strong>Panels<br />

End With<br />

.Item(1).Style = sbrTime<br />

.Item(2).Style = sbrCaps<br />

.Item(3).Style = sbrIns<br />

La propiedad Style permite mostrar el estado de las<br />

teclas, la hora y la fecha del sistema con un mínimo de código.<br />

Constante Valor Descripción<br />

sbrText 0 (Predeterminado). Texto o mapa de bits.<br />

sbrCaps 1 Tecla BLOQ MAYÚS.<br />

sbrNum 2 Tecla BLOQ NÚM.<br />

sbrIns 3 Tecla INS.<br />

sbrScrl 4 Tecla BLOQ DESPL.<br />

sbrTime 5 Muestra la hora actual con el formato del<br />

sistema.<br />

sbrDate 6 Muestra la fecha actual con el formato<br />

del sistema.<br />

Pág. 130


CREACIÓN DE UN MENÚ CONTEXTUAL<br />

Un menú contextual es un menú emergente (flotante) que se<br />

muestra sobre un formulario, independiente de la barra de<br />

menús. Para mostrar un menú contextual el usuario debe pulsar<br />

el botón derecho del ratón sobre el formulario.<br />

A menudo querrá usar un menú contextual para tener acceso<br />

a opciones que no se encuentran disponibles en la barra de<br />

menús. Para crear un menú que no se presente en la barra de<br />

menús, haga invisible un elemento de menú de nivel superior en<br />

tiempo de diseño (asegúrese de que la casilla de verificación<br />

Visible del Editor de menús no esté activada). Cuando <strong>Visual</strong><br />

<strong>Basic</strong> presenta un menú emergente, pasa por alto la propiedad<br />

Visible del menú de nivel superior especificado.<br />

Pág. 131


Para crear el menú contextual de la figura, debe ingresar<br />

al Editor de menús y añadir lo siguiente:<br />

Caption Name Visible<br />

&Herramientas MnuTools<br />

. . . Calculadora MnuToolsCalc 3<br />

. . . Calendario MnuToolsCalen 3<br />

. . . Solitario MnuToolsSol 3<br />

Seguidamente proceda a ingresar el código que se indica a<br />

continuación:<br />

Private Sub MDIForm_MouseDown(Button As Integer, _<br />

End Sub<br />

Shift As Integer, X As Single, Y As Single)<br />

If Button = vbRightButton Then<br />

End If<br />

PopupMenu MnuTools<br />

Private Sub MnuToolsCalc_Click()<br />

End Sub<br />

Dim I<br />

I = Shell(“C:\WINDOWS\CALC.EXE”, 1)<br />

Private Sub MnuToolsCalen_Click()<br />

End Sub<br />

FrmCalendario.Show<br />

Pág. 132


Private Sub MnuToolsSol_Click()<br />

End Sub<br />

Dim I<br />

I = Shell(“C:\WINDOWS\SOL.EXE”, 1)<br />

En el ejemplo anterior se asume que existe otro formulario<br />

de nombre FrmCalendario. Este puede ser construido usando el<br />

control MonthView.<br />

La función Shell ejecuta un programa ejecutable y devuelve<br />

un tipo Variant (Double) que representa la identificación de la<br />

tarea del programa si se ha ejecutado con éxito, en caso<br />

contrario devuelve cero.<br />

Pág. 133


CAPÍTULO 6<br />

CONTROLES ACTIVEX<br />

Los controles ActiveX son objetos que no forman parte del<br />

conjunto de controles estándar de <strong>Visual</strong> <strong>Basic</strong>, sino más bien<br />

han sido desarrollados por terceras personas.<br />

Los controles ActiveX existen como archivos independientes<br />

con extensión .OCX y deben ser cargados antes de utilizarse.<br />

Para ello ingresar al Menú Proyecto y elija la opción<br />

Componentes.<br />

Pág. 134


CONTROL ANIMATION<br />

El control Animation permite reproducir archivos de<br />

extensión .AVI que no tengan sonido para crear animaciones.<br />

Para agregar este control debe seleccionar el componente<br />

Microsoft Windows Common Controls-2 6.0.<br />

Propiedad Descripción<br />

AutoPlay Especifica si el archivo AVI se reproducirá<br />

automáticamente al cargarse el control.<br />

Método Descripción<br />

Close Cierra el archivo AVI abierto actualmente.<br />

Open Permite abrir el archivo AVI.<br />

Play Reproduce<br />

Animation.<br />

el archivo AVI en el control<br />

Stop Termina la reproducción del archivo AVI.<br />

Como ejemplo vamos a desarrollar un formulario que permita<br />

reproducir un archivo AVI, tal como se muestra en la figura:<br />

Pág. 135


Para ello crear un nuevo formulario y agregar un control<br />

Animation (Animation1) y dos botones de comando (CmdIniciar y<br />

CmdTerminar, respectivamente). Luego ingrese el código que se<br />

muestra:<br />

Private Sub CmdIniciar_Click()<br />

End Sub<br />

Dim RUTA As String<br />

RUTA = “C:\Archivos de programa\Microsoft <strong>Visual</strong> Studio\”<br />

RUTA = RUTA & “Common\Graphics\Videos\Filenuke.avi”<br />

Animation<strong>1.</strong>Open (RUTA)<br />

Animation<strong>1.</strong>Play<br />

Private Sub CmdTerminar_Click()<br />

Animation<strong>1.</strong>Close<br />

End<br />

End Sub<br />

CONTROL COMMONDIALOG<br />

El control CommonDialog proporciona un conjunto de cuadros<br />

de diálogo estándar que permiten realizar las operaciones más<br />

comúnmente empleadas en el diseño de aplicaciones, como abrir y<br />

guardar archivos, seleccionar colores y fuentes, imprimir, etc.<br />

Para agregar este control seleccionar el componente Microsoft<br />

Common Dialog Control 6.0.<br />

Pág. 136


Propiedad Descripción<br />

Color Especifica el color seleccionado.<br />

FileName Especifica la ruta y nombre del archivo<br />

seleccionado.<br />

Filter Especifica el tipo de archivos que se han de<br />

mostrar en un cuadro de diálogo Abrir o<br />

FilterIndex<br />

Guardar como.<br />

Especifica el filtro predeterminado para un<br />

cuadro de diálogo Abrir o Guardar como, en<br />

caso se esté utilizando varios filtros.<br />

Método Descripción<br />

ShowColor Presenta la paleta de colores.<br />

ShowFont Presenta el cuadro de diálogo Fuentes.<br />

ShowHelp Presenta la ayuda de Windows.<br />

ShowOpen Presenta el cuadro de diálogo Abrir.<br />

ShowPrinter Presenta el cuadro de diálogo Imprimir.<br />

ShowSave Presenta el cuadro de diálogo Guardar como.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

permite cambiar el color de fondo de un formulario en tiempo de<br />

ejecución. Para ello el usuario debe dar click en el botón<br />

“Cambiar color” y en seguida se presentará la paleta de colores<br />

de donde debe elegir el color deseado, tal como se muestra en<br />

la figura siguiente:<br />

Pág. 137


Para ello crear un nuevo formulario, agregarle un botón de<br />

comando (CmdCambiarColor) y un control CommonDialog. Luego<br />

ingresar el siguiente código:<br />

Private Sub CmdCambiarColor_Click()<br />

End Sub<br />

CommonDialog<strong>1.</strong>ShowColor<br />

Form<strong>1.</strong>BackColor = CommonDialog<strong>1.</strong>Color<br />

Como siguiente ejemplo vamos a desarrollar una aplicación<br />

que permita mostrar el contenido de un archivo JPG. Este deberá<br />

ser seleccionado por el usuario de un cuadro de diálogo Abrir,<br />

tal como se indica en la figura:<br />

Pág. 138


Al hacer click en el botón “Abrir”, el archivo<br />

seleccionado debe ser mostrado en el formulario:<br />

Para el diseño de esta aplicación crear un nuevo<br />

formulario y ubicar un botón de comando (CmdAbrirArchivo), un<br />

control imagen y un control CommonDialog.<br />

Pág. 139


Seguidamente ingrese el código que se indica a<br />

continuación:<br />

Private Sub CmdAbrirArchivo_Click()<br />

End Sub<br />

Dim FILTRO As String, FILE As String<br />

FILTRO = “Imágenes JPEG (*.JPG)|*.JPG”<br />

CommonDialog<strong>1.</strong>Filter = FILTRO<br />

CommonDialog<strong>1.</strong>ShowOpen<br />

FILE = CommonDialog<strong>1.</strong>FileName<br />

Image<strong>1.</strong>Picture = LoadPicture(FILE)<br />

CONTROL MARCHOSO<br />

El control Marchoso tiene como función reproducir archivos<br />

GIF animados. Para agregar este control seleccionar el<br />

componente Marchoso ActiveX Control Module. Este control fue<br />

creado en <strong>Visual</strong> <strong>Basic</strong> y si no lo tiene en su disco duro lo<br />

puede bajar de Internet.<br />

Propiedad Descripción<br />

FileName Especifica la ruta y nombre del archivo GIF<br />

animado.<br />

A manera de ejemplo vamos a diseñar un formulario que<br />

permita mostrar archivos GIF animados.<br />

Pág. 140


Para ello proceda a crear un nuevo formulario y ubicar un<br />

botón de comando (CmdVerGIFAnimado), un control Marchoso y un<br />

control CommonDialog. Luego, ingresar el siguiente código:<br />

Private Sub CmdVerGIFAnimado_Click()<br />

End Sub<br />

Dim FILTRO As String, FILE As String<br />

FILTRO = “Archivos GIF Animados (*.GIF)|*.GIF”<br />

CommonDialog<strong>1.</strong>Filter = FILTRO<br />

CommonDialog<strong>1.</strong>ShowOpen<br />

FILE = CommonDialog<strong>1.</strong>FileName<br />

Marchoso<strong>1.</strong>FileName = FILE<br />

CONTROL HIERARCHICAL FLEXGRID<br />

El control Hierarchical FlexGrid presenta una cuadrícula<br />

la cual permite mostrar datos en forma de celdas. Una celda es<br />

la región formada por la intersección de una fila y una<br />

columna.<br />

Pág. 141


Para agregar este control debe seleccionar el componente<br />

Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB).<br />

Propiedad Descripción<br />

Col Especifica el número de columna de la celda<br />

actual.<br />

Cols Especifica el número total de columnas, fijas<br />

y no fijas.<br />

FixedCols Especifica el número de columnas fijas. El<br />

valor por defecto es <strong>1.</strong><br />

FixedRows Especifica el número de filas fijas. El valor<br />

por defecto es <strong>1.</strong><br />

Row Especifica<br />

actual.<br />

el número de fila de la celda<br />

Rows Especifica el número total de filas, fijas y<br />

no fijas.<br />

Text Especifica el contenido de la celda actual.<br />

TextArray Especifica el contenido de una celda elegida<br />

aleatoriamente, se debe especificar el índice<br />

de la celda a la cual se desea acceder.<br />

ScrollBars Especifica si la cuadrícula presenta barras<br />

de desplazamiento horizontales, verticales o<br />

ambas a la vez.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

visualice un cuadrado mágico de orden impar N . Un cuadrado<br />

mágico se compone de números enteros comprendidos entre 1 y<br />

2<br />

N<br />

. La suma de los números que figuran en cada fila, cada<br />

columna y cada diagonal son idénticos.<br />

Pág. 142


números:<br />

Por ejemplo para N = 5 tenemos el siguiente arreglo de<br />

Un método de construcción del cuadrado consiste en situar<br />

el número 1 en el centro de la primera fila, el número<br />

siguiente en la casilla situada encima y a la derecha, y así<br />

sucesivamente. Es preciso considerar que el cuadrado se cierra<br />

sobre sí mismo, la fila encima de la primera es de hecho la<br />

última y la columna a la derecha de la última es la primera.<br />

Sin embargo, cuando la posición del número caiga en una celda<br />

ocupada, se elige la casilla situada por debajo del número que<br />

acaba de ser situado.<br />

Para el desarrollo de la presente aplicación proceda a<br />

crear un nuevo formulario y ubicar una etiqueta (N?), un cuadro<br />

de texto (TxtN) y un control Hierarchical FlexGrid.<br />

Seguidamente debe ingresar el código que se indica:<br />

Private Sub TxtN_Change()<br />

Pág. 143


Dim N As Integer, I As Integer<br />

Dim FIL As Integer, COL As Integer<br />

N = Val(TxtN)<br />

FIL = 1<br />

COL = (N \ 2) + 1<br />

MSHFlexGrid<strong>1.</strong>Cols = N<br />

MSHFlexGrid<strong>1.</strong>Rows = N<br />

MSHFlexGrid<strong>1.</strong>FixedCols = 0<br />

MSHFlexGrid<strong>1.</strong>FixedRows = 0<br />

For I = 1 To N ^ 2<br />

Next<br />

MSHFlexGrid<strong>1.</strong>COL = COL - 1<br />

MSHFlexGrid<strong>1.</strong>Row = FIL - 1<br />

MSHFlexGrid<strong>1.</strong>Text = Str(I)<br />

If I Mod N = 0 Then<br />

Else<br />

End If<br />

End Sub<br />

CONTROL UPDOWN<br />

FIL = FIL + 1<br />

If FIL = N + 1 Then FIL = 1<br />

FIL = FIL - 1<br />

If FIL = 0 Then FIL = N<br />

COL = COL + 1<br />

If COL = N + 1 Then COL = 1<br />

Pág. 144


El control UpDown tiene dos botones con flechas en los que<br />

el usuario puede hacer clic para incrementar o disminuir un<br />

valor de un control asociado, denominado control auxiliar. A<br />

menudo, al usuario le parecerá que el control UpDown y su<br />

control auxiliar son un único control. Por lo general se usa un<br />

control UpDown con un cuadro de texto para solicitar al usuario<br />

una entrada numérica, una combinación que en ocasiones se<br />

denomina control Spinner.<br />

Para agregar un control UpDown debe seleccionar el<br />

componente Microsoft Windows Common Controls-2 6.0.<br />

Propiedad Descripción<br />

BuddyControl Especifica<br />

auxiliar.<br />

el control utilizado como<br />

BuddyProperty Especifica la propiedad utilizada para<br />

sincronizar<br />

auxiliar.<br />

el control UpDown con su<br />

Increment Especifica un valor que determina la cantidad<br />

en que varía la propiedad Value cuando se<br />

hace click en los botones del control UpDown.<br />

Max Especifica el valor máximo del intervalo de<br />

desplazamiento del control UpDown.<br />

Min Especifica el valor mínimo del intervalo de<br />

desplazamiento del control UpDown.<br />

SyncBuddy Especifica si el control UpDown sincroniza la<br />

propiedad Value con una propiedad del control<br />

auxiliar.<br />

Como ejemplo vamos a desarrollar una aplicación que<br />

permita mostrar el código ANSI de un carácter especificado.<br />

Pág. 145


Para tal fin crear un nuevo formulario y ubicar los<br />

siguientes controles: 2 etiquetas (Código ANSI, Carácter), 2<br />

cuadros de texto (TxtANSI, TxtCaracter) y 1 control UpDown.<br />

Luego establezca las propiedades que se indican:<br />

UpDown1<br />

Nombre UpDown1<br />

BuddyControl TxtANSI<br />

BuddyProperty Text<br />

Increment 1<br />

Max 255<br />

Min 0<br />

SyncBuddy True<br />

Seguidamente proceda a transcribir el siguiente código:<br />

Private Sub TxtANSI_Change()<br />

End Sub<br />

TxtCaracter = Chr(TxtANSI)<br />

CONTROL MONTHVIEW<br />

Pág. 146


El control MonthView permite al usuario la posibilidad de<br />

ver y establecer información de fechas mediante una interfaz<br />

similar a un calendario. Para agregar este control seleccionar<br />

el componente Microsoft Windows Common Controls-2 6.0.<br />

Propiedad Descripción<br />

Day Especifica el número de día mostrado.<br />

Month Especifica el número de mes mostrado.<br />

Year Especifica el número de año mostrado.<br />

Value Especifica la fecha mostrada.<br />

DayOfWeek Especifica el día de la semana<br />

Week<br />

correspondiente a la fecha mostrada.<br />

Especifica el número de la semana en que cae<br />

la fecha mostrada.<br />

MultiSelect Especifica si se puede seleccionar un<br />

intervalo contiguo de fechas.<br />

MaxSelCount Especifica el número máximo de días que<br />

pueden seleccionarse mediante la propiedad<br />

MultiSelect.<br />

SelStart<br />

Especifica los límite inferior y superior<br />

SelEnd<br />

respectivamente<br />

seleccionado.<br />

del intervalo de fechas<br />

MonthColumns Permiten mostrar más de un mes<br />

MonthRows<br />

simultáneamente. MonthColumns especifica el<br />

número de meses que se mostrarán en sentido<br />

horizontal. MonthRows especifica el número de<br />

meses que se mostrarán en sentido vertical.<br />

Evento Descripción<br />

Pág. 147


Click Ocurre cada vez que el usuario hace click<br />

sobre el control.<br />

DateClick Ocurre cada vez que el usuario hace click<br />

sobre una fecha mostrada en el control.<br />

Como ejemplo vamos a crear un sencillo calendario. Cuando<br />

el usuario haga click sobre alguna fecha, esta aparecerá en el<br />

cuadro de texto. Pamela Anderson representará la parte<br />

atractiva de nuestra aplicación.<br />

Para ello crear un nuevo formulario y agregar una etiqueta<br />

(La fecha selecciona es), un cuadro de texto (TxtFecha), un<br />

control imagen (ImgPamela) y un control MonthView. Luego<br />

ingresar el siguiente código:<br />

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)<br />

Pág. 148


End Sub<br />

TxtFecha = WeekdayName(MonthView<strong>1.</strong>DayOfWeek) & “ , ” _<br />

& Str(MonthView<strong>1.</strong>Day) & “ de ” _<br />

& MonthName(MonthView<strong>1.</strong>Month) & “ de ” _<br />

& Str(MonthView<strong>1.</strong>Year)<br />

Private Sub MonthView1_Click()<br />

End Sub<br />

Call MonthView1_DateClick(MonthView<strong>1.</strong>Value)<br />

Private Sub Form_Load()<br />

End Sub<br />

Call MonthView1_DateClick(MonthView<strong>1.</strong>Value)<br />

La función WeekdayName retorna una cadena con el nombre<br />

del día de la semana especificado. Requiere como argumento el<br />

número de día de la semana.<br />

La función MonthName retorna una cadena con el nombre del<br />

mes especificado. Requiere como argumento el número de mes.<br />

El evento DateClick tiene un parámetro DateClicked que<br />

especifica la fecha seleccionada. Puede utilizar este valor<br />

(DateClicked) para obtener la fecha en la que el usuario hizo<br />

click.<br />

CONTROL CALENDAR<br />

Pág. 149


El control Calendar es similar en funcionalidad al control<br />

MonthView, pues también presenta un calendario. Para agregar<br />

este control seleccionar el componente Control Calendar de<br />

Microsoft 9.0.<br />

Propiedad Descripción<br />

Day Especifica el número de día mostrado.<br />

Month Especifica el número de mes mostrado.<br />

Year Especifica el número de año mostrado.<br />

Value Especifica la fecha mostrada.<br />

Como ejemplo vamos a desarrollar la aplicación anterior,<br />

pero esta vez haciendo uso de un control Calendar.<br />

Pág. 150


Para ello crear un nuevo formulario y agregar una etiqueta<br />

(La fecha selecciona es), un cuadro de texto (TxtFecha), un<br />

control imagen (ImgPamela) y un control Calendar. Luego<br />

ingresar el siguiente código:<br />

Private Sub Calendar1_Click()<br />

End Sub<br />

TxtFecha = WeekdayName(Weekday(Calendar<strong>1.</strong>Value)) & “ , ” _<br />

& Str(Calendar<strong>1.</strong>Day) & “ de ” _<br />

& MonthName(Calendar<strong>1.</strong>Month) & “ de ” _<br />

& Str(Calendar<strong>1.</strong>Year)<br />

La función Weekday retorna un número entero que representa<br />

el día de la semana de una fecha dada. Se utiliza para suplir a<br />

la propiedad DayOfWeek la cual no está permitida para el<br />

control Calendar.<br />

Pág. 151


CAPÍTULO 7<br />

ARCHIVOS<br />

Un archivo (fichero) es un conjunto de información<br />

relacionada entre sí, almacenada como una unidad en un<br />

dispositivo de almacenamiento secundario (disquete, disco<br />

duro). Los datos almacenados en un archivo son de manera<br />

permanente de modo que pueden ser manipulados en cualquier<br />

momento. Cada archivo está referenciado por un identificador,<br />

su nombre.<br />

CONCEPTO DE ARCHIVO BAJO WINDOWS/VISUAL BASIC<br />

Un archivo tiene un nombre almacenado en una carpeta junto<br />

con otros archivos de disco. Los nombres de los archivos en<br />

Windows y <strong>Visual</strong> <strong>Basic</strong> requieren de 1 a 215 caracteres<br />

(incluidos espacios en blanco), y pueden incluir también una<br />

extensión de 1 a 3 letras, normalmente son significativas y<br />

relativas al contenido del mismo. Por ejemplo:<br />

LEAME.TXT Archivo de texto<br />

MISDATOS.DAT Archivo de datos<br />

PLANILLA.XLS Archivo de MS-Excel<br />

SHAKIRA.BMP Archivo de mapa de bits<br />

Pág. 152


El nombre de un archivo para ser referenciado<br />

correctamente consta de:<br />

• Unidad (Especificador de unidad, por ejemplo A, B, C)<br />

• Camino (Especificador de ruta, por ejemplo \DATA\)<br />

• Nombre (Especificador de archivo, por ejemplo DEMO.DAT)<br />

Como ejemplo, suponga que el archivo DEMO.DAT está en la<br />

carpeta DATA de la unidad C (disco duro); la descripción<br />

completa del nombre del archivo es:<br />

C:\DATA\DEMO.DAT<br />

Ahora, suponga que el archivo CONSTANTES.DAT se encuentra<br />

en la carpeta LIB, que a su vez está contenida en la carpeta<br />

DATA de la unidad C. La descripción completa del nombre de<br />

dicho archivo está dada por:<br />

C:\DATA\LIB\CONSTANTES.DAT<br />

Desde el punto de vista de <strong>Visual</strong> <strong>Basic</strong> un archivo<br />

almacena los datos como un conjunto de registros, conteniendo<br />

todos ellos, generalmente, los mismos campos. Cada campo<br />

almacena un dato de tipo predefinido o de un tipo definido por<br />

el usuario. El elemento de información más simple estaría<br />

formado por un carácter.<br />

OPERACIONES SOBRE EL SISTEMA DE ARCHIVOS<br />

Pág. 153


Para manipular el sistema de archivos de un disco, <strong>Visual</strong><br />

<strong>Basic</strong> proporciona las sentencias que a continuación se<br />

describen.<br />

Sentencia Kill<br />

Permite eliminar un archivo almacenado en un disco. Su<br />

sintaxis es de la forma:<br />

Kill NOMBRE_ARCHIVO<br />

Donde NOMBRE_ARCHIVO es una cadena de caracteres que<br />

identifica al archivo que se desea borrar. Se permiten<br />

caracteres comodín (* y ?). Si el archivo no existe se produce<br />

un error. Por ejemplo:<br />

Kill “C:\TEMP\TEMPO.DAT”<br />

La instrucción anterior elimina el archivo TEMPO.DAT<br />

ubicado en la carpeta C:\TEMP.<br />

Sentencia Name<br />

Permite cambiar el nombre (renombrar) de un archivo del<br />

disco y moverlo a otro directorio si fuera preciso. Su sintaxis<br />

es la siguiente:<br />

Name NOMBRE_ACTUAL As NOMBRE_NUEVO<br />

Donde NOMBRE_ACTUAL es una cadena de caracteres que<br />

especifica el nombre actual del archivo y NOMBRE_NUEVO es otra<br />

Pág. 154


cadena de caracteres que indica el nuevo nombre que se desea<br />

dar al archivo. Este nombre no debe existir, de lo contrario se<br />

obtendrá un error. Por ejemplo:<br />

Name “C:\TEMP\TEMPO.DAT” As “C:\DATA\CURSO.DAT”<br />

La instrucción anterior cambia el nombre del archivo<br />

TEMPO.DAT por el nombre CURSO.DAT. El contenido del archivo<br />

permanece inalterado y su localización física se cambia de la<br />

carpeta C:\TEMP a C:\DATA.<br />

Sentencia MkDir<br />

Permite crear una nueva carpeta. Su sintaxis es:<br />

MkDir NUEVA_CARPETA<br />

Donde NUEVA_CARPETA es una cadena de caracteres que<br />

identifica la carpeta que se va ha crear. Por ejemplo:<br />

MkDir “C:\DATA\TEMP”<br />

Sentencia RmDir<br />

Elimina una carpeta vacía existente en el disco. Su<br />

sintaxis es de la forma:<br />

RmDir NOMBRE_CARPETA<br />

Donde NOMBRE_CARPETA es una cadena de caracteres que<br />

identifica la carpeta que se desea eliminar. Por ejemplo:<br />

Pág. 155


RmDir “C:\DATA\TEMP”<br />

Sentencia ChDir<br />

Permite cambiar la carpeta actual. Su sintaxis es:<br />

ChDir NOMBRE_CARPETA<br />

Donde NOMBRE_CARPETA es una cadena de caracteres que<br />

identifica la nueva ruta de acceso predeterminada. Por ejemplo:<br />

ChDir “C:\DATA\GRAFICOS”<br />

MsgBox App.Path<br />

La propiedad Path del objeto App especifica la ruta de<br />

acceso actual.<br />

Sentencia ChDrive<br />

Permite cambiar la unidad de disco actual. Su sintaxis es:<br />

ChDrive UNIDAD<br />

Donde UNIDAD es un carácter que especifica la nueva unidad<br />

de disco. Si el parámetro UNIDAD es una cadena de múltiples<br />

caracteres sólo se lee la primera letra. Por ejemplo:<br />

ChDrive “A”<br />

OPERACIONES CON ARCHIVOS<br />

Pág. 156


Para realizar alguna operación sobre un archivo hay<br />

referenciarlo mediante su nombre <strong>completo</strong>. Las operaciones<br />

básicas que se pueden realizar con los archivos son:<br />

• Abrir, preparar un archivo para hacer referencia a él.<br />

• Escribir, introducir un elemento de información a un archivo.<br />

• Leer, obtener un elemento de información de un archivo.<br />

• Modificar, alterar un elemento de información ya existente en<br />

un archivo.<br />

• Cerrar, evitar cualquier otra referencia al archivo en tanto<br />

no se le abra otra vez.<br />

TIPOS DE ARCHIVOS<br />

Los tipos de archivos dependen del modo como están<br />

organizados los registros y de la forma de accesar a la los<br />

datos contenidos en ellos. En <strong>Visual</strong> <strong>Basic</strong> existen tres tipos<br />

de archivos de datos, estos son:<br />

• Archivos secuenciales (acceso secuencial).<br />

• Archivos aleatorios (acceso aleatorio).<br />

• Archivos binarios (acceso binario).<br />

A continuación pasamos a describir cada uno de ellos en<br />

forma detallada.<br />

ARCHIVOS DE ACCESO SECUENCIAL<br />

Pág. 157


En un archivo de acceso secuencial los registros se<br />

almacenan siguiendo una a otro, según el orden en que son<br />

ingresados. Cuando se lee la información, se empieza por el<br />

primer registro y se continua al siguiente hasta alcanzar el<br />

final. Las sentencias y funciones necesarias para manipular<br />

archivos de tipo secuencial se presentan a continuación.<br />

Sentencia Open<br />

Permite abrir un archivo. La sintaxis para esta sentencia<br />

es la siguiente:<br />

Open NOMBRE_ARCHIVO For MODO As # NÚMERO_ARCHIVO<br />

Donde NOMBRE_ARCHIVO es una cadena que especifica el<br />

nombre del archivo que se debe ser abierto en MODO Output,<br />

Append o Input.<br />

Modo Descripción<br />

Output Escritura de datos. Si el archivo existe, su<br />

Append<br />

contenido actual se destruye. Si el archivo no<br />

existe, se crea.<br />

Añadir datos. Los datos son añadidos a partir de<br />

los últimos existentes. Si el archivo no existe,<br />

se crea.<br />

Input Lectura de datos. La lectura empieza desde el<br />

principio del archivo. Si el archivo no existe, se<br />

produce un error.<br />

El parámetro NÚMERO_ARCHIVO es un entero cuyo valor debe<br />

estar comprendido entre 1 y 51<strong>1.</strong> Este número será asociado al<br />

Pág. 158


nombre del archivo mientras éste permanezca abierto. Para<br />

obtener el número del siguiente archivo disponible se utiliza<br />

la función FreeFile().<br />

Como ejemplo suponga que se requiere abrir el archivo<br />

DEMO.DAT ubicado en la carpeta C:\DATA, la instrucción sería la<br />

siguiente:<br />

Dim N1 As Integer<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.DAT” For Output As # N1<br />

Sentencia Print<br />

Permite escribir datos secuencialmente en un archivo. Su<br />

sintaxis es:<br />

Print # NÚMERO_ARCHIVO, LISTA_DE_EXPRESIONES<br />

Donde NÚMERO_ARCHIVO es el número utilizado cuando el<br />

archivo fue abierto. LISTA_DE_EXPRESIONES es un conjunto de<br />

expresiones (numéricas, de cadena, de fecha, etc.) separadas<br />

por punto y coma (;) que serán escritas en el archivo.<br />

La sentencia Print escribe en el archivo una imagen de los<br />

datos tal y como se habrían visualizado sobre el formulario con<br />

la sentencia Print. Por ejemplo:<br />

Dim N1 As Integer<br />

N1 = FreeFile()<br />

Pág. 159


Open “C:\DATA\DEMO.DAT” For Output As # N1<br />

Print # N1, “<strong>Visual</strong> <strong>Basic</strong> es fácil”; “, ”; Date()<br />

Al ejecutarse el código anterior se escribiría en el<br />

archivo la siguiente información:<br />

<strong>Visual</strong> <strong>Basic</strong> es fácil, 24/04/2001<br />

Como se observa, al utilizar la sentencia Print se deben<br />

delimitar los datos para que se impriman correctamente.<br />

Sentencia Write<br />

Permite escribir datos secuencialmente en un archivo. Su<br />

sintaxis es:<br />

Write # NÚMERO_ARCHIVO, LISTA_DE_EXPRESIONES<br />

Donde NÚMERO_ARCHIVO es el número utilizado cuando el<br />

archivo fue abierto. LISTA_DE_EXPRESIONES es un conjunto de<br />

expresiones (numéricas, de cadena, de fecha, etc.) separadas<br />

por punto y coma (;) que serán escritas en el archivo.<br />

La sentencia Write inserta comas (,) entre las expresiones<br />

de la LISTA_DE_EXPRESIONES, por tanto no es necesario poner<br />

delimitadores explícitamente como en el caso de la sentencia<br />

Print.<br />

Cuando se utiliza la sentencia Write para escribir<br />

información en un archivo, se siguen distintas convenciones<br />

Pág. 160


universales, de modo que los datos siempre se pueden leer e<br />

interpretar correctamente, independientemente de la<br />

configuración regional, estas convenciones son:<br />

• Los datos numéricos siempre se escriben utilizando la coma<br />

(,) como separador decimal.<br />

• Para datos de tipo Boolean se imprime # TRUE # o # FALSE #.<br />

• Los datos de tipo Date se escriben en el archivo usando el<br />

formato de fecha universal (fechas como # aaaa-mm-dd # y horas<br />

como # hh:mm:ss #).<br />

código:<br />

A manera de ejemplo considere el siguiente segmento de<br />

Dim N1 As Integer<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.DAT” For Output As # N1<br />

Write # N1, “<strong>Visual</strong> <strong>Basic</strong> es fácil”; Date()<br />

La ejecución de este código escribiría en el archivo la<br />

siguiente información:<br />

Sentencia Close<br />

<strong>Visual</strong> <strong>Basic</strong> es fácil", # 2002-04-11 #<br />

Pág. 161


Cierra uno archivo abierto mediante la sentencia Open. Su<br />

sintaxis es la siguiente:<br />

Close # NÚMERO_ARCHIVO [, # NÚMERO_ARCHIVO, . . .]<br />

Donde NÚMERO_ARCHIVO es el número con el cual se abrió el<br />

archivo. Por ejemplo:<br />

Close # 1, # 2<br />

La instrucción anterior cierra los archivos asociados con<br />

los números 1 y 2. La siguiente sentencia cierra todos los<br />

archivos abiertos.<br />

Close<br />

Sentencia Input<br />

Permite leer datos de un archivo secuencial y los asigna a<br />

las variables especificadas. Su sintaxis es:<br />

Input # NÚMERO_ARCHIVO, VARIABLE1 [, VARIABLE2, . . .]<br />

Donde NÚMERO_ARCHIVO es el número utilizado cuando el<br />

archivo fue abierto. VARIABLE1, VARIABLE2, . . . son los<br />

nombres de las variables que han de recibir los<br />

correspondientes datos del archivo.<br />

Pág. 162


Los datos del archivo deben aparecer en el mismo orden que<br />

tienen las variables en la sentencia Input y deben coincidir<br />

con variables del mismo tipo de datos. Por ejemplo:<br />

Dim N1 As Integer<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.DAT” For Input As # N1<br />

Dim A As Integer<br />

Dim B As Double<br />

Dim S As String<br />

Dim F As Date<br />

Input # N1, A, B, S, F<br />

El segmento de código anterior espera encontrar en el<br />

archivo un entero, un real, una cadena y una fecha, en ese<br />

orden (separados por comas o un retorno de carro).<br />

Sentencia Line Input<br />

Permite leer una línea de un archivo secuencial ignorando<br />

los delimitadores (comas) y la asigna a una variable tipo<br />

cadena. Su sintaxis es:<br />

Line Input # NÚMERO_ARCHIVO, VARIABLE<br />

Donde NÚMERO_ARCHIVO es el número utilizado cuando el<br />

archivo fue abierto. VARIABLE es el nombre de una variable tipo<br />

cadena de caracteres.<br />

Pág. 163


La sentencia Line Input se utiliza especialmente para leer<br />

un archivo de texto línea a línea, ya que esta sentencia lee<br />

todos los caracteres del archivo hasta que encuentra un retorno<br />

de carro, entonces continua en la siguiente línea y así<br />

sucesivamente. Por ejemplo:<br />

Dim N1 As Integer, LINE1 As String, LINE2 As String<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.TXT” For Output As # N1<br />

Print # N1, “Línea de prueba 1”<br />

Print # N1, “Línea de prueba 2”<br />

Close # N1<br />

Open “C:\DATA\DEMO.TXT” For Input As # N1<br />

Line Input # N1, LINE1<br />

MsgBox LINE1<br />

Line Input # N1, LINE2<br />

MsgBox LINE2<br />

La ejecución del código anterior produce la siguiente salida:<br />

Pág. 164


Función Input<br />

Retorna los siguientes N caracteres de un archivo<br />

secuencial y los asigna a una variable de cadena. Su sintaxis<br />

es de la forma:<br />

VARIABLE = Input( N , # NÚMERO_ARCHIVO)<br />

A diferencia de la sentencia Input, la función Input()<br />

retorna todos los caracteres que lee, incluyendo comas,<br />

retornos de carro, continuaciones de línea, etc. Por ejemplo:<br />

Dim N1 As Integer, S As String<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.TXT” For Output As # N1<br />

Print # N1, “Línea de prueba 1”<br />

Print # N1, “Línea de prueba 2”<br />

Close # N1<br />

Open “C:\DATA\DEMO.TXT” For Input As # N1<br />

S = Input(24, # N1)<br />

MsgBox S<br />

La ejecución del código anterior produce la siguiente salida:<br />

Función EOF<br />

Pág. 165


Especifica si se ha llegado al final de un archivo. Su<br />

sintaxis es de la forma:<br />

VARIABLE = EOF(NÚMERO_ARCHIVO)<br />

Se utiliza EOF() para evitar producir un error al intentar<br />

obtener información más allá del final del archivo. EOF()<br />

retorna un valor True si se ha alcanzado el final del archivo y<br />

False en caso contrario. Por ejemplo:<br />

Dim N1 As Integer<br />

Dim CADENA As String<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.TXT” For Input As # N1<br />

While Not EOF(N1)<br />

Wend<br />

Close # N1<br />

Line Input # N1, CADENA<br />

Print CADENA<br />

Este segmento de código lee y visualiza cada línea del<br />

archivo de texto DEMO.TXT. El bucle finaliza cuando se detecta<br />

el final del archivo. Para que el código anterior funcione<br />

correctamente, no olvide poner la propiedad AutoRedraw del<br />

formulario a True.<br />

Como ejemplo final del uso de archivos secuenciales vamos<br />

a desarrollar un sencillo editor de texto. Este editor aunque<br />

Pág. 166


sus prestaciones son bastante limitadas va ha servir para poner<br />

en práctica lo aprendido recientemente.<br />

El menú que se muestra en la figura obedece a la siguiente<br />

descripción:<br />

Caption Name ShortCut<br />

&Archivo MnuArchivo Ninguno<br />

. . . &Nuevo MnuArchivoNuevo Ninguno<br />

. . . &Abrir MnuArchivoAbrir Ninguno<br />

. . . &Guardar MnuArchivoGuardar Ninguno<br />

. . . - MnuArchivoLinea Ninguno<br />

. . . &Salir MnuArchivoSalir Ctrl + X<br />

Luego proceda a ubicar los siguientes controles sobre el<br />

formulario:<br />

Pág. 167


indican:<br />

Form1<br />

Text1<br />

1 cuadro de texto<br />

1 control CommonDialog<br />

Seguidamente debe establecer las propiedades que se<br />

Nombre FrmEditor<br />

Caption Editor<br />

Nombre TxtEditor<br />

MultiLine True<br />

ScrollBars<br />

Text<br />

3-Both<br />

CommonDialog1<br />

Nombre CommonDialog1<br />

CancelError True<br />

Una vez establecidas las propiedades de la interfaz<br />

ingresar el código que se muestra:<br />

Private Sub Form_Resize()<br />

End Sub<br />

TxtEditor.Move 0, 0, ScaleWidth, ScaleHeight<br />

Private Sub MnuArchivoNuevo_Click()<br />

End Sub<br />

TxtEditor = “”<br />

Pág. 168


Private Sub MnuArchivoAbrir_Click()<br />

Dim FILTRO As String, FILE As String<br />

Dim N1 As Integer, CADENA As String<br />

On Error GoTo ERROR_ABRIR<br />

FILTRO = “Archivos de texto (*.TXT)|*.TXT”<br />

CommonDialog<strong>1.</strong>Filter = FILTRO<br />

CommonDialog<strong>1.</strong>ShowOpen<br />

FILE = CommonDialog<strong>1.</strong>FileName<br />

N1 = FreeFile()<br />

CADENA = “”<br />

TxtEditor = “”<br />

Open FILE For Input As # N1<br />

While Not EOF(N1)<br />

Wend<br />

Close # N1<br />

Input # N1, CADENA<br />

TxtEditor = TxtEditor & CADENA & vbCrLf<br />

FrmEditor.Caption = “Editor - ” & FILE<br />

SALIR_ABRIR:<br />

Exit Sub<br />

ERROR_ABRIR:<br />

MsgBox Err.Description<br />

Resume SALIR_ABRIR<br />

End Sub<br />

Private Sub MnuArchivoGuardar_Click()<br />

Dim FILTRO As String, FILE As String<br />

Dim N1 As Integer<br />

Pág. 169


On Error GoTo ERROR_GUARDAR<br />

FILTRO = “Archivos de texto (*.TXT)|*.TXT”<br />

CommonDialog<strong>1.</strong>Filter = FILTRO<br />

CommonDialog<strong>1.</strong>ShowSave<br />

FILE = CommonDialog<strong>1.</strong>FileName<br />

N1 = FreeFile()<br />

Open FILE For Output As # N1<br />

Print # N1, TxtEditor<br />

Close # N1<br />

FrmEditor.Caption = “Editor - ” & FILE<br />

SALIR_GUARDAR:<br />

Exit Sub<br />

ERROR_GUARDAR:<br />

End Sub<br />

MsgBox Err.Description<br />

Resume SALIR_GUARDAR<br />

La sentencia Err.Description retorna una cadena que<br />

contiene la descripción asociada a un error en tiempo de<br />

ejecución.<br />

La sentencia Resume continua la ejecución en la etiqueta<br />

especificada cuando termina una rutina de gestión de errores.<br />

ARCHIVOS DE ACCESO ALEATORIO<br />

En los archivo de acceso aleatorio el almacenamiento de<br />

los datos se hace mediante registros (todos de la misma<br />

Pág. 170


longitud), lo cuales son identificados mediante un único número<br />

denominado índice. El primer registro de un archivo tiene como<br />

índice 1, el segundo tiene índice 2 y así sucesivamente. La<br />

información contenida en un archivo de este tipo puede ser<br />

accedida en cualquier secuencia, ya que cada registro<br />

individual se asocia con su respectivo índice y puede ser<br />

leído, escrito o actualizado.<br />

Las sentencias y funciones necesarias para manipular<br />

archivos de tipo aleatorio se presentan a continuación.<br />

Sentencia Open<br />

Permite abrir un archivo. La sintaxis para acceder<br />

aleatoriamente a un archivo es:<br />

Open NOMBRE_ARCHIVO For Random As # NÚMERO_ARCHIVO Len = LON_REG<br />

Donde NOMBRE_ARCHIVO es una cadena que especifica el<br />

nombre del archivo que se debe ser abierto en modo Random.<br />

El parámetro NÚMERO_ARCHIVO es un entero cuyo valor está<br />

comprendido entre 1 y 51<strong>1.</strong> Este número será asociado con el<br />

nombre del archivo mientras permanezca abierto.<br />

LON_REG es un entero que establece la longitud del<br />

registro para archivos aleatorios.<br />

Sentencia Put<br />

Permite grabar un registro en un archivo abierto para<br />

acceso aleatorio. Su sintaxis es:<br />

Pág. 171


Put # NÚMERO_ARCHIVO, NÚMERO_REG, VARIABLE<br />

Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el<br />

archivo, NÚMERO_REG es el número correspondiente al registro<br />

que se va ha grabar y VARIABLE contiene los datos a escribir en<br />

el archivo. Por ejemplo:<br />

Dim N1 As Integer, REG As DISTRITO<br />

REG.ID_DISTRITO = “L09”<br />

REG.NOMBRE = “Chorrillos”<br />

N1 = FreeFile()<br />

Open “C:\DATA\RAND<strong>1.</strong>DAT” For Random As # N1 Len = Len(REG)<br />

Put # N1, 1, REG<br />

Close # N1<br />

El segmento de código anterior utiliza una variable REG de<br />

tipo DISTRITO, cuya definición es la siguiente:<br />

Private Type DISTRITO<br />

End Type<br />

ID_DISTRITO As String * 3<br />

NOMBRE As String * 30<br />

Sentencia Get<br />

Permite leer un registro procedente de un archivo de<br />

acceso aleatorio, almacenando los datos en una variable<br />

específica. Su sintaxis es de la forma:<br />

Pág. 172


Get # NÚMERO_ARCHIVO, NÚMERO_REG, VARIABLE<br />

Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el<br />

archivo, NÚMERO_REG es el número correspondiente al registro<br />

que se va ha leer y VARIABLE almacena los datos del registro<br />

leído. Por ejemplo:<br />

Dim N1 As Integer, I As Integer, REG As DISTRITO<br />

N1 = FreeFile()<br />

Open “C:\DATA\RAND<strong>1.</strong>DAT” For Random As # N1 Len = Len(REG)<br />

I = 1<br />

While Not EOF(# N1)<br />

Wend<br />

Close # N1<br />

Get # N1, I, REG<br />

MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE<br />

I = I + 1<br />

Cuando EOF() se utiliza con un archivo aleatorio, retorna<br />

un valor True si una sentencia Get intenta leer y no puede<br />

porque ha alcanzado el final del archivo.<br />

Función LOF<br />

Retorna el número de bytes (caracteres) que ocupa un<br />

determinado archivo abierto mediante la sentencia Open. Su<br />

sintaxis es:<br />

Pág. 173


archivo.<br />

VARIABLE = LOF(# NÚMERO_ARCHIVO)<br />

Donde NÚMERO_ARCHIVO es el número con el que se abrió el<br />

Esta función es de utilidad, porque aplicada a un archivo<br />

de acceso aleatorio, permite conocer el número de registros<br />

almacenados en el archivo. Para ello debe dividir el valor<br />

retornado entre la longitud del registro. Como ejemplo,<br />

considere lo siguiente:<br />

Dim N1 As Integer, REG As DISTRITO<br />

Dim NUM_REGS As Integer, I As Integer<br />

N1 = FreeFile()<br />

Open “C:\DATA\RAND<strong>1.</strong>DAT” For Random As # N1 Len = Len(REG)<br />

NUM_REGS = LOF(N1) / Len(REG)<br />

For I = 1 To NUM_REGS<br />

Next<br />

Close # N1<br />

Función Loc<br />

Get # N1, I, REG<br />

MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE<br />

Esta función retorna la posición actual dentro de un<br />

fichero. Su sintaxis es:<br />

VARIABLE = Loc(# NÚMERO_ARCHIVO)<br />

Pág. 174


La función Loc() aplicada a un archivo de acceso aleatorio<br />

retorna el número del último registro leído o grabado en el<br />

archivo especificado. Por ejemplo:<br />

Dim N1 As Integer, REG As DISTRITO<br />

Dim NUM_REGS As Integer, I As Integer<br />

N1 = FreeFile()<br />

Open “C:\DATA\RAND<strong>1.</strong>DAT” For Random As # N1 Len = Len(REG)<br />

NUM_REGS = LOF(N1) / Len(REG)<br />

I = 1<br />

Do While True<br />

Loop<br />

Close # N1<br />

Get # N1, I, REG<br />

MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE<br />

I = I + 1<br />

If Loc(N1) = NUM_REGS Then Exit Do<br />

La sentencia If finaliza el bucle si se ha alcanzado el<br />

último registro.<br />

Como ejemplo final vamos a desarrollar una aplicación que<br />

permita realizar el mantenimiento de los datos almacenados en<br />

el archivo C:\DATA\CURSO.DAT.<br />

Pág. 175


Los botones ubicados en el marco Navegador (Primero,<br />

Anterior, Siguiente y Ultimo, de izquierda a derecha) permiten<br />

desplazarse a través de los registros del archivo. Los botones<br />

ubicados en el marco Mantenimiento (Nuevo, Editar, Guardar y<br />

Eliminar, de izquierda a derecha) permiten realizar las<br />

operaciones básicas de mantenimiento de los registros.<br />

Para el desarrollo de la presente aplicación ubicar los<br />

siguientes controles al formulario:<br />

indican:<br />

Form1<br />

3 marcos<br />

4 etiquetas<br />

4 cuadros de texto<br />

9 botones de comando<br />

Seguidamente proceda a establecer las propiedades que se<br />

Pág. 176


Frame1<br />

Frame2<br />

Frame3<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Nombre Frm<strong>Curso</strong><br />

Caption Mantenimiento de cursos<br />

BorderStyle 3-Fixed Dialog<br />

StarUpPosition 2-CenterScreen<br />

Nombre FraIngreso<br />

Caption<br />

Nombre FraNavegador<br />

Caption Navegador<br />

Nombre FraMantenimiento<br />

Caption Mantenimiento<br />

Nombre LblCodigo<br />

Caption Código:<br />

Nombre LblNombre<br />

Caption Nombre:<br />

Nombre LblVacantes<br />

Caption Vacantes:<br />

Nombre LblProfesor<br />

Caption Profesor:<br />

Pág. 177


Text1<br />

Text2<br />

Text3<br />

Text4<br />

Command1<br />

Command2<br />

Nombre TxtCodigo<br />

Locked<br />

Text<br />

True<br />

Nombre TxtNombre<br />

Locked<br />

Text<br />

True<br />

Nombre TxtVacantes<br />

Locked<br />

Text<br />

True<br />

Nombre TxtProfesor<br />

Locked<br />

Text<br />

True<br />

Nombre<br />

Caption<br />

CmdPrimero<br />

Picture C:\FundVB\Bitmaps\First.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdAnterior<br />

Picture C:\FundVB\Bitmaps\Previous.bmp<br />

Pág. 178


Command3<br />

Command4<br />

Command5<br />

Command6<br />

Command7<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdSiguiente<br />

Picture C:\FundVB\Bitmaps\Next.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdUltimo<br />

Picture C:\FundVB\Bitmaps\Last.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdNuevo<br />

Picture C:\FundVB\Bitmaps\New.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdEditar<br />

Picture C:\FundVB\Bitmaps\Edit.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdGuardar<br />

Picture C:\FundVB\Bitmaps\Save.bmp<br />

Pág. 179


Command8<br />

Command9<br />

Style 1-Graphical<br />

Nombre CmdEliminar<br />

Caption<br />

Picture C:\FundVB\Bitmaps\Delete.bmp<br />

Style 1-Graphical<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Picture C:\FundVB\Bitmaps\Exit.bmp<br />

Style 1-Graphical<br />

Luego, proceda a transcribir el código mostrado a continuación:<br />

Private Type CURSO<br />

End Type<br />

ID_CURSO As String * 3<br />

NOMBRE As String * 30<br />

VACANTES As Integer<br />

PROFESOR As String * 25<br />

ESTADO As Boolean<br />

Dim N1 As Integer, POSICION As Integer<br />

Dim REG As CURSO<br />

Private Sub MODO_EDITAR(ByVal Ok As Boolean)<br />

TxtCodigo.Locked = Not Ok<br />

TxtNombre.Locked = Not Ok<br />

Pág. 180


End Sub<br />

TxtVacantes.Locked = Not Ok<br />

TxtProfesor.Locked = Not Ok<br />

CmdNuevo.Enabled = Not Ok<br />

CmdEditar.Enabled = Not Ok<br />

CmdGuardar.Enabled = Ok<br />

CmdEliminar.Enabled = Not Ok<br />

CmdPrimero.SetFocus<br />

If Ok Then TxtCodigo.SetFocus<br />

Private Sub ABRIR_ARCHIVO()<br />

On Error GoTo ERROR_ABRIR:<br />

N1 = FreeFile()<br />

Open “C:\DATA\CURSO.DAT” For Random As # N1 Len = Len(REG)<br />

SALIR_ABRIR:<br />

Exit Sub<br />

ERROR_ABRIR:<br />

End Sub<br />

MsgBox Err.Description<br />

Resume SALIR_ABRIR:<br />

Private Sub Form_Load()<br />

Call ABRIR_ARCHIVO<br />

End Sub<br />

Private Sub Form_Activate()<br />

MODO_EDITAR False<br />

Call CmdPrimero_Click<br />

Pág. 181


End Sub<br />

Private Sub CmdPrimero_Click()<br />

End Sub<br />

POSICION = 1<br />

Get # N1, POSICION, REG<br />

TxtCodigo = REG.ID_CURSO<br />

TxtNombre = REG.NOMBRE<br />

TxtVacantes = Str(REG.VACANTES)<br />

TxtProfesor = REG.PROFESOR<br />

Private Sub CmdAnterior_Click()<br />

POSICION = Loc(N1) - 1<br />

If POSICION = 0 Then<br />

Else<br />

End If<br />

Get # N1, 1, REG<br />

MsgBox “Estamos en el primer registro”<br />

Get # N1, POSICION, REG<br />

TxtCodigo = REG.ID_CURSO<br />

TxtNombre = REG.NOMBRE<br />

TxtVacantes = Str(REG.VACANTES)<br />

TxtProfesor = REG.PROFESOR<br />

End Sub<br />

Private Sub CmdSiguiente_Click()<br />

Dim ULTIMO As Integer<br />

ULTIMO = LOF(N1) / Len(REG)<br />

Pág. 182


End Sub<br />

POSICION = Loc(N1) + 1<br />

If POSICION = ULTIMO + 1 Then<br />

Else<br />

End If<br />

Get # N1, ULTIMO, REG<br />

MsgBox “Estamos en el último registro”<br />

Get # N1, POSICION, REG<br />

TxtCodigo = REG.ID_CURSO<br />

TxtNombre = REG.NOMBRE<br />

TxtVacantes = Str(REG.VACANTES)<br />

TxtProfesor = REG.PROFESOR<br />

Private Sub CmdUltimo_Click()<br />

POSICION = LOF(N1) / Len(REG)<br />

If POSICION 0 Then<br />

End If<br />

Get #N1, POSICION, REG<br />

TxtCodigo = REG.ID_CURSO<br />

TxtNombre = REG.NOMBRE<br />

TxtVacantes = Str(REG.VACANTES)<br />

TxtProfesor = REG.PROFESOR<br />

End Sub<br />

Private Sub CmdNuevo_Click()<br />

POSICION = LOF(N1) / Len(REG) + 1<br />

MODO_EDITAR True<br />

Pág. 183


End Sub<br />

TxtCodigo = “”<br />

TxtNombre = “”<br />

TxtVacantes = “”<br />

TxtProfesor = “”<br />

TxtCodigo.SetFocus<br />

Private Sub CmdEditar_Click()<br />

End Sub<br />

MODO_EDITAR True<br />

Private Sub CmdGuardar_Click()<br />

End Sub<br />

REG.ID_CURSO = Trim(TxtCodigo)<br />

REG.NOMBRE = Trim(TxtNombre)<br />

REG.VACANTES = TxtVacantes<br />

REG.PROFESOR = Trim(TxtProfesor)<br />

REG.ESTADO = True<br />

Put # N1, POSICION, REG<br />

MODO_EDITAR False<br />

Private Sub CmdEliminar_Click()<br />

Dim N2 As Integer<br />

Dim I As Integer, J As Integer<br />

REG.ESTADO = False<br />

Put # N1, POSICION, REG<br />

N2 = FreeFile()<br />

Pág. 184


End Sub<br />

Open “C:\DATA\TEMPO.DAT” For Random As # N2 Len = Len(REG)<br />

I = 1<br />

J = 1<br />

While Not EOF(N1)<br />

Wend<br />

Get # N1, I, REG<br />

If REG.ESTADO Then<br />

End If<br />

I = I + 1<br />

Close # N1, # N2<br />

Put # N2, J, REG<br />

J = J + 1<br />

Kill “C:\DATA\CURSO.DAT”<br />

Name “C:\DATA\TEMPO.DAT” As “C:\DATA\CURSO.DAT”<br />

Call ABRIR_ARCHIVO<br />

Call CmdPrimero_Click<br />

Private Sub CmdSalir_Click()<br />

Close # N1<br />

End<br />

End Sub<br />

ARCHIVOS DE ACCESO BINARIO<br />

Pág. 185


Un archivo binario contiene más que simplemente texto.<br />

Puede contener imágenes, sonido, hojas de cálculo, o documentos<br />

concebidos para el procesamiento de texto.<br />

El acceso binario permite la posibilidad de tratar<br />

cualquier archivo como una secuencia numerada de bytes,<br />

independientemente de la estructura del mismo. Los bytes ocupan<br />

las posiciones 1, 2, 3, etc. Por ejemplo, si se requiere<br />

recuperar un dato de tipo entero (Integer, 2 bytes) de la<br />

posición 3 del archivo, serían recuperados los bytes 3 y 4 para<br />

poder formar el valor del entero. Por tanto, antes de trabajar<br />

con archivos binarios es necesario conocer cómo fueron escritos<br />

los datos que contiene para poder recuperarlos correctamente.<br />

Sentencia Open<br />

Permite abrir un archivo para acceso binario. Su sintaxis<br />

es de la forma:<br />

Open NOMBRE_ARCHIVO For Binary As # NÚMERO_ARCHIVO<br />

Donde NOMBRE_ARCHIVO es una cadena que especifica el<br />

nombre del archivo que se debe ser abierto en modo Binary.<br />

El parámetro NÚMERO_ARCHIVO es un entero cuyo valor está<br />

comprendido entre 1 y 51<strong>1.</strong> Este número será asociado con el<br />

nombre del archivo mientras permanezca abierto.<br />

Sentencia Put<br />

Pág. 186


Permite grabar en un archivo binario tantos bytes como<br />

haya en una variable. Su sintaxis es:<br />

Put # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE<br />

Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el<br />

archivo. POSICIÓN es el número de byte a partir del cual se han<br />

de grabar los datos contenidos en VARIABLE.<br />

Sentencia Get<br />

Permite leer de un archivo binario tantos bytes como<br />

quepan en una variable. Su sintaxis es de la forma:<br />

Get # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE<br />

Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el<br />

archivo. POSICIÓN es el número de byte a partir del cual se han<br />

de leer los datos almacenados en VARIABLE.<br />

Sentencia Seek<br />

Permite situar la posición de lectura o de escritura en<br />

una posición determinada dentro del archivo. Su sintaxis es:<br />

Get # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE<br />

Donde POSICIÓN es el número de byte a partir del cual<br />

queremos leer o escribir dentro del archivo.<br />

Pág. 187


Como ejemplo vamos a desarrollar una aplicación que<br />

permite guardar “cifrados” los textos ingresados en un cuadro<br />

de texto. Para ello crear un nuevo proyecto y ubicar en el<br />

formulario un cuadro de texto (TxtMensaje) y un botón de<br />

comando (CmdCifrar). Luego, ingrese el siguiente código:<br />

Const CLAVE As Integer = 3<br />

Private Sub CmdCifrar_Click()<br />

End Sub<br />

Dim N1 As Integer, I As Integer<br />

Dim CAR As String * 1<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.BIN” For Binary As # N1<br />

For I = 1 To Len(TxtMensaje)<br />

Next<br />

Close # N1<br />

CAR = Chr((Asc(Mid(TxtMensaje, I, 1)) + CLAVE) Mod 256)<br />

Put # N1, , CAR<br />

En el código la función Mid() obtiene el carácter “I” de<br />

la caja de texto, la función Asc() obtiene su código ANSI, al<br />

que sumamos el valor de CLAVE, para después obtener el resto de<br />

la división entre 256, con el fin de mantenernos en el rango de<br />

0 a 255 (rango de valores de la tabla de caracteres ANSI). Por<br />

último, la función Chr() retorna el carácter correspondiente al<br />

valor obtenido, el cual es almacenado en el archivo binario.<br />

Pág. 188


Por ejemplo si ingresa el mensaje “HOLA” se almacena en el<br />

archivo como “KROD” (lo puede comprobar mediante el Bloc de<br />

notas), ya que el valor ANSI de la “H” es 72, este carácter al<br />

sumarle el valor de CLAVE sería el 75 (72 + 3), que es la “K”,<br />

y así sucesivamente (ver la tabla de caracteres ANSI).<br />

El descifrado sería el proceso inverso, para ello crear un<br />

nuevo formulario y ubicar un botón de comando (CmdDescifrar),<br />

luego ingresar el código siguiente:<br />

Const CLAVE As Integer = 3<br />

Private Sub CmdDescifrar_Click()<br />

End Sub<br />

Dim N1 As Integer, I As Integer<br />

Dim CAR As String * 1, CADENA As String<br />

N1 = FreeFile()<br />

Open “C:\DATA\DEMO.BIN” For Binary As # N1<br />

Get # N1, , CAR<br />

While Not EOF(N1)<br />

Wend<br />

CAR = Chr((Asc(CAR) + (256 - Val(CLAVE))) Mod 256)<br />

CADENA = CADENA & CAR<br />

Get # N1, , CAR<br />

MsgBox CADENA<br />

Pág. 189


CAPÍTULO 8<br />

GRÁFICOS<br />

Un gráfico tiene por finalidad facilitar la legibilidad de<br />

la información que se presenta: “un gráfico vale más que mil<br />

palabras”.<br />

LOS COLORES<br />

En <strong>Visual</strong> <strong>Basic</strong> se pueden manipular los colores mediante<br />

tres formas diferentes: código hexadecimal, la función RGB() y<br />

la función QBColor().<br />

Código Hexadecimal<br />

Un código de color se compone de seis dígitos<br />

hexadecimales, cuyos valores van desde &H000000& (cero) hasta<br />

&HFFFFFF& (16 777 215). De forma práctica podemos guiarnos<br />

mediante:<br />

&HAAVVRR&<br />

Donde AA representa al color azul, VV al color verde y RR<br />

al color rojo. Todos los demás colores se obtienen mezclando<br />

estos tres colores.<br />

Pág. 190


Como ejemplo considere los siguientes códigos de colores<br />

que se presentan a continuación:<br />

AZUL = &HFF0000&<br />

VERDE = &H00FF00&<br />

ROJO = &H0000FF&<br />

NEGRO = &H000000&<br />

La función RGB()<br />

La función RGB() retorna un número de tipo entero largo<br />

(Long) que representa el valor de un color. Su sintaxis es:<br />

COLOR = RGB(nROJO, nVERDE, nAZUL)<br />

Donde nROJO, nVERDE, nAZUL son enteros comprendidos entre<br />

0 y 255. La siguiente tabla muestra algunos colores estándar y<br />

sus valores de nROJO, nVERDE y nAZUL:<br />

Color nROJO nVERDE nAZUL<br />

Negro 0 0 0<br />

Azul 0 0 255<br />

Verde 0 255 0<br />

Cián 0 255 255<br />

Rojo 255 0 0<br />

Magenta 255 0 255<br />

Amarillo 255 255 0<br />

Blanco 255 255 255<br />

Pág. 191


El ejemplo anterior (código hexadecimal) utilizando la<br />

función RGB() será similar a:<br />

AZUL = RGB(0, 0, 255)<br />

VERDE = RGB(0, 255, 0)<br />

ROJO = RGB(255, 0, 0)<br />

NEGRO = RGB(0, 0, 0)<br />

La función QBColor()<br />

La función QBColor() retorna un número de tipo entero largo<br />

(Long) que representa el código de color RGB correspondiente al<br />

número de color especificado. Su sintaxis es:<br />

COLOR = QBColor(nCOLOR)<br />

Donde el argumento nCOLOR es un entero entre 0 y 15; los<br />

valores que puede tomar se presentan en la siguiente tabla:<br />

Número Color Número Color<br />

0 Negro 8 Gris<br />

1 Azul 9 Azul claro<br />

2 Verde 10 Verde claro<br />

3 Cián 11 Cián claro<br />

4 Rojo 12 Rojo claro<br />

5 Magenta 13 Magenta claro<br />

6 Amarillo 14 Amarillo claro<br />

7 Blanco 15 Blanco brillante<br />

Pág. 192


El ejemplo inicial (código hexadecimal) utilizando la<br />

función QBColor() se soluciona como se muestra a continuación:<br />

AZUL = QBColor(1)<br />

VERDE = QBColor(2)<br />

ROJO = QBColor(4)<br />

NEGRO = QBColor(0)<br />

EL SISTEMA DE COORDENADAS<br />

Todas las operaciones gráficas descritas en este capítulo<br />

utilizan el sistema de coordenadas del área de dibujo (que<br />

puede ser la pantalla, un formulario, un cuadro de imagen, o<br />

cualquier otro contenedor).<br />

El sistema de coordenadas es una cuadrícula bidimensional<br />

que define ubicaciones del área de dibujo. Las ubicaciones de<br />

esta cuadrícula se definen mediante las coordenadas del área de<br />

dibujo:<br />

( X ,Y )<br />

Donde el valor de X es la ubicación del punto sobre el<br />

“eje X”, con la ubicación predeterminada (cero) en el extremo<br />

izquierdo. El valor de Y es la ubicación del punto sobre el<br />

eje Y , con la ubicación predeterminada (cero) en el extremo<br />

superior. Este sistema de coordenadas se ilustra en la<br />

siguiente figura:<br />

Pág. 193


El sistema de coordenadas de <strong>Visual</strong> <strong>Basic</strong> tiene las<br />

siguientes reglas:<br />

• El sistema de coordenadas predeterminado de cualquier<br />

contenedor empieza por la coordenada (0, 0) en la esquina<br />

superior izquierda del contenedor.<br />

• Las unidades de medida utilizadas para definir las<br />

ubicaciones a lo largo de los ejes se denominan<br />

colectivamente “escala”. En <strong>Visual</strong> <strong>Basic</strong>, cada eje del<br />

sistema de coordenadas puede tener su propia escala.<br />

• Todos los métodos gráficos utilizan el sistema de coordenadas<br />

del contenedor. Por ejemplo, las instrucciones que dibujan<br />

dentro de un cuadro de imagen utilizan el sistema de<br />

coordenadas de dicho control.<br />

Establecer las coordenadas de dibujo<br />

Para establecer las coordenadas de dibujo del contenedor<br />

se utilizan las propiedades CurrentX y CurrentY de dicho<br />

contenedor.<br />

Pág. 194


Por ejemplo, las instrucciones siguientes establecen las<br />

coordenadas de dibujo a la esquina superior izquierda de un<br />

cuadro de imagen:<br />

Picture<strong>1.</strong>CurrentX = 0<br />

Picture<strong>1.</strong>CurrentY = 0<br />

De forma predeterminada, los formularios y los cuadros de<br />

imagen utilizan un sistema de coordenadas en el que cada unidad<br />

corresponde a un “twip” (1 440 twips equivalen a una pulgada y<br />

567 twips son aproximadamente un centímetro).<br />

Cambiar la unidad de medida del sistema de coordenadas<br />

Para cambiar la unidad de medida del sistema de<br />

coordenadas su establece la propiedad ScaleMode a uno de los<br />

valores enumerados en la tabla siguiente:<br />

Valor de<br />

ScaleMode<br />

1 Twips<br />

2 Puntos<br />

Descripción<br />

3 Pixeles<br />

4 Caracteres<br />

5 Pulgadas<br />

6 Milímetros<br />

7 Centímetros<br />

Pág. 195


Por ejemplo la siguiente orden establece la escala a<br />

pulgadas de un cuadro de imagen:<br />

Picture<strong>1.</strong>ScaleMode = 5<br />

Crear una escala personalizada<br />

Para crear una escala personalizada se pueden utilizar las<br />

propiedades ScaleLeft, ScaleTop, ScaleWidth y ScaleHeight de un<br />

determinado objeto.<br />

Las propiedades ScaleLeft y ScaleTop asignan valores<br />

numéricos a la esquina superior izquierda de un objeto. Por<br />

ejemplo, las instrucciones siguientes establecen el valor de la<br />

esquina superior izquierda de un cuadro de imagen:<br />

Picture<strong>1.</strong>ScaleLeft = 100<br />

Picture<strong>1.</strong>ScaleTop = 100<br />

Las propiedades ScaleWidth y ScaleHeight definen las<br />

unidades según el ancho y el alto real del área de dibujo (si<br />

el objeto cambia de tamaño posteriormente, las unidades siguen<br />

siendo las mismas). Por ejemplo las instrucciones siguientes<br />

definen la unidad horizontal como 1/1 000 del ancho interno<br />

actual del cuadro de imagen y la unidad vertical como 1/500 del<br />

alto interno actual del cuadro de imagen:<br />

Picture<strong>1.</strong>ScaleWidth = 1000<br />

Picture<strong>1.</strong>ScaleHeight = 500<br />

Pág. 196


A manera de ejemplo considere la escala mostrada en la<br />

siguiente figura, la cual tiene ScaleLeft, ScaleTop, ScaleWidth<br />

y ScaleHeight establecidas todas a 100.<br />

Una forma más eficiente de personalizar la escala de un<br />

sistema de coordenadas es utilizando el método Scale. Su<br />

sintaxis es:<br />

OBJETO.Scale (X1, Y1) – (X2, Y2)<br />

Donde los valores de (X1, Y1) determinan las coordenadas<br />

de la esquina superior izquierda, los valores de (X2, Y2)<br />

determinan los valores de la esquina inferior derecha. Para<br />

obtener el mismo sistema de coordenadas de ejemplo anterior<br />

(donde se utilizó las propiedades ScaleLeft, ScaleTop,<br />

ScaleWidth y ScaleHeight) la orden sería la siguiente:<br />

Scale (100, 100)-(200, 200)<br />

Pág. 197


Donde es evidente que las diferencias entre las dos<br />

coordenadas “X” y las dos coordenadas “Y” determinan los<br />

valores de ScaleWidth y ScaleHeight, respectivamente.<br />

MÉTODOS GRÁFICOS<br />

<strong>Visual</strong> <strong>Basic</strong> proporciona varios métodos para la creación<br />

de gráficos. Los métodos gráficos, resumidos en la tabla<br />

siguiente, son aplicables a los formularios y a los cuadros de<br />

imagen.<br />

Método Descripción<br />

Cls Borra todos los gráficos y el resultado del<br />

método Print.<br />

Pset Dibuja un punto individual.<br />

Point Devuelve el color de un punto especificado.<br />

Line Dibuja una línea, un rectángulo o un cuadro<br />

relleno.<br />

Circle Dibuja una círculo, una elipse o un arco.<br />

PaintPicture Dibuja gráficos en ubicaciones arbitrarias.<br />

Print Imprime texto en formularios y cuadros de<br />

imagen.<br />

Para que la mayoría de los métodos gráficos funcionen<br />

correctamente la propiedad AutoRedraw del formulario debe está<br />

activada, caso contrario el dibujo no se visualizará.<br />

Puntos<br />

Pág. 198


Para el dibujo de puntos se usará el método Pset, cuya<br />

sintaxis es:<br />

OBJETO.Pset (X, Y), COLOR<br />

Donde X, Y son valores de tipo Single que indican las<br />

coordenadas horizontal (eje X) y vertical (eje Y) del punto que<br />

se va a dibujar. COLOR es un entero largo (Long) que indica el<br />

color RGB especificado para el punto, si se omite se usará el<br />

valor actual de la propiedad ForeColor de OBJETO.<br />

Como ejemplo vamos a crear una sencilla aplicación que<br />

permita dibujar puntos en la posición especificada mediante el<br />

ratón, con la posibilidad de poder seleccionar colores (tipo<br />

“Paint”).<br />

Pág. 199


Para el desarrollo de la presente aplicación proceda a<br />

crear un nuevo proyecto y agregar al formulario 34 cuadros de<br />

imagen. Luego ingresar el código mostrado.<br />

Objeto Nombre Descripción<br />

Picture1 . . . Picture32 PicColor Opciones de color<br />

Picture33 PicMuestra Color actual utilizado<br />

Picture34 PicLienzo Area de dibujo<br />

Dim COLOR As Single<br />

Private Sub Form_Load()<br />

End Sub<br />

PicLienzo.ScaleMode = 3<br />

PicLienzo.DrawWidth = 5<br />

COLOR = RGB(0, 0, 0)<br />

Private Sub PicColor_Click(Index As Integer)<br />

End Sub<br />

COLOR = PicColor(Index).BackColor<br />

PicMuestra.BackColor = COLOR<br />

Private Sub PicLienzo_MouseDown(Button As Integer, _<br />

End Sub<br />

If Button = vbLeftButton Then<br />

End If<br />

Shift As Integer, X As Single, Y As Single)<br />

PicLienzo.PSet (X, Y), COLOR<br />

Pág. 200


En el ejemplo anterior se utiliza la propiedad DrawWidth,<br />

la cual sirve para fijar el tamaño del punto dibujado.<br />

Para que el método Pset funcione correctamente la<br />

propiedad ScaleMode debe estar establecida a pixeles.<br />

Líneas, rectángulos y cuadros rellenos<br />

Para dibujar líneas, rectángulos o cuadros rellenos<br />

utilice el método Line, cuya sintaxis es:<br />

OBJETO.Line (X1, Y1) - (X2, Y2), COLOR, B/BF<br />

Donde X1, Y1 son valores de tipo Single que indican las<br />

coordenadas del punto inicial para la línea o el rectángulo.<br />

X2, Y2 son valores de tipo Single que indican las coordenadas<br />

del punto final para la línea o el rectángulo que se está<br />

dibujando. COLOR es un entero largo (Long) que indica el color<br />

RGB especificado para dibujar la línea, si se omite se usará el<br />

valor actual de la propiedad ForeColor de OBJETO. Los<br />

parámetros B y BF son opcionales: B hace que se dibuje un<br />

rectángulo usando las coordenadas para especificar las esquinas<br />

opuestas del mismo. BF especifica que el cuadro se rellena con<br />

el mismo color especificado mediante el parámetro COLOR.<br />

A manera de ejemplo vamos a mejorar nuestro sencillo<br />

“Editor gráfico”, de tal forma que además de dibujar puntos<br />

permita también dibujar líneas cuando se mantenga pulsado el<br />

botón izquierdo del ratón.<br />

Pág. 201


Para lograr nuestro cometido añadir el siguiente código a<br />

la aplicación anterior:<br />

Private Sub PicLienzo_MouseMove(Button As Integer, _<br />

End Sub<br />

If Button = vbLeftButton Then<br />

End If<br />

Shift As Integer, X As Single, Y As Single)<br />

PicLienzo.Line -(X, Y), COLOR<br />

Otro ejemplo sencillo para ilustrar como se usa el método<br />

Line para dibujar rectángulos y cuadros rellenos se presenta a<br />

continuación, consiste en dibujar una bandera directamente<br />

sobre el formulario, en este caso será la bandera de mi país:<br />

Perú.<br />

Pág. 202


Para este ejemplo crear una nueva aplicación e ingresar el<br />

código mostrado:<br />

Private Sub Form_Click()<br />

End Sub<br />

Height = 3 * 1440<br />

Width = 5 * 1440<br />

BackColor = QBColor(12)<br />

ForeColor = QBColor(15)<br />

Line (Width / 3, 0) - ((Width / 3) * 2, Height), , BF<br />

Círculos, elipses y arcos<br />

Para dibujar círculos, elipses o arcos se utiliza el<br />

método Circle, cuya sintaxis es:<br />

OBJETO.Circle (X, Y), RADIO, COLOR, INICIO, FIN, ASPECTO<br />

Pág. 203


Donde X, Y son valores de tipo Single que indican las<br />

coordenadas para el punto central del círculo, elipse o arco.<br />

RADIO es un valor de tipo Single que indica el radio del<br />

círculo, elipse o arco. COLOR es un valor entero de tipo Long<br />

que indica el color RGB del contorno del círculo, elipse o<br />

arco (es opcional). INICIO y FIN son valores de tipo Single,<br />

que especifican (en radianes) las posiciones de inicio y de fin<br />

del arco (son opcionales). ASPECTO es un valor de tipo Single<br />

que indica la relación de aspecto del círculo, el valor<br />

predeterminado es <strong>1.</strong>0, lo que produce un círculo perfecto (no<br />

elíptico) en cualquier pantalla (opcional).<br />

A manera de ejemplo vamos a mejor aún más nuestro “Editor<br />

gráfico” de tal manera que se podrá dibujar puntos, líneas,<br />

rectángulos, círculos y elipses.<br />

Pág. 204


Para el desarrollo de la presente aplicación se debe<br />

añadir al ejemplo anterior 5 botones de comandos y formar una<br />

matriz de controles (CmdForma). Luego ingresar el siguiente<br />

código:<br />

Dim COLOR As Single<br />

Dim FORMA As Integer<br />

Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single<br />

Private Sub CmdForma_Click(Index As Integer)<br />

End Sub<br />

FORMA = Index + 1<br />

Private Sub Form_Load()<br />

End Sub<br />

COLOR = RGB(0, 0, 0)<br />

FORMA = 1<br />

PicLienzo.ScaleMode = 3<br />

PicLienzo.DrawWidth = 3<br />

Private Sub PicColor_Click(Index As Integer)<br />

End Sub<br />

COLOR = PicColor(Index).BackColor<br />

PicMuestra.BackColor = COLOR<br />

Private Sub PicLienzo_MouseDown(Button As Integer, Shift As Integer, _<br />

End Sub<br />

If Button = vbLeftButton Then<br />

End If<br />

X1 = X<br />

Y1 = Y<br />

X As Single, Y As Single)<br />

Pág. 205


Private Sub PicLienzo_MouseUp(Button As Integer, Shift As Integer, _<br />

End Sub<br />

If Button = vbLeftButton Then<br />

End If<br />

X2 = X<br />

Y2 = Y<br />

X As Single, Y As Single)<br />

RADIO = Sqr((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2)) / 2<br />

Select Case FORMA<br />

Case 1<br />

Case 2<br />

Case 3<br />

Case 4<br />

Case 5<br />

End Select<br />

CONTROLES GRÁFICOS<br />

PicLienzo.PSet (X, Y), COLOR<br />

PicLienzo.Line -(X, Y), COLOR<br />

PicLienzo.Line (X1, Y1)-(X2, Y2), COLOR, B<br />

PicLienzo.Circle (X, Y), RADIO, COLOR<br />

PicLienzo.Circle (X, Y), RADIO, COLOR, , , 0.5<br />

<strong>Visual</strong> <strong>Basic</strong> proporciona tres controles gráficos diseñados<br />

para crear efectos gráficos en las aplicaciones:<br />

• Control Image (estudiado en el Capítulo 4)<br />

• Control Line<br />

• Control Shape<br />

Pág. 206


Control Line<br />

Line es un control gráfico que se muestra como una línea<br />

horizontal, vertical o diagonal.<br />

El control Line tiene una funcionalidad limitada y está<br />

pensado para usos sencillos. Para usos más avanzados debe usar<br />

el método Line.<br />

Propiedad Descripción<br />

BorderColor Devuelve o establece el color de la línea.<br />

BorderStyle Devuelve o establece el estilo de la línea.<br />

BorderWidth Devuelve o establece el ancho de la línea.<br />

X1, Y1, X2, Y2 Devuelven o establecen las coordenadas del<br />

Control Shape<br />

punto inicial (X1, Y1) y del punto final<br />

(X2, Y2) de la línea.<br />

Shape es un control gráfico que se muestra como un<br />

rectángulo, un cuadrado, una elipse, un círculo, un rectángulo<br />

redondeado o un cuadrado redondeado.<br />

El control Shape presenta propiedades similares al control<br />

Line (BorderColor, BorderStyle, BorderWidth). Adicionalmente,<br />

la propiedad Shape del control Shape proporciona seis formas<br />

predefinidas. En la tabla siguiente se enumeran todas las<br />

formas predefinidas, sus valores y las constantes de <strong>Visual</strong><br />

<strong>Basic</strong> equivalentes:<br />

Pág. 207


Forma Estilo Constante<br />

Rectángulo 0 vbShapeRectangle<br />

Cuadrado 1 vbShapeSquare<br />

Elipse 2 vbShapeOval<br />

Círculo 3 vbShapeCircle<br />

Rectángulo redondeado 4 vbShapeRoundedRectangle<br />

Cuadrado redondeado 5 vbShapeRoundedSquare<br />

Las seis formas predefinidas que presenta el control Shape<br />

se muestran en el siguiente formulario:<br />

GRAFICACIÓN MATEMÁTICA<br />

Como la mayor parte de las ecuaciones matemáticas expresa<br />

relaciones complicadas en una, dos tres o más dimensiones,<br />

tratar de entenderlas sin gráficas es casi lo mismo que tratar<br />

de caminar con los ojos vendados.<br />

Funciones algebraicas<br />

Pág. 208


Como ejemplo de este tipo de gráficas vamos a dibujar una<br />

parábola, cuya ecuación matemática (ecuación general de segundo<br />

grado) es de la forma:<br />

= + +<br />

2<br />

f ( x) Ax Bx C<br />

Para realizar la presente aplicación crear un nuevo<br />

proyecto y añadir al formulario un cuadro de imagen (PicPlano),<br />

tres cuadros de texto (TxtA, TxtB, TxtC) y un botón de comandos<br />

(Cmd<strong>Visual</strong>izar). Los aspectos decorativos (etiquetas, marcos,<br />

etc.) quedan a criterio del lector. Luego ingresar el siguiente<br />

código:<br />

Dim A As Double, B As Double, C As Double<br />

Pág. 209


Function F(ByVal X As Single) As Single<br />

F = A * (X * X) + B * X + C<br />

End Function<br />

Private Sub Cmd<strong>Visual</strong>izar_Click()<br />

Dim X As Single<br />

A = TxtA<br />

B = TxtB<br />

C = TxtC<br />

PicPlano.Cls<br />

PicPlano.Scale (-100, 100)-(100, -100)<br />

PicPlano.Line (-100, 0)-(100, 0)<br />

PicPlano.Line (0, -100)-(0, 100)<br />

PicPlano.CurrentX = -10<br />

PicPlano.CurrentY = F(-10)<br />

For X = -10 To 10<br />

Next<br />

End Sub<br />

PicPlano.Line -(X, F(X))<br />

Funciones trigonométricas<br />

Graficar funciones trigonométricas (seno, coseno,<br />

tangente, cotangente, secante, cosecante) no es nada<br />

complicado, sino analice el siguiente ejemplo.<br />

Pág. 210


Para realizar nuestra aplicación de ejemplo crear un nuevo<br />

proyecto y añadir al formulario un cuadro de imagen (PicPlano)<br />

y 6 botones de comandos (CmdFuncion, es decir se trata de una<br />

matriz de controles). Luego ingresar el código siguiente:<br />

Private Sub CmdFuncion_Click(Index As Integer)<br />

End Sub<br />

PicPlano.Cls<br />

Dibuja (Index)<br />

Private Sub Dibuja(OP As Integer)<br />

PicPlano.Scale (-5, 5)-(5, -5)<br />

PicPlano.Line (-5, 0)-(5, 0)<br />

PicPlano.Line (0, -5)-(0, 5)<br />

DosPi = 8 * Atn(1)<br />

Pág. 211


Dim X As Single<br />

For X = -DosPi To DosPi Step 0.025<br />

Next<br />

End Sub<br />

Select Case OP<br />

Case 0<br />

Case 1<br />

Case 2<br />

Case 3<br />

Case 4<br />

Case 5<br />

End Select<br />

Y = Sin(X)<br />

Y = Cos(X)<br />

Y = Sin(X) / Cos(X)<br />

If X < -0.001 Or X > 0.001 Then<br />

End If<br />

Y = Cos(X) / Sin(X)<br />

Y = 1 / Cos(X)<br />

If X < -0.001 Or X > 0.001 Then<br />

End If<br />

PicPlano.PSet (X, Y)<br />

Gráficas en coordenadas polares<br />

Y = 1 / Sin(X)<br />

Pág. 212


Para el caso de las gráficas de ecuaciones polares tampoco<br />

es complicado, sólo hay que tener presente las siguientes<br />

consideraciones.<br />

Dado un punto Px ( , y)<br />

del plano, tal punto se encuentra a<br />

una distancia r del origen, y a un ángulo θ respecto del<br />

semieje horizontal positivo.<br />

De la gráfica se tiene que el punto P tiene coordenadas<br />

rectangulares<br />

( x, y ) y coordenadas polares (, r θ ) entonces se<br />

cumplen las siguientes relaciones de transformación:<br />

x= rcosθ y = rsenθ<br />

= + y<br />

θ =<br />

2 2 2<br />

De donde: r x ; tan y<br />

x<br />

Pág. 213


A continuación presentamos algunas ecuaciones polares<br />

características:<br />

Nombre Ecuación<br />

Circunferencia de radio<br />

Trébol de cuatro hojas<br />

n r = n<br />

r = 2cos2θ<br />

Cardioide r = 1 + cosθ<br />

Limazón<br />

Lemniscata<br />

Pétalo de rosa<br />

Espiral<br />

r = 1 + 2 cosθ<br />

2<br />

r = cos 2θ<br />

r = sen 4θ<br />

r =<br />

θ<br />

2n<br />

Espiral logarítmica n<br />

r e θ<br />

=<br />

Astroide<br />

Nefroide<br />

Concoide<br />

Estrofoide<br />

3<br />

r = (cos 2 θ )<br />

r = 3cos2 θ − cos6θ<br />

r =<br />

1<br />

r = + 1<br />

cos 2θ<br />

1<br />

cos 2 θ + tan 2θ<br />

Para realizar una aplicación que permita dibujar<br />

ecuaciones polares crear un nuevo proyecto y añadir al<br />

formulario 1 cuadro de imagen (PicPlano), un cuadro de lista<br />

(LstEcuacion) y un botón de comandos (Cmd<strong>Visual</strong>izar). La<br />

apariencia de la interfaz debe ser similar a la de la figura<br />

mostrada:<br />

Pág. 214


Luego proceda a ingresar el código que se presenta a<br />

continuación:<br />

Dim OP As Integer<br />

Function F(ByVal THETA As Single) As Single<br />

Select Case OP<br />

Case 0 : F = 2<br />

Case 1 : F = 2 * Cos(2 * THETA)<br />

Case 2 : F = 1 + Cos(THETA)<br />

Case 3 : F = 1 + 2 * Cos(THETA)<br />

Case 4 : If Cos(2 * THETA) >= 0 Then F = Sqr(Cos(2 * THETA))<br />

Case 5 : F = Sin(4 * THETA)<br />

Case 6 : F = THETA / 2<br />

Case 7 : F = Exp(THETA / 8)<br />

Case 8 : F = Cos(2 * THETA) * Cos(2 * THETA) * Cos(2 * THETA)<br />

Pág. 215


Case 9 : F = 3 * Cos(2 * THETA) - Cos(6 * THETA)<br />

Case 10: F = 1 / Cos(2 * THETA) + 1<br />

Case 11: If Int(THETA / 45) THETA / 45 Or THETA 0 _<br />

End Select<br />

End Function<br />

Private Sub LstEcuacion_Click()<br />

OP = LstEcuacion.ListIndex<br />

End Sub<br />

Private Sub Cmd<strong>Visual</strong>izar_Click()<br />

Dim X As Single, Y As Single<br />

Dim I As Single, R As Single<br />

DosPi = 8 * Atn(1)<br />

PicPlano.Cls<br />

PicPlano.ScaleMode = 3<br />

Then F = 1 / (Cos(2 * THETA) + Tan(2 * THETA))<br />

PicPlano.Scale (-3.25, 3.25)-(3.25, -3.25)<br />

PicPlano.Line (-3.25, 0)-(3.25, 0)<br />

PicPlano.Line (0, -3.25)-(0, 3.25)<br />

For I = 0 To DosPi Step 0.01<br />

Next<br />

End Sub<br />

R = F(I)<br />

Fractales<br />

X = R * Cos(I)<br />

Y = R * Sin(I)<br />

PicPlano.PSet (X, Y), QBColor(1)<br />

Pág. 216


La matemática fractal es producto de la interacción de un<br />

matemático genial (Benoit B. Mandelbrot) y la computadora.<br />

El ahora ubicuo término fractal se debe al hecho de que la<br />

matemática fractal trabaja con fracciones, las figuras<br />

generadas no tienen una relación de enteros entre sus<br />

componentes, de modo que ninguna dimensión es producto de otra<br />

multiplicada por un entero. Es decir, al dividir una dimensión<br />

entre otra nunca se obtiene un resultado exacto. Los fractales<br />

generan figuras y estas figuras resultan tener una extraña<br />

similitud con algunas formas que genera la naturaleza.<br />

Entre las ecuaciones para generar fractales Mandelbrot ha<br />

producido una en particular que ha recibido el nombre de<br />

“Conjunto de Mandelbrot”. Esta ecuación se resuelve en el campo<br />

de los números comprendidos entre las longitudes -2.0 a +0.5 y<br />

las latitudes -<strong>1.</strong>25 a +<strong>1.</strong>25, está dominado por un gran mar<br />

fractal con bahías y entrantes. La expresión matemática del<br />

Conjunto de Mandelbrot es:<br />

Z Z C<br />

n+<br />

1 = +<br />

2<br />

n<br />

Donde C es un número complejo constante y Z es un número<br />

complejo variable que permite obtener las respectivas<br />

iteraciones (los valores de cada punto del paisaje fractal,<br />

latitud y longitud).<br />

Pág. 217


Como ejemplo vamos a obtener las tres primeras<br />

iteraciones. Para ello asignamos valores a C de cualquier<br />

posición arbitraria dentro del conjunto, digamos C = 1+ i y para<br />

arrancar las iteraciones podemos comenzar con Z = , luego:<br />

Z = + + i = + i<br />

2<br />

1 (0) (1 ) 1<br />

Z i i i<br />

2<br />

2 = (1 + ) + (1 + ) = 1+ 3<br />

Z i i i<br />

2<br />

3 = (1+ 3 ) + (1 + ) = − 7 + 7<br />

0 0<br />

Cuando se continua desarrollando el Conjunto de Mandelbrot<br />

se obtiene una figura similar a la mostrada:<br />

Pág. 218


Para el desarrollo de la presente aplicación crear un<br />

nuevo proyecto y añadir sobre el formulario un cuadro de imagen<br />

(PicPlano) y un botón de comandos (Cmd<strong>Visual</strong>izar), luego<br />

ingresar el código siguiente:<br />

Function Hipotenusa(ByVal A As Double, ByVal B As Double) As Double<br />

Hipotenusa = Sqr(A * A + B * B)<br />

End Function<br />

Private Sub Cmd<strong>Visual</strong>izar_Click()<br />

Dim MaxX As Integer, MaxY As Integer<br />

Dim Limite As Integer, Pasos As Integer<br />

Dim I As Integer, J As Integer<br />

Dim PasoX As Double, PasoY As Double<br />

Dim PosX As Double, PosY As Double<br />

Dim OrigX As Double, OrigY As Double<br />

Dim DimX As Double, DimY As Double<br />

Dim IterX As Double, IterY As Double, TempX As Double<br />

Dim Terminar As Boolean<br />

PicPlano.ScaleMode = 3<br />

MaxX = PicPlano.ScaleWidth<br />

MaxY = PicPlano.ScaleHeight<br />

Limite = 16<br />

OrigX = -2<br />

OrigY = -<strong>1.</strong>25<br />

DimX = 0.5<br />

DimY = <strong>1.</strong>25<br />

PasoX = (DimX - OrigX) / MaxX<br />

Pág. 219


End Sub<br />

PasoY = (DimY - OrigY) / MaxY<br />

For I = 0 To MaxX<br />

Next<br />

For J = 0 To MaxY<br />

Next<br />

PosX = OrigX + I * PasoX<br />

PosY = OrigY + J * PasoY<br />

IterX = 0 : IterY = 0<br />

Terminar = False<br />

Pasos = 0<br />

While (Not Terminar)<br />

Wend<br />

TempX = (IterX * IterX) - (IterY * IterY) + PosX<br />

IterY = 2 * (IterX * IterY) + PosY<br />

IterX = TempX<br />

Pasos = Pasos + 1<br />

If Hipotenusa(Abs(IterX), Abs(IterY)) >= 2 Then<br />

End If<br />

Terminar = True<br />

If (Pasos >= Limite) Then<br />

End If<br />

Terminar = True<br />

If (Pasos < Limite) Then<br />

End If<br />

PicPlano.PSet (I, J), QBColor(Pasos)<br />

Pág. 220


En este capítulo, debido a las limitaciones de espacio y<br />

materia, tan sólo se ofrece el camino de acceso a unos pocos de<br />

los diversos temas que abarca el fascinante mundo de la<br />

programación de gráficos por computadora.<br />

Muchos de estos temas siguen siendo materia de<br />

investigación (como el caso de los fractales), por lo que si<br />

Ud. desea profundizar en este laberinto de fascinación, no hay<br />

la garantía de un retorno sano y salvo a nuestro universo<br />

mundano.<br />

Pág. 221


GUÍA DE LABORATORIO<br />

Parte I<br />

ELABORADO POR<br />

CARLOS CASTILLO PERALTA<br />

cc_peralta@hotmail.com<br />

INTRODUCCIÓN<br />

Pág. 222


La presente Guía de Laboratorio de Microsoft <strong>Visual</strong> <strong>Basic</strong>,<br />

se elaboró con la finalidad de complementar la parte teórica<br />

con la parte práctica del curso. Los problemas presentan un<br />

grado de dificultad gradual, es decir, en cada práctica primero<br />

se comienzan con problemas muy sencillos con la finalidad de<br />

que el estudiante esclarezca dudas y quede claro en los<br />

conceptos asimilados en la teoría, y luego en los problemas<br />

posteriores se va incrementando el nivel de dificultad.<br />

Esta guía explora una gran variedad de materias y contiene<br />

muchos problemas recopilados a lo largo de varios años de<br />

experiencia. Espero que satisfaga las necesidades de los<br />

estudiantes y colegas, ya que ha sido elaborada teniendo en<br />

cuenta los objetivos de aprendizaje del curso.<br />

Si desean compartirla con otros colegas, me agradaría<br />

mucho que lo hicieran, con la única condición de que siempre se<br />

respete el derecho del autor.<br />

Desde ya les deseo la mejor de las suertes en el<br />

aprendizaje de Microsoft <strong>Visual</strong> <strong>Basic</strong>.<br />

Carlos Castillo Peralta<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Lima, Diciembre del 2000<br />

Pág. 223


GUÍA DE LABORATORIO Nº 1<br />

Objetivos<br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Identificar los elementos del entorno integrado de<br />

desarrollo de Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0.<br />

• Añadir controles a un formulario.<br />

• Establecer las propiedades de los controles.<br />

• Trabajar con procedimientos de eventos.<br />

• Crear una aplicación simple con Microsoft <strong>Visual</strong> <strong>Basic</strong>.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab1, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Elaborar una aplicación que permita calcular el salario<br />

neto de un trabajador en función del número de horas<br />

trabajadas, pago por hora de trabajo y un descuento fijo al<br />

sueldo bruto del 20 por 100. Los cálculos a efectuar para<br />

obtener el salario neto de un trabajador se muestran a<br />

continuación:<br />

SalarioBruto = HorasTrabajadas * PagoPorHora<br />

Descuento = 0.2 * SalarioBruto<br />

SalarioNeto = SalarioBruto - Descuento<br />

El diseño de la interfaz debe ser similar a la figura<br />

mostrada:<br />

Pág. 224


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

2 marcos<br />

6 etiquetas<br />

6 cajas de texto<br />

3 botones de comando<br />

Una vez ubicados los controles, establezca las propiedades<br />

según se indica:<br />

Form1<br />

Frame1<br />

Nombre FrmSalarioNeto<br />

BorderStyle 3-Fixed Dialog<br />

Caption Cálculo del salario neto<br />

Moveable False<br />

StartUpPosition 2-CenterScreen<br />

Nombre FraIngreso<br />

Pág. 225


Frame2<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Label5<br />

Label6<br />

Caption Ingreso de datos:<br />

Nombre FraSalida<br />

Caption Salida de datos:<br />

Nombre LblApellidosNombres<br />

AutoSize True<br />

Caption Apellidos y nombres:<br />

Nombre LblHorasTrabajadas<br />

AutoSize True<br />

Caption Horas trabajadas:<br />

Nombre LblPagoPorHora<br />

AutoSize True<br />

Caption Pago por hora S/.<br />

Nombre LblSalarioBruto<br />

AutoSize True<br />

Caption Salario bruto S/.<br />

Nombre LblDescuento<br />

AutoSize True<br />

Caption Descuento S/.<br />

Nombre LblSalarioNeto<br />

Pág. 226


Text1<br />

Text2<br />

Text3<br />

Text4<br />

Text5<br />

Text6<br />

Command1<br />

Command2<br />

AutoSize True<br />

Caption Salario neto S/.<br />

Nombre TxtApellidosNombres<br />

Text<br />

Nombre TxtHorasTrabajadas<br />

Text<br />

Nombre TxtPagoPorHora<br />

Text<br />

Nombre TxtSalarioBruto<br />

Text<br />

Nombre TxtDescuento<br />

Text<br />

Nombre TxtSalarioNeto<br />

Text<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdLimpiar<br />

Pág. 227


Command3<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Luego de establecer las propiedades para los controles,<br />

debe añadir código a la aplicación. Para ello haga doble click<br />

sobre el botón Aceptar e ingrese el siguiente código:<br />

Private Sub CmdAceptar_Click()<br />

Dim HorasTrabajadas As Integer, PagoPorHora As Double<br />

Dim SalarioBruto As Double<br />

Dim Descuento As Double<br />

Dim SalarioNeto As Double<br />

HorasTrabajadas = Val(TxtHorasTrabajadas)<br />

PagoPorHora = Val(TxtPagoPorHora)<br />

SalarioBruto = HorasTrabajadas * PagoPorHora<br />

Descuento = 0.2 * SalarioBruto<br />

SalarioNeto = SalarioBruto - Descuento<br />

TxtSalarioBruto = Str(SalarioBruto)<br />

TxtDescuento = Str(Descuento)<br />

TxtSalarioNeto = Str(SalarioNeto)<br />

End Sub<br />

A continuación haga doble click sobre el botón Salir y<br />

añada el siguiente código:<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Guarde y luego ejecute la aplicación que acaba de crear.<br />

Pruebe ingresando diferentes valores.<br />

Pág. 228


Luego, haga doble click sobre el botón Limpiar y añada el<br />

siguiente código:<br />

Private Sub CmdLimpiar_Click()<br />

TxtApellidosNombres = “”<br />

TxtHorasTrabajadas = “”<br />

TxtPagoPorHora = “”<br />

TxtSalarioBruto = “”<br />

TxtDescuento = “”<br />

TxtSalarioNeto = “”<br />

TxtApellidosNombres.SetFocus<br />

End Sub<br />

Guarde y ejecute su aplicación. ¿Cómo afecta el código<br />

añadido en el botón Limpiar a la aplicación?. Anote sus<br />

observaciones.<br />

Aplicación Nº 2<br />

El menú de un restaurante rápido se muestra a<br />

continuación:<br />

MENÚ PRECIO (S/.)<br />

Hamburguesa 2.50<br />

Cerveza 4.00<br />

Gaseosa 3.00<br />

Ensalada <strong>1.</strong>50<br />

Salchichas 2.00<br />

Refresco <strong>1.</strong>00<br />

Sopa <strong>1.</strong>50<br />

Postre <strong>1.</strong>50<br />

Se desea construir una<br />

aplicación que calcule las<br />

ventas totales al final del<br />

día, así como los impuestos<br />

a pagar (18 por 100).<br />

La interfaz de entrada<br />

y salida deberá ser similar<br />

a la figura mostrada a<br />

continuación:<br />

Pág. 229


Para el diseño del cuadro de menú utilizaremos el control<br />

Microsoft Hierarchical FlexGrid. Para tal fin, seleccione el<br />

Menú Proyecto y elija la opción Componentes:<br />

Pág. 230


A continuación active la casilla de verificación Microsoft<br />

Hierarchical FlexGrid Control 6.0 OLEDB y haga click sobre el<br />

botón Aceptar. En seguida este control se añadirá al Cuadro de<br />

Herramientas.<br />

Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

10 etiquetas<br />

10 cajas de texto<br />

1 control MSHFlexGrid<br />

3 botones de comando<br />

En seguida, elabore el diseño de entrada y salida. Para<br />

ello proceda a establecer las propiedades según se indica a<br />

continuación:<br />

Form1<br />

Label1<br />

Label2<br />

Nombre FrmRestaurante<br />

BorderStyle 3-Fixed Dialog<br />

Caption Restaurante<br />

Moveable False<br />

StartUpPosition 2-CenterScreen<br />

Nombre LblHamburguesa<br />

AutoSize True<br />

Caption Hamburguesa:<br />

Nombre LblCerveza<br />

AutoSize True<br />

Caption Cerveza:<br />

Pág. 231


Label3<br />

Label4<br />

Label5<br />

Label6<br />

Label7<br />

Label8<br />

Label9<br />

Nombre LblGaseosa<br />

AutoSize True<br />

Caption Gaseosa:<br />

Nombre LblEnsalada<br />

AutoSize True<br />

Caption Ensalada:<br />

Nombre LblSalchichas<br />

AutoSize True<br />

Caption Salchichas:<br />

Nombre LblRefresco<br />

AutoSize True<br />

Caption Refresco:<br />

Nombre LblSopa<br />

AutoSize True<br />

Caption Sopa:<br />

Nombre LblPostre<br />

AutoSize True<br />

Caption Postre:<br />

Nombre LblVentaTotal<br />

Caption Venta total S/.<br />

Pág. 232


Label10<br />

Nombre LblImpuesto<br />

Caption Impuesto S/.<br />

MSHFlexGrid1<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Text5<br />

Text6<br />

Nombre GrdMenu<br />

Font Arial (Negrita 10)<br />

FontFixed Arial (Negrita 10)<br />

Nombre TxtHamburguesa<br />

Text<br />

Nombre TxtCerveza<br />

Text<br />

Nombre TxtGaseosa<br />

Text<br />

Nombre TxtEnsalada<br />

Text<br />

Nombre TxtSalchichas<br />

Text<br />

Nombre TxtRefresco<br />

Text<br />

Pág. 233


Text7<br />

Text8<br />

Text9<br />

Text10<br />

Nombre TxtSopa<br />

Text<br />

Nombre TxtPostre<br />

Text<br />

Nombre TxtVentaTotal<br />

Locked<br />

Text<br />

True<br />

Nombre TxtImpuesto<br />

Locked True<br />

Text<br />

Command1<br />

Command2<br />

Command3<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Picture C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Icons\Arrows\Point04.ico<br />

Style 1-Graphical<br />

Pág. 234


En primer lugar debemos cargar los datos a la cuadrícula.<br />

Esto lo vamos a realizar en tiempo de ejecución al momento de<br />

cargarse en memoria el formulario. Para ello, haga doble click<br />

sobre el formulario y añada el siguiente código:<br />

Private Sub Form_Load()<br />

GrdMenu.Cols = 2<br />

GrdMenu.Rows = 9<br />

GrdMenu.FixedCols = 0<br />

GrdMenu.FixedRows = 1<br />

GrdMenu.TextArray(0) = “Menú”<br />

GrdMenu.TextArray(1) = “Precio”<br />

GrdMenu.TextArray(2) = “Hamburguesa”<br />

GrdMenu.TextArray(3) = “2.50”<br />

GrdMenu.TextArray(4) = “Cerveza”<br />

GrdMenu.TextArray(5) = “4.00”<br />

GrdMenu.TextArray(6) = “Gaseosa”<br />

GrdMenu.TextArray(7) = “3.00”<br />

GrdMenu.TextArray(8) = “Ensalada”<br />

GrdMenu.TextArray(9) = “<strong>1.</strong>50”<br />

GrdMenu.TextArray(10) = “Salchichas”<br />

GrdMenu.TextArray(11) = “2.00”<br />

GrdMenu.TextArray(12) = “Refresco”<br />

GrdMenu.TextArray(13) = “<strong>1.</strong>00”<br />

GrdMenu.TextArray(14) = “Sopa”<br />

GrdMenu.TextArray(15) = “<strong>1.</strong>50”<br />

GrdMenu.TextArray(16) = “Postre”<br />

GrdMenu.TextArray(17) = “<strong>1.</strong>50”<br />

End Sub<br />

Luego debemos añadir el código que se encargará de<br />

realizar los cálculos. Para tal fin haga doble click sobre el<br />

botón Aceptar y proceda a ingresar lo siguiente:<br />

Pág. 235


Private Sub CmdAceptar_Click()<br />

Dim Hamburguesa As Integer, Cerveza As Integer<br />

Dim Gaseosa As Integer, Ensalada As Integer<br />

Dim Salchichas As Integer, Refresco As Integer<br />

Dim Sopa As Integer, Postre As Integer<br />

Dim VentaTotal As Double, Impuesto As Double<br />

Hamburguesa = Val(TxtHamburguesa)<br />

Cerveza = Val(TxtCerveza)<br />

Gaseosa = Val(TxtGaseosa)<br />

Ensalada = Val(TxtEnsalada)<br />

Salchichas = Val(TxtSalchichas)<br />

Refresco = Val(TxtRefresco)<br />

Sopa = Val(TxtSopa)<br />

Postre = Val(TxtPostre)<br />

VentaTotal = Hamburguesa * 2.5 + Cerveza * 4.0 _<br />

+ Gaseosa * 3.0 + Ensalada * <strong>1.</strong>5 + Salchichas * 2.0 _<br />

+ Refresco * <strong>1.</strong>0 + Sopa * <strong>1.</strong>5 + Postre * <strong>1.</strong>5<br />

Impuesto = 0.18 * VentaTotal<br />

TxtVentaTotal = Str(VentaTotal)<br />

TxtImpuesto = Str(Impuesto)<br />

End Sub<br />

Luego, haga doble click sobre el botón Limpiar y añada el<br />

siguiente código:<br />

Private Sub CmdLimpiar_Click()<br />

TxtHamburguesa = “” : TxtCerveza = “”<br />

TxtGaseosa = “” : TxtEnsalada = “”<br />

TxtSalchichas = “” : TxtRefresco = “”<br />

TxtSopa = “” : TxtPostre = “”<br />

TxtVentaTotal = “” : TxtImpuesto = “”<br />

TxtHamburguesa.SetFocus<br />

End Sub<br />

Pág. 236


A continuación haga doble click sobre el botón Salir y<br />

añada el siguiente código:<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Aplicación Nº 3<br />

Elaborar una aplicación que permita calcular la edad de<br />

una persona a partir de su fecha de nacimiento. El diseño de la<br />

interfaz debe ser similar a la figura mostrada:<br />

Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

2 etiquetas<br />

2 cajas de texto<br />

3 botones de comando<br />

Luego, proceda a establecer las propiedades según se<br />

indica a continuación:<br />

Form1<br />

Nombre FrmEdad<br />

BorderStyle 3-Fixed Dialog<br />

Caption Calcula la edad de una persona<br />

Pág. 237


Label1<br />

Label2<br />

Text1<br />

Text2<br />

Command1<br />

Command2<br />

Command3<br />

Nombre LblFecNac<br />

AutoSize True<br />

Caption Fecha de nacimiento:<br />

Nombre LblEdad<br />

AutoSize True<br />

Caption Su edad es:<br />

Nombre TxtFecNac<br />

Text<br />

Nombre TxtEdad<br />

Locked<br />

Text<br />

True<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Default True<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Cancel True<br />

Caption &Salir<br />

En seguida proceda a ingresar el siguiente código:<br />

Pág. 238


Private Sub CmdAceptar_Click()<br />

Dim FecNac As Date, Edad As Integer<br />

FecNac = CDate(TxtFecNac)<br />

Edad = CInt((Date - FecNac) / 365)<br />

TxtEdad = Str(Edad) & “ años”<br />

End Sub<br />

Se deja como ejercicio para el estudiante el código<br />

asociado con los botones Limpiar y Salir, respectivamente.<br />

Aplicación Nº 4<br />

Se tiene un cajero automático el cual permite manipular<br />

cierta cantidad de dinero para lo cual dispone de los<br />

siguientes billetes: S/. 10.00, S/. 20.00, S/. 50.00,<br />

S/. 100.00 y S/. 200.00. Elaborar una aplicación que permita la<br />

lectura de la cantidad a retirar e indique el menor número de<br />

billetes a utilizar.<br />

Creo que a estas alturas Ud. ya entendió como funciona<br />

esto. Por ello, esta aplicación se deja como ejercicio para el<br />

estudiante.<br />

Pág. 239


GUÍA DE LABORATORIO Nº 2<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Implementar<br />

selectivas.<br />

aplicaciones utilizando estructuras de control<br />

• Usar casillas de verificación y botones de opción para<br />

alternar entre uno o más valores.<br />

• Utilizar<br />

mensajes.<br />

cajas de diálogo predefinidas para visualizar<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab2, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Se desea elaborar la boleta de pago de los trabajadores de<br />

una fábrica. Para ello se cuenta con los siguientes datos de<br />

entrada:<br />

Apellidos y nombres del trabajador<br />

Sueldo básico<br />

Horas extras trabajadas<br />

Además, se sabe que los trabajadores laboran en dos<br />

turnos: diurno y nocturno. Y que la tarifa por las horas extras<br />

diurnas es de 10 soles y por las horas extras nocturnas es de<br />

15 soles.<br />

Pág. 240


Los descuentos a aplicar son sobre el sueldo básico y se<br />

obtienen de la siguiente manera:<br />

Renta = Sueldo<strong>Basic</strong>o * 0.1<br />

Fonavi = Sueldo<strong>Basic</strong>o * 0.07<br />

AFP = Sueldo<strong>Basic</strong>o * 0.03<br />

Finalmente el sueldo neto del trabajador se calcula<br />

mediante las siguientes expresiones:<br />

Ingresos = Sueldo<strong>Basic</strong>o + HorasExtras * PagoHoraExtra<br />

Egresos = Renta + Fonavi + AFP<br />

SueldoNeto = Ingresos - Egresos<br />

El diseño de la interfaz deberá ser similar a la figura<br />

mostrada:<br />

Pág. 241


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

2 marcos<br />

5 etiquetas<br />

8 cajas de texto<br />

2 botones de opción<br />

3 casillas de verificación<br />

3 botones de comando<br />

Luego, proceda a establecer las propiedades según se<br />

indica a continuación:<br />

Form1<br />

Label1<br />

Label2<br />

Label3<br />

Nombre FrmBoletaDePago<br />

BorderStyle 3-Fixed Dialog<br />

Caption Boleta de pago<br />

Moveable False<br />

Nombre LblTrabajador<br />

AutoSize True<br />

Caption Trabajador:<br />

Nombre LblSueldo<strong>Basic</strong>o<br />

AutoSize True<br />

Caption Sueldo Bruto S/.<br />

Nombre LblHorasExtras<br />

AutoSize True<br />

Caption Horas extras:<br />

Pág. 242


Label4<br />

Label5<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Text5<br />

Nombre LblPagoHoraExtra<br />

AutoSize True<br />

Caption Pago hora extra S/.<br />

Nombre LblSueldoNeto<br />

AutoSize True<br />

Caption Sueldo neto S/.<br />

Nombre TxtTrabajador<br />

Text<br />

Nombre TxtSueldo<strong>Basic</strong>o<br />

Text<br />

Nombre TxtHorasExtras<br />

Text<br />

Nombre TxtPagoHoraExtra<br />

BackColor &H80000004&<br />

Text<br />

Nombre TxtRenta<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Pág. 243


Text6<br />

Text7<br />

Text8<br />

Option1<br />

Option2<br />

Check1<br />

Check2<br />

Nombre TxtFonavi<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Nombre TxtAFP<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Nombre TxtSueldoNeto<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Nombre OptDiurno<br />

Caption Diurno<br />

Value True<br />

Nombre OptNocturno<br />

Caption Nocturno<br />

Value False<br />

Nombre ChkRenta<br />

Caption Renta<br />

Pág. 244


Check3<br />

Command1<br />

Command2<br />

Command3<br />

Nombre ChkFonavi<br />

Caption Fonavi<br />

Nombre ChkAFP<br />

Caption AFP<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Default True<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Cancel True<br />

Caption &Salir<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el código que se indica a continuación:<br />

Private Sub CmdAceptar_Click()<br />

Dim Sueldo<strong>Basic</strong>o As Double<br />

Dim HorasExtras As Integer, PagoHoraExtra As Double<br />

Dim Renta As Double, Fonavi As Double, AFP As Double<br />

Dim Ingresos As Double, Egresos As Double<br />

Dim SueldoNeto As Double<br />

Sueldo<strong>Basic</strong>o = Val(TxtSueldo<strong>Basic</strong>o)<br />

HorasExtras = Val(TxtHorasExtras)<br />

If OptDiurno Then<br />

Pág. 245


PagoHoraExtra = 10<br />

End If<br />

If OptNocturno Then<br />

PagoHoraExtra = 15<br />

End If<br />

If ChkRenta.Value Then<br />

Renta = Sueldo<strong>Basic</strong>o * 0.1<br />

Else<br />

Renta = 0<br />

End If<br />

If ChkFonavi.Value Then<br />

Fonavi = Sueldo<strong>Basic</strong>o * 0.07<br />

Else<br />

Fonavi = 0<br />

End If<br />

If ChkAFP.Value Then<br />

AFP = Sueldo<strong>Basic</strong>o * 0.03<br />

Else<br />

AFP = 0<br />

End If<br />

Ingresos = Sueldo<strong>Basic</strong>o + HorasExtras * PagoHoraExtra<br />

Egresos = Renta + Fonavi + AFP<br />

SueldoNeto = Ingresos - Egresos<br />

TxtPagoHoraExtra = Str(PagoHoraExtra)<br />

TxtRenta = Str(Renta)<br />

TxtFonavi = Str(Fonavi) : TxtAFP = Str(AFP)<br />

TxtSueldoNeto = Str(SueldoNeto)<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Aplicación Nº 2<br />

Pág. 246


Cuatro notas entre 0 y 20 representan las calificaciones<br />

de un estudiante de un curso de programación. Elaborar una<br />

aplicación para obtener el promedio de esas calificaciones y<br />

visualizar su puntuación de acuerdo al siguiente cuadro:<br />

Promedio Puntuación<br />

19-20 A<br />

16-18 B<br />

11-15 C<br />

6-10 D<br />

0-5 E<br />

El diseño de la interfaz deberá ser similar a la figura<br />

mostrada:<br />

Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

7 etiquetas<br />

7 cajas de texto<br />

3 botones de comando<br />

Pág. 247


Luego, proceda a establecer las propiedades según se<br />

indica a continuación:<br />

Form1<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Label5<br />

Nombre FrmNotas<br />

BorderStyle 3-Fixed Dialog<br />

Caption Puntuación de un estudiante<br />

Nombre LblAlumno<br />

AutoSize True<br />

Caption Alumno:<br />

Nombre LblN1<br />

AutoSize True<br />

Caption Nota 1:<br />

Nombre LblN2<br />

AutoSize True<br />

Caption Nota 2:<br />

Nombre LblN3<br />

AutoSize True<br />

Caption Nota 3:<br />

Nombre LblN4<br />

AutoSize True<br />

Caption Nota 4:<br />

Pág. 248


Label6<br />

Label7<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Text5<br />

Nombre LblPromedio<br />

AutoSize True<br />

Caption Promedio:<br />

Nombre LblPuntuacion<br />

AutoSize True<br />

Caption Puntuación:<br />

Nombre TxtAlumno<br />

Text<br />

Nombre TxtN1<br />

Text<br />

Nombre TxtN2<br />

Text<br />

Nombre TxtN3<br />

Text<br />

Nombre TxtN4<br />

Text<br />

Pág. 249


Text6<br />

Text7<br />

Command1<br />

Command2<br />

Command3<br />

Nombre TxtPromedio<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Nombre TxtPuntuacion<br />

BackColor &H80000004&<br />

Locked True<br />

Text<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Default True<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Cancel True<br />

Caption &Salir<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el código que se indica:<br />

Private Sub CmdAceptar_Click()<br />

Dim N1 As Double, N2 As Double, N3 As Double, N4 As Double<br />

Dim Promedio As Integer<br />

N1 = Val(TxtN1) : N2 = Val(TxtN2)<br />

Pág. 250


N3 = Val(TxtN3) : N4 = Val(TxtN4)<br />

Promedio = CInt((N1 + N2 + N3 + N4) / 4)<br />

TxtPromedio = Str(Promedio)<br />

If Promedio >= 19 And Promedio = 16 And Promedio = 11 And Promedio = 6 And Promedio = 0 And Promedio


En caso de que el usuario ingrese algún dato incorrecto<br />

(por ejemplo 13 como un número de mes), se debe visualizar el<br />

siguiente mensaje:<br />

Cuando el usuario haga click en el botón Salir, se debe<br />

observar el siguiente mensaje:<br />

En caso de que el usuario elija la opción Si, la<br />

aplicación debe terminar. En caso contrario, es decir si el<br />

usuario elige la opción No, se debe proseguir con la<br />

aplicación.<br />

Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

4 etiquetas<br />

3 cajas de texto<br />

1 marco<br />

3 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Pág. 252


Form1<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Text1<br />

Text2<br />

Nombre FrmFecha<br />

BorderStyle 3-Fixed Dialog<br />

Caption Fecha en letras<br />

Nombre LblDia<br />

AutoSize True<br />

Caption Día:<br />

Nombre LblMes<br />

AutoSize True<br />

Caption Mes:<br />

Nombre LblAnno<br />

AutoSize True<br />

Caption Año:<br />

Nombre LblFecha<br />

AutoSize True<br />

Caption<br />

Nombre TxtDia<br />

Text<br />

Nombre TxtMes<br />

Text<br />

Pág. 253


Text3<br />

Command1<br />

Command2<br />

Command3<br />

Nombre TxtAnno<br />

Text<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Default True<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Una vez establecidas las propiedades de la interfaz<br />

proceda a ingresar el siguiente código:<br />

Private Sub CmdAceptar_Click()<br />

Dim CadMes As String, Mes As Integer<br />

Mes = Val(TxtMes)<br />

Select Case Mes<br />

Case 1: CadMes = “Enero”<br />

Case 2: CadMes = “Febrero”<br />

Case 3: CadMes = “Marzo”<br />

Case 4: CadMes = “Abril”<br />

Case 5: CadMes = “Mayo”<br />

Case 6: CadMes = “Junio”<br />

Case 7: CadMes = “Julio”<br />

Case 8: CadMes = “Agosto”<br />

Case 9: CadMes = “Setiembre”<br />

Pág. 254


Case 10: CadMes = “Octubre”<br />

Case 11: CadMes = “Noviembre”<br />

Case 12: CadMes = “Diciembre”<br />

Case Else<br />

MsgBox “Error de datos...”, vbCritical, “Mensaje”<br />

Call CmdLimpiar_Click<br />

Exit Sub<br />

End Select<br />

LblFecha = TxtDia & “ de ” & CadMes & “ de ” & TxtAnno<br />

End Sub<br />

Private Sub CmdLimpiar_Click()<br />

TxtDia = “” : TxtMes = “” : TxtAnno = “”<br />

TxtDia.SetFocus<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

If MsgBox(“¿Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Pregunta”) = vbYes Then<br />

End<br />

Else: Call CmdLimpiar_Click<br />

End If<br />

End Sub<br />

Aplicación Nº 4<br />

Un restaurante ofrece un descuento del 10% para consumos<br />

entre S/. 30.00 y S/. 50.00; un descuento del 20% para<br />

consumos mayores a S/. 50.00 nuevos soles; para todos los demás<br />

casos no se aplica ningún tipo de descuento. Elaborar una<br />

aplicación que permita determinar el importe a pagar por el<br />

consumidor. El diseño de la interfaz y otras consideraciones se<br />

dejan a su criterio.<br />

Pág. 255


GUÍA DE LABORATORIO Nº 3<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Implementar aplicaciones utilizando estructuras de control<br />

repetitivas.<br />

• Cambiar las propiedades de los controles en tiempo de<br />

ejecución.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab3, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Escribir una aplicación que lea un número entero y muestre<br />

la tabla de multiplicar de dicho número. El diseño de entrada y<br />

salida debe ser similar al siguiente:<br />

Pág. 256


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

1 etiqueta<br />

2 cajas de texto<br />

1 botón de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Label1<br />

Text1<br />

Text2<br />

Command1<br />

Nombre FrmTabla<br />

BorderStyle 3-Fixed Dialog<br />

Caption Tabla de multiplicar<br />

Nombre LblNumero<br />

Caption Ingrese un número:<br />

Nombre TxtNumero<br />

Text<br />

Nombre TxtTabla<br />

MultiLine True<br />

Locked True<br />

ScrollBars<br />

Text<br />

2-Vertical<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Pág. 257


Una vez diseñada la interfaz, proceda a ingresar el código<br />

que se indica a continuación:<br />

Private Sub TxtNumero_Change()<br />

If IsNumeric(TxtNumero) Then<br />

Dim N As Integer, P As Integer, I As Integer<br />

Dim S As String<br />

N = Val(TxtNumero)<br />

S = “”<br />

For I = 0 To 12<br />

P = N * I<br />

S = S & N & “ * ” & I & “ = ” & P & vbCrLf<br />

Next I<br />

TxtTabla = S<br />

ElseIf TxtNumero = “” Then<br />

Exit Sub<br />

Else: MsgBox “Ingrese un número”, vbCritical, “Mensaje”<br />

TxtTabla = “”<br />

End If<br />

End Sub<br />

Private Sub CmdLimpiar_Click()<br />

TxtNumero = “” : TxtTabla = “”<br />

TxtNumero.SetFocus<br />

End Sub<br />

Aplicación Nº 2<br />

Un número perfecto es un entero positivo, que es igual a<br />

la suma de todos los enteros positivos (excluido el mismo) que<br />

son divisores del número. El primer número perfecto es 6, ya<br />

que los divisores de 6 son 1, 2, 3 y 1 + 2 + 3 = 6. Escribir<br />

una aplicación que encuentre los tres primeros números<br />

perfectos.<br />

Pág. 258


El diseño de la interfaz debe ser similar a la figura<br />

mostrada:<br />

Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

1 marco<br />

1 caja de texto<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Text1<br />

Nombre FrmNumeroPerfecto<br />

BorderStyle 3-Fixed Dialog<br />

Caption Los 3 primeros números perfectos<br />

Nombre FraPerfecto<br />

Caption Número perfecto<br />

Nombre TxtPerfecto<br />

MultiLine<br />

Text<br />

True<br />

Pág. 259


Una vez establecidas las propiedades proceda a ingresar el<br />

código que se indica a continuación:<br />

Private Sub Form_Load()<br />

Dim N As Long, I As Long, S As Long<br />

Dim K As Integer, Cad As String<br />

N = 1 : K = 0 : Cad = “”<br />

While True<br />

S = 0<br />

For I = 1 To (N - 1)<br />

If N Mod I = 0 Then S = S + I<br />

Next I<br />

If N = S Then<br />

Cad = Cad & N & vbCrLf<br />

K = K + 1<br />

End If<br />

If K = 3 Then<br />

TxtPerfecto = Cad<br />

Exit Sub<br />

End If<br />

N = N + 1<br />

Wend<br />

End Sub<br />

Aplicación Nº 3<br />

Construya una aplicación que permita el ingreso de un<br />

número entero y muestre en pantalla la siguiente información:<br />

1) Cantidad de cifras, 2) Suma de cifras impares, 3) Suma de<br />

cifras pares, 4) Suma total de cifras, 5) Cifra mayor, 6) Cifra<br />

menor y 7) Divisores de dicho número.<br />

El diseño de la interfaz debe ser similar a la figura<br />

siguiente:<br />

Pág. 260


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

4 marcos<br />

7 etiquetas<br />

8 cajas de texto<br />

1 botón de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Nombre FrmNumeroPerfecto<br />

BorderStyle 3-Fixed Dialog<br />

Caption Los 3 primeros números perfectos<br />

Moveable False<br />

StartUpPosition 2-CenterScreen<br />

Pág. 261


Frame1<br />

Frame2<br />

Frame3<br />

Frame4<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Nombre FraEntrada<br />

Caption<br />

Nombre FraSalida<br />

Caption<br />

Nombre FraDivisores<br />

Caption Divisores<br />

Nombre FraSalir<br />

Caption<br />

Nombre LblNumero<br />

AutoSize True<br />

Caption Ingrese un número:<br />

Nombre LblCantCifras<br />

AutoSize True<br />

Caption Cantidad de cifras:<br />

Nombre LblSumImpares<br />

AutoSize True<br />

Caption Suma de cifras impares:<br />

Pág. 262


Label5<br />

Label6<br />

Label7<br />

Text1<br />

Text2<br />

Text3<br />

Nombre LblSumPares<br />

AutoSize True<br />

Caption Suma de cifras pares:<br />

Nombre LblSumTotal<br />

AutoSize True<br />

Caption Suma total de cifras:<br />

Nombre LblCifraMayor<br />

AutoSize True<br />

Caption Cifra mayor:<br />

Nombre LblCifraMenor<br />

AutoSize True<br />

Caption Cifra menor:<br />

Nombre TxtNumero<br />

Text<br />

Nombre TxtCantCifras<br />

Locked<br />

Text<br />

True<br />

Nombre TxtSumImpares<br />

Locked True<br />

Text<br />

Text4<br />

Pág. 263


Text5<br />

Text6<br />

Text7<br />

Text8<br />

Nombre TxtSumPares<br />

Locked True<br />

Text<br />

Command3<br />

Nombre TxtSumTotal<br />

Locked<br />

Text<br />

True<br />

Nombre TxtCifraMayor<br />

Locked<br />

Text<br />

True<br />

Nombre TxtCifraMenor<br />

Locked<br />

Text<br />

True<br />

Nombre TxtDivisores<br />

MultiLine True<br />

Locked True<br />

ScrollBars<br />

Text<br />

2-Vertical<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Picture C:\FundVB\Bitmaps\Exit.bmp<br />

Style 1-Graphical<br />

Pág. 264


Una vez establecidas las propiedades proceda ha ingresar<br />

el código que se indica a continuación:<br />

Private Sub CmdAceptar_Click()<br />

If IsNumeric(TxtNumero) Then<br />

Dim S As Integer, SI As Integer, SP As Integer<br />

Dim May As Integer, Min As Integer<br />

Dim Cad As String<br />

Dim I As Integer, J As Integer<br />

N = CLng(TxtNumero)<br />

M = CLng(TxtNumero)<br />

Cad = “”<br />

I = 0<br />

J = 1<br />

S = SP = SI = 0<br />

For J = 1 To N<br />

If (N Mod J = 0) Then<br />

Cad = Cad & J & vbCrLf<br />

End If<br />

Next J<br />

While (N > 0)<br />

If ((N Mod 10) Mod 2) = 0 Then<br />

SP = SP + (N Mod 10)<br />

Else<br />

SI = SI + (N Mod 10)<br />

End If<br />

S = S + (N Mod 10)<br />

N = N \ 10<br />

I = I + 1<br />

Wend<br />

May = Mid(TxtNumero, 1, 1)<br />

Men = May<br />

While (M > 0)<br />

Pág. 265


If May < (M Mod 10) Then<br />

May = M Mod 10<br />

End If<br />

If Men > (M Mod 10) Then<br />

Men = M Mod 10<br />

End If<br />

M = M \ 10<br />

Wend<br />

TxtCantCifras = Str(I)<br />

TxtSumImpares = Str(SI)<br />

TxtSumPares = Str(SP)<br />

TxtSumTotal = Str(S)<br />

TxtCifraMayor = Str(May)<br />

TxtCifraMenor = Str(Men)<br />

TxtDivisores = Cad<br />

Else<br />

MsgBox “Debe ingresar un número”, vbCritical, “Mensaje”<br />

TxtNumero.SetFocus<br />

End If<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

If MsgBox(“¿Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, "Pregunta") = vbYes Then<br />

End<br />

Else<br />

Cancel = True<br />

TxtNumero.SetFocus<br />

End If<br />

End Sub<br />

Aplicación Nº 4<br />

Pág. 266


Un centro numérico es un número que separa una lista de<br />

números enteros (comenzando en 1) en dos grupos de números,<br />

cuyas sumas son iguales. El primer centro numérico es el 6, el<br />

cual separa la lista (1 a 8) en los grupos: (1; 2; 3; 4; 5) y<br />

(7; 8) cuyas sumas son ambas iguales a 15. El segundo centro<br />

numérico es el 35, el cual separa la lista (1 a 49) en los<br />

grupos: (1 a 34) y (36 a 49) cuyas sumas son ambas iguales a<br />

595. Se pide elaborar una aplicación que calcule los centros<br />

numéricos entre 1 y N.<br />

El diseño de la interfaz y otras consideraciones se dejan<br />

a su criterio.<br />

Pág. 267


GUÍA DE LABORATORIO Nº 4<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Manipular y realizar operaciones con arreglos.<br />

• Crear una estructura y realizar operaciones con los campos de<br />

la misma.<br />

• Implementar arreglos de estructuras.<br />

• Trabajar con listas desplegables y cuadros combinados.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab4 para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Elabore una aplicación que permita leer N números de tipo<br />

entero, y a continuación los visualice ordenados en forma<br />

ascendente o descendente.<br />

Pág. 268


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

3 marcos<br />

1 caja de texto<br />

1 control lista<br />

2 botones de opción<br />

3 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Frame2<br />

Frame3<br />

Text1<br />

Nombre FrmBurbuja<br />

BorderStyle 3-Fixed Dialog<br />

Caption Ordenación por burbuja<br />

Moveable False<br />

Nombre FraNumero<br />

Caption Ingrese un nuevo número:<br />

Nombre FraLista<br />

Caption Lista de números:<br />

Nombre FraOrden<br />

Caption Orden:<br />

Nombre TxtNumero<br />

Text<br />

Pág. 269


List1<br />

Option1<br />

Option2<br />

Command1<br />

Command2<br />

Command3<br />

Nombre LstNumero<br />

List<br />

Nombre OptAscendente<br />

Caption Ascendente<br />

Value True<br />

Nombre OptDescendente<br />

Caption Descendente<br />

Value False<br />

Nombre CmdAnnadir<br />

Caption &Añadir<br />

Default True<br />

Nombre CmdOrdenar<br />

Caption &Ordenar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Picture C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Icons\Arrows\<br />

Point04.ico<br />

Style 1-Graphical<br />

Una vez establecidas las propiedades proceda a ingresar el<br />

código que se indica a continuación:<br />

Pág. 270


Private Sub CmdAceptar_Click()<br />

If IsNumeric(TxtNumero.Text) Then<br />

LstNumero.AddItem TxtNumero.Text<br />

TxtNumero.Text = “”<br />

TxtNumero.SetFocus<br />

Else<br />

MsgBox “Ingrese un número”, vbCritical, “Mensaje”<br />

TxtNumero.SelStart = 0<br />

TxtNumero.SelLength = Len(TxtNumero.Text)<br />

TxtNumero.SetFocus<br />

End If<br />

End Sub<br />

Private Sub CmdOrdenar_Click()<br />

Dim I As Integer, J As Integer, T As Integer, N As Integer<br />

Dim A() As Integer<br />

N = LstNumero.ListCount<br />

ReDim A(N)<br />

For I = 0 To N - 1<br />

A(I) = LstNumero.List(I)<br />

Next I<br />

If OptAscendente.Value Then<br />

For I = 0 To N - 2<br />

For J = I + 1 To N - 1<br />

If A(I) > A(J) Then<br />

T = A(I)<br />

A(I) = A(J)<br />

A(J) = T<br />

End If<br />

Next J<br />

Next I<br />

End If<br />

Pág. 271


If OptDescendente.Value Then<br />

For I = 0 To N - 2<br />

For J = I + 1 To N - 1<br />

If A(I) < A(J) Then<br />

T = A(I)<br />

A(I) = A(J)<br />

A(J) = T<br />

End If<br />

Next J<br />

Next I<br />

End If<br />

LstNumero.Clear<br />

For I = 0 To N - 1<br />

LstNumero.List(I) = A(I)<br />

Next I<br />

End Sub<br />

Private Sub Form_Unload(Cancel As Integer)<br />

If MsgBox(“Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Pregunta”) = vbYes Then<br />

End<br />

Else: Cancel = True : TxtNumero.SetFocus<br />

End If<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

Unload Me<br />

End Sub<br />

Aplicación Nº 2<br />

Elaborar una aplicación que permita seleccionar un<br />

artículo de un cuadro combinado (Combo). Apenas el usuario<br />

seleccione un artículo se debe mostrar el precio del mismo, el<br />

interés es fijo para esta ocasión.<br />

Pág. 272


figura:<br />

El diseño de la interfaz debe ser similar a la siguiente<br />

La venta ha realizarse es a plazos, ello condiciona la<br />

cuota mensual a pagarse. Cuando se haga click sobre el botón<br />

Cuota mensual debe mostrarse un cuadro de diálogo con los datos<br />

propuestos:<br />

De manera similar al hacer click sobre el botón Total nos<br />

debe mostrar la cantidad total a pagar.<br />

Pág. 273


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

1 marco<br />

3 etiquetas<br />

1 cuadro combinado<br />

2 cajas de texto<br />

3 botones de opción<br />

2 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Label1<br />

Label2<br />

Label3<br />

Nombre FrmCotizacion<br />

BorderStyle 3-Fixed Dialog<br />

Caption Pedido de cotizaciones<br />

Nombre FraPlazo<br />

Caption Plazo:<br />

Nombre LblArticulo<br />

Caption Artículo:<br />

Nombre LblPrecio<br />

Caption Precio US$<br />

Nombre LblInteres<br />

Caption Interés:<br />

Pág. 274


Combo1<br />

Text1<br />

Text2<br />

Option1<br />

Option2<br />

Option3<br />

Nombre CboArticulo<br />

Text<br />

Command1<br />

Nombre TxtPrecio<br />

Locked<br />

Text<br />

True<br />

Nombre TxtInteres<br />

Locked<br />

Text<br />

True<br />

Nombre OptPlazo<br />

Caption 6 meses<br />

Value True<br />

Nombre OptPlazo<br />

Caption 12 meses<br />

Value False<br />

Nombre OptPlazo<br />

Caption 24 meses<br />

Value False<br />

Nombre CmdCuotaMensual<br />

Caption &Cuota mensual<br />

Pág. 275


Command2<br />

Nombre CmdTotal<br />

Caption &Total<br />

Una vez establecidas las propiedades de la interfaz, haga<br />

doble click sobre el formulario e ingrese las siguientes<br />

declaraciones en la sección General del módulo de formulario:<br />

Private Type Articulo<br />

Nombre As String * 30<br />

Precio As Double<br />

End Type<br />

Dim A(4) As Articulo, Plazo As Integer<br />

Const Interes = 0.12<br />

Recuerde que un dato declarado en la sección General de un<br />

módulo puede ser accedido por todos los procedimientos de dicho<br />

módulo. Luego, continúe ingresando el código que se muestra a<br />

continuación:<br />

Private Sub Form_Load()<br />

A(0).Nombre = “Monitor SAMSUNG SyncMaster 3”<br />

A(1).Nombre = “Impresora Hewlett Packard DeskJet 930C”<br />

A(2).Nombre = “Impresora Epson Stylus Color 740”<br />

A(3).Nombre = “Microprocesador Pentium I 233 MHZ”<br />

A(0).Precio = 150 : A(1).Precio = 275<br />

A(2).Precio = 145 : A(3).Precio = 80<br />

Dim I As Integer<br />

For I = 1 To 4<br />

CboArticulo.AddItem A(I - 1).Nombre<br />

Next I<br />

TxtInteres = Interes : Plazo = 6<br />

End Sub<br />

Pág. 276


Private Sub CboArticulo_Click()<br />

Dim I As Integer<br />

I = CboArticulo.ListIndex<br />

TxtPrecio = A(I).Precio<br />

End Sub<br />

Private Sub OptPlazo_Click(Index As Integer)<br />

Select Case Index<br />

Case 0: Plazo = 6<br />

Case 1: Plazo = 12<br />

Case 2: Plazo = 24<br />

End Select<br />

End Sub<br />

Private Sub CmdCuotaMensual_Click()<br />

Dim Total As Double, CuotaMensual As Double, I As Integer<br />

I = CboArticulo.ListIndex<br />

Total = A(I).Precio * (1 + Interes)<br />

CuotaMensual = Total / Plazo<br />

MsgBox “Cuota Mensual US$” & Str(CuotaMensual)<br />

End Sub<br />

Private Sub CmdTotal_Click()<br />

Dim Total As Double, I As Integer<br />

I = CboArticulo.ListIndex<br />

Total = A(I).Precio * (1 + Interes)<br />

MsgBox “Total US$” & Str(Total)<br />

End Sub<br />

Aplicación Nº 3<br />

Se desea elaborar una aplicación que permita controlar el<br />

proceso de matrícula en un curso de computación. Para ello se<br />

deben recabar los siguientes datos: 1) <strong>Curso</strong> en que se<br />

Pág. 277


matricula el alumno, 2) Fecha de matrícula, 3) Apellidos y<br />

nombres, 4) Sexo, 5) Dirección, y 6) Distrito de residencia.<br />

Para el desarrollo de esta aplicación proceda a ubicar los<br />

siguientes controles en el formulario:<br />

4 marcos<br />

6 etiquetas<br />

5 cajas de texto<br />

1 cuadro combinado<br />

2 controles de lista<br />

4 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Pág. 278


Form1<br />

Frame1<br />

Frame2<br />

Frame3<br />

Frame4<br />

Label1<br />

Label2<br />

Label3<br />

Nombre FrmFichaMatricula<br />

BorderStyle 3-Fixed Dialog<br />

Caption Ficha de matrícula<br />

Nombre FraIngreso<br />

Caption Ingreso de datos:<br />

Nombre FraOpciones<br />

Caption Opciones:<br />

Nombre Fra<strong>Curso</strong>s<br />

Caption <strong>Curso</strong>s:<br />

Nombre FraDistritos<br />

Caption Distritos:<br />

Nombre Lbl<strong>Curso</strong><br />

Caption <strong>Curso</strong>:<br />

Nombre LblFechaMat<br />

Caption Fecha de matrícula:<br />

Nombre LblAlumno<br />

Caption Alumno:<br />

Pág. 279


Label4<br />

Label5<br />

Label6<br />

Combo1<br />

List1<br />

List2<br />

Text1<br />

Text2<br />

Nombre LblSexo<br />

Caption Sexo:<br />

Nombre LblDirección<br />

Caption Dirección:<br />

Nombre LblDistrito<br />

Caption Distrito:<br />

Nombre CboSexo<br />

Text<br />

Nombre Lst<strong>Curso</strong>s<br />

Text<br />

Nombre LstDistrito<br />

Text<br />

Nombre Txt<strong>Curso</strong><br />

Text<br />

Nombre TxtFechaMat<br />

Text<br />

Pág. 280


Text3<br />

Text4<br />

Text5<br />

Command1<br />

Command2<br />

Command3<br />

Command4<br />

Nombre TxtAlumno<br />

Text<br />

Nombre TxtDireccion<br />

Text<br />

Nombre TxtDistrito<br />

Text<br />

Nombre CmdGuardar<br />

Caption &Guardar<br />

Nombre CmdCancelar<br />

Caption &Cancelar<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Picture C:\FundVB\Bitmaps\Exit.bmp<br />

Style 1-Graphical<br />

Una vez establecidas las propiedades de la interfaz,<br />

proceda a ingresar el código que se indica a continuación:<br />

Pág. 281


Private Sub Form_Load()<br />

Lst<strong>Curso</strong>s.AddItem “Borland C++ Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Borland C++ Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> J++ Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> J++ Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft SQL Server Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft SQL Server Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft Power Builder Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft Power Builder Nivel II”<br />

LstDistrito.AddItem “Callao”<br />

LstDistrito.AddItem “Bellavista”<br />

LstDistrito.AddItem “Carmen de la Legua”<br />

LstDistrito.AddItem “La Perla”<br />

LstDistrito.AddItem “La Punta”<br />

LstDistrito.AddItem “Ventanilla”<br />

LstDistrito.AddItem “Cercado de Lima”<br />

LstDistrito.AddItem “Ancón”<br />

LstDistrito.AddItem “Ate”<br />

LstDistrito.AddItem “Barranco”<br />

LstDistrito.AddItem “Breña”<br />

LstDistrito.AddItem “Carabayllo”<br />

LstDistrito.AddItem “Comas”<br />

LstDistrito.AddItem “Chaclacayo”<br />

LstDistrito.AddItem “Chorrillos”<br />

LstDistrito.AddItem “El Agustino”<br />

LstDistrito.AddItem “Jesús María”<br />

LstDistrito.AddItem “La Molina”<br />

Pág. 282


LstDistrito.AddItem “La Victoria”<br />

LstDistrito.AddItem “Lince”<br />

LstDistrito.AddItem “Lurigancho”<br />

LstDistrito.AddItem “Lurín”<br />

LstDistrito.AddItem “Magdalena del Mar”<br />

LstDistrito.AddItem “Miraflores”<br />

LstDistrito.AddItem “Pachacamac”<br />

LstDistrito.AddItem “Pucusana”<br />

LstDistrito.AddItem “Pueblo Libre”<br />

LstDistrito.AddItem “Puente Piedra”<br />

LstDistrito.AddItem “Punta Negra”<br />

LstDistrito.AddItem “Rimac”<br />

LstDistrito.AddItem “San Bartolo”<br />

LstDistrito.AddItem “San Isidro”<br />

LstDistrito.AddItem “Independencia”<br />

LstDistrito.AddItem “San Juan de Miraflores”<br />

LstDistrito.AddItem “San Luis”<br />

LstDistrito.AddItem “San Martín de Porres”<br />

LstDistrito.AddItem “San Miguel”<br />

LstDistrito.AddItem “Santiago de Surco”<br />

LstDistrito.AddItem “Villa María del Triunfo”<br />

LstDistrito.AddItem “San Juan de Lurigancho”<br />

LstDistrito.AddItem “Santa María del Mar”<br />

LstDistrito.AddItem “Santa Rosa”<br />

LstDistrito.AddItem “Los Olivos”<br />

LstDistrito.AddItem “Cieneguilla”<br />

LstDistrito.AddItem “San Borja”<br />

LstDistrito.AddItem “Villa el Salvador”<br />

LstDistrito.AddItem “Santa Anita”<br />

CboSexo.AddItem “Masculino” : CboSexo.AddItem “Femenino”<br />

End Sub<br />

Private Sub Form_Unload(Cancel As Integer)<br />

If MsgBox(“¿Desea terminar la aplicación?”, _<br />

Pág. 283


vbQuestion + vbYesNo, “Pregunta”) = vbYes Then<br />

End<br />

Else<br />

Cancel = True<br />

Call CmdLimpiar_Click<br />

End If<br />

End Sub<br />

Private Sub Lst<strong>Curso</strong>s_Click()<br />

Txt<strong>Curso</strong>s = Lst<strong>Curso</strong>s<br />

End Sub<br />

Private Sub LstDistrito_Click()<br />

TxtDistrito = LstDistrito<br />

End Sub<br />

Private Sub CmdGuardar_Click()<br />

Lst<strong>Curso</strong>s.Enabled = False<br />

LstDistrito.Enabled = False<br />

Txt<strong>Curso</strong>s.Locked = True<br />

TxtFechaMat.Locked = True<br />

TxtAlumno.Locked = True<br />

CboSexo.Locked = True<br />

TxtDireccion.Locked = True<br />

TxtDistrito.Locked = True<br />

MsgBox “Alumno matriculado”, vbInformation, “Mensaje”<br />

End Sub<br />

Private Sub CmdLimpiar_Click()<br />

Lst<strong>Curso</strong>s.Enabled = True<br />

LstDistrito.Enabled = True<br />

Txt<strong>Curso</strong>s.Locked = False<br />

TxtFechaMat.Locked = False<br />

TxtAlumno.Locked = False<br />

Pág. 284


CboSexo.Locked = False<br />

TxtDireccion.Locked = False<br />

TxtDistrito.Locked = False<br />

Txt<strong>Curso</strong>s = “”<br />

TxtFechaMat = “”<br />

TxtAlumno = “”<br />

CboSexo = “”<br />

TxtDireccion = “”<br />

TxtDistrito = “”<br />

Txt<strong>Curso</strong>s.SetFocus<br />

End Sub<br />

Private Sub CmdCancelar_Click()<br />

If MsgBox(“¿Desea modificar algún dato?”, _<br />

vbQuestion + vbYesNo, “Mensaje”) = vbYes Then<br />

Lst<strong>Curso</strong>s.Enabled = True<br />

LstDistrito.Enabled = True<br />

Txt<strong>Curso</strong>s.Locked = False<br />

TxtFechaMat.Locked = False<br />

TxtAlumno.Locked = False<br />

CboSexo.Locked = False<br />

TxtDireccion.Locked = False<br />

TxtDistrito.Locked = False<br />

End If<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

Unload Me<br />

End Sub<br />

Aplicación Nº 4<br />

Pág. 285


Desarrollar una aplicación que permita realizar consultas<br />

acerca de un determinado curso, los cuales se mostraran en una<br />

lista. El usuario debe seleccionar un curso y en seguida se<br />

debe presentar el nombre del profesor encargado del curso<br />

(teoría), el nombre del jefe de práctica (laboratorio), así<br />

como los horarios de teoría y de laboratorio. El diseño de la<br />

interfaz deberá ser similar al siguiente:<br />

Pág. 286


GUÍA DE LABORATORIO Nº 5<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Crear procedimientos y funciones definidos por el usuario.<br />

• Añadir formularios creados anteriormente a un proyecto.<br />

• Cambiar el formulario de arranque de un proyecto.<br />

• Utilizar formularios MDI.<br />

• Manejar diferentes métodos y propiedades de los formularios.<br />

• Crear y utilizar menús en una aplicación.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab5, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Escriba una función que reciba como argumento una cadena<br />

de caracteres y la devuelva en forma inversa, por ejemplo si se<br />

ingresa la cadena CORAZON deberá retornar NOZAROC.<br />

Pág. 287


Para el desarrollo de esta aplicación, proceda a ubicar<br />

los siguientes controles en el formulario:<br />

2 etiquetas<br />

2 cajas de texto<br />

3 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Label1<br />

Label2<br />

Text1<br />

Text2<br />

Nombre FrmCadInvertida<br />

Caption Cadena invertida<br />

BorderStyle 3-Fixed Dialog<br />

Nombre LblCadena<br />

Autosize True<br />

Caption Ingresa una cadena:<br />

Nombre LblInvertida<br />

Autosize True<br />

Caption Cadena invertida:<br />

Nombre TxtCadena<br />

Text<br />

Nombre TxtInvertida<br />

Locked<br />

Text<br />

True<br />

Pág. 288


Command1<br />

Command2<br />

Command3<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdLimpiar<br />

Caption &Limpiar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Una vez establecidas las propiedades de la interfaz,<br />

proceda a ingresar el siguiente código:<br />

Function CadInvertida(Cadena As String) As String<br />

Dim Invertida() As String * 1<br />

Dim I As Integer<br />

Dim J As Integer<br />

N = Len(Cadena)<br />

ReDim Invertida(N)<br />

For I = 1 To N<br />

Invertida(I - 1) = Mid(Cadena, I, 1)<br />

Next I<br />

For J = (N - 1) To 0 Step -1<br />

CadInvertida = CadInvertida & Invertida(J)<br />

Next J<br />

End Function<br />

Private Sub CmdInvertir_Click()<br />

TxtInvertida = CadInvertida(TxtCadena)<br />

End Sub<br />

Pág. 289


Private Sub CmdLimpiar_Click()<br />

TxtCadena = “”<br />

TxtInvertida = “”<br />

TxtCadena.SetFocus<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

End<br />

End Sub<br />

Aplicación Nº 2<br />

Se desea elaborar una aplicación que permita controlar el<br />

proceso de matrícula en un curso de computación. Para ello se<br />

deben recabar los siguientes datos: 1) <strong>Curso</strong> en que se<br />

matricula el alumno, 2) Fecha de matrícula, 3) Apellidos y<br />

nombres, 4) Sexo, 5) Dirección, y 6) Distrito de residencia. El<br />

diseño de la interfaz debe ser similar a la figura mostrada:<br />

Para seleccionar un curso el usuario deberá hacer click en<br />

el botón punteado que se encuentra al lado de la caja de texto.<br />

En seguida se presentará un menú de selección por realce en el<br />

cual se presenta la relación de todos los cursos disponibles.<br />

Pág. 290


El curso quedará seleccionado al hacer click en el botón<br />

Aceptar.<br />

El mismo tipo de selección deberá realizarse al momento de<br />

ingresar el nombre del distrito.<br />

Para el desarrollo de esta aplicación necesitamos tres<br />

formularios y un módulo. En primer lugar proceda a añadir un<br />

módulo de código al proyecto. Seleccione el Menú Proyecto y<br />

Pág. 291


elija la opción Agregar módulo, se debe presentar un cuadro de<br />

diálogo similar a la siguiente figura:<br />

Del cuadro de diálogo Agregar módulo, en la ficha Nuevo,<br />

haga click en el botón Abrir. Luego ingrese el siguiente código<br />

en la sección de Declaraciones del módulo que acabamos de<br />

añadir:<br />

Public <strong>Curso</strong> As String<br />

Public Distrito As String<br />

En seguida proceda a cambiar el nombre formulario<br />

principal por FrmFichaMatricula. Luego debe añadir los demás<br />

formularios necesarios para construir la aplicación. Para tal<br />

fin, seleccione el menú Proyecto y elija la opción Agregar<br />

formulario. Del cuadro de diálogo Agregar formulario, en la<br />

ficha Nuevo, elija la opción Formulario y haga click en el<br />

botón Abrir. Se debe presentar un cuadro de diálogo similar a<br />

la siguiente figura:<br />

Pág. 292


En ese instante se añadirá un nuevo formulario al<br />

proyecto. Cambie el nombre del nuevo formulario por Frm<strong>Curso</strong>.<br />

Repita el procedimiento anterior para añadir el formulario<br />

FrmDistrito.<br />

A continuación copie los pasos de la pág. 55 a la pág. 62<br />

de la Guía de Laboratorio Nº 4 (Aplicación Nº 3) con los<br />

siguientes cambios:<br />

En la pág. 55, añadir sólo 2 marcos. No añadir ningún<br />

control de lista. En vez de 4 botones de comando, añadir 6<br />

botones de comando. Luego, establecer las siguientes<br />

propiedades para los dos nuevos botones:<br />

Command5<br />

Command6<br />

Nombre Cmd<strong>Curso</strong><br />

Caption . . .<br />

Pág. 293


Nombre CmdDistrito<br />

Caption . . .<br />

En la pág. 59, reemplazar el código del evento Load del<br />

formulario por el siguiente:<br />

Private Sub Form_Load()<br />

CboSexo.AddItem "Masculino"<br />

CboSexo.AddItem "Femenino"<br />

End Sub<br />

En la pág. 61, suprimir el código asociado al evento Click<br />

de los controles de lista Lst<strong>Curso</strong>s y LstDistrito. En su lugar<br />

añadir lo siguiente:<br />

Private Sub Cmd<strong>Curso</strong>_Click()<br />

Load Frm<strong>Curso</strong><br />

Frm<strong>Curso</strong>.Show vbModal<br />

Txt<strong>Curso</strong> = <strong>Curso</strong><br />

End Sub<br />

Private Sub CmdDistrito_Click()<br />

Load FrmDistrito<br />

FrmDistrito.Show vbModal<br />

TxtDistrito = Distrito<br />

End Sub<br />

A continuación active el formulario Frm<strong>Curso</strong>, para ello<br />

haga click sobre el mismo. En seguida proceda a ubicar los<br />

siguientes controles en el formulario:<br />

1 control de lista<br />

1 botones de comando<br />

Pág. 294


indica:<br />

Form2<br />

List1<br />

Command1<br />

Luego proceda a establecer las propiedades según se<br />

Nombre Frm<strong>Curso</strong><br />

BorderStyle 3-Fixed Dialog<br />

Caption <strong>Curso</strong>s<br />

Nombre Lst<strong>Curso</strong>s<br />

Text<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Una vez establecidas las propiedades proceda a ingresar el<br />

código que se indica a continuación:<br />

Private Sub Form_Load()<br />

Lst<strong>Curso</strong>s.AddItem “Borland C++ Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Borland C++ Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> FoxPro Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft <strong>Visual</strong> C++ Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft SQL Server Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft SQL Server Nivel II”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft Power Builder Nivel I”<br />

Lst<strong>Curso</strong>s.AddItem “Microsoft Power Builder Nivel II”<br />

End Sub<br />

Pág. 295


Private Sub CmdAceptar_Click()<br />

<strong>Curso</strong> = Lst<strong>Curso</strong>s.Text<br />

Frm<strong>Curso</strong>.Hide<br />

End Sub<br />

Por último, proceda Ud. a desarrollar el código respectivo<br />

para el formulario FrmDistrito.<br />

Aplicación Nº 3<br />

Elaborar una aplicación que permita presentar los<br />

diferentes tipos de formularios de <strong>Visual</strong> <strong>Basic</strong>. Utilice como<br />

contenedor principal un formulario MDI, tal como se muestra en<br />

la figura:<br />

Para el desarrollo de esta aplicación necesitamos utilizar<br />

un formulario MDI (interfaz de múltiples documentos). Para ello<br />

seleccione el Menú Proyecto y elija la opción Agregar<br />

formulario MDI, se debe presentar un cuadro de diálogo similar<br />

a la siguiente figura:<br />

Pág. 296


Del cuadro de diálogo Agregar formulario MDI, en la ficha<br />

Nuevo, haga click en el botón Abrir. En seguida cambie el<br />

nombre del formulario MDI por MDIPrincipal.<br />

A continuación proceda a añadir los formularios para las<br />

diferentes opciones del menú. Cambie los nombres de los<br />

formularios según se indica:<br />

Formulario Nombre<br />

Form1 FrmNone<br />

Form2 FrmFixedSingle<br />

Form3 FrmSizable<br />

Form4 FrmFixedDialog<br />

Form5 FrmFixedToolWindow<br />

Form6 FrmSizableToolWindow<br />

Form7 FrmAcercaDe<br />

Pág. 297


Luego proceda a diseñar el menú de opciones. Para ello<br />

haga click derecho sobre el formulario MDI y elija la opción<br />

Editor de menús. Establezca las propiedades según:<br />

Caption Name ShortCut<br />

&Menú Principal MnuPrincipal Ninguno<br />

&0-None MnuNone Ninguno<br />

&1-Fixed Single<br />

MnuFixedSingle Ninguno<br />

&2-Sizable MnuSizable Ninguno<br />

&3-Fixed Dialog<br />

MnuFixedDialog Ninguno<br />

&4-Fixed ToolWindow MnuFixedToolWindow Ninguno<br />

&5-Sizable ToolWindow<br />

MnuSizableToolWindow Ninguno<br />

- MnuLinea Ninguno<br />

&Acerca del autor MnuAcercaDe Ninguno<br />

&Salir MnuSalir Ctrl + X<br />

A continuación haga click en el botón Aceptar del Editor<br />

de menús. Luego proceda a ingresar el siguiente código para el<br />

formulario MDI:<br />

Private Sub MDIForm_Unload(Cancel As Integer)<br />

If MsgBox(“¿Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Mensaje”) = vbYes Then<br />

End<br />

Else: Cancel = True<br />

End If<br />

End Sub<br />

Private Sub MnuNone_Click()<br />

Load FrmNone<br />

FrmNone.Show<br />

End Sub<br />

Pág. 298


Private Sub MnuFixedSingle_Click()<br />

Load FrmFixedSingle<br />

FrmFixedSingle.Show<br />

End Sub<br />

Private Sub MnuSizable_Click()<br />

Load FrmSizable<br />

FrmSizable.Show<br />

End Sub<br />

Private Sub MnuFixedDialog_Click()<br />

Load FrmFixedDialog<br />

FrmFixedDialog.Show<br />

End Sub<br />

Private Sub MnuFixedToolWindow_Click()<br />

Load FrmFixedToolWindow<br />

FrmFixedToolWindow.Show<br />

End Sub<br />

Private Sub MnuSizableToolWindow_Click()<br />

Load FrmSizableToolWindow<br />

FrmSizableToolWindow.Show<br />

End Sub<br />

Private Sub MnuAcercaDe_Click()<br />

Load FrmAcercaDe<br />

FrmAcercaDe.Show<br />

End Sub<br />

Private Sub MnuSalir_Click()<br />

Unload Me<br />

End Sub<br />

Pág. 299


A continuación proceda a activar el formulario FrmNone y<br />

ubique un botón de comandos sobre el mismo. En seguida<br />

establezca las propiedades según se indica a continuación:<br />

Form1<br />

Command1<br />

Nombre FrmNone<br />

BorderStyle 0-None<br />

Caption None<br />

MDIChild True<br />

Nombre CmdVolver<br />

Caption &Volver<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el código que se muestra a continuación:<br />

Private Sub CmdVolver_Click()<br />

Unload Me<br />

End Sub<br />

Repita el procedimiento anterior para los demás tipos de<br />

formularios.<br />

Aplicación Nº 4<br />

Elaborar una aplicación que acepte como entrada la reserva<br />

de agua de un depósito y los litros que se consumen a la<br />

semana. Utilizando una función definida por el usuario<br />

determinar como resultado las cantidades de agua que quedan al<br />

final de cada semana. El proceso finalizará cuando no quede<br />

agua suficiente para una semana. Utilizar otro formulario para<br />

mostrar la salida.<br />

FIN PARTE I<br />

Pág. 300


GUÍA DE LABORATORIO<br />

Parte II<br />

ELABORADO POR<br />

CARLOS CASTILLO PERALTA<br />

cc_peralta@hotmail.com<br />

INTRODUCCIÓN<br />

Pág. 301


La presente Guía de Laboratorio de Microsoft <strong>Visual</strong> <strong>Basic</strong>,<br />

se elaboró con la finalidad de complementar la parte teórica<br />

con la parte práctica del curso. Los problemas presentan un<br />

grado de dificultad gradual, es decir, en cada práctica primero<br />

se comienzan con problemas muy sencillos con la finalidad de<br />

que el estudiante esclarezca dudas y quede claro en los<br />

conceptos asimilados en la teoría, y luego en los problemas<br />

posteriores se va incrementando el nivel de dificultad.<br />

Esta guía explora una gran variedad de materias y contiene<br />

muchos problemas recopilados a lo largo de varios años de<br />

experiencia. Espero que satisfaga las necesidades de los<br />

estudiantes y colegas, ya que ha sido elaborada teniendo en<br />

cuenta los objetivos de aprendizaje del curso.<br />

Si desean compartirla con otros colegas, me agradaría<br />

mucho que lo hicieran, con la única condición de que siempre se<br />

respete el derecho del autor.<br />

Desde ya les deseo la mejor de las suertes en el<br />

aprendizaje de Microsoft <strong>Visual</strong> <strong>Basic</strong>.<br />

Carlos Castillo Peralta<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Lima, Diciembre del 2000<br />

Pág. 302


GUÍA DE LABORATORIO Nº 6<br />

Objetivos<br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Crear y manipular bases de datos utilizando Microsoft Access.<br />

• Adicionar un entorno de datos a un proyecto.<br />

• Conectar un origen de datos a un objeto Connection.<br />

• Utilizar un objeto Command para recuperar registros de un<br />

origen de datos.<br />

• Crear formularios con datos enlazados.<br />

• Realizar consultas utilizando sentencias SQL.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab6, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Creación de la base de datos con Microsoft Access 2000<br />

Para desarrollar nuestras prácticas de laboratorio debemos<br />

crear una base de datos cuyo nombre es <strong>Curso</strong>sLibres.MDB, la<br />

cual contendrá las tablas <strong>Curso</strong> y Laboratorio. La tarea de<br />

crear una base de datos con Microsoft Access 2000 es muy<br />

sencilla. Para tal fin debe realizar lo siguiente:<br />

• Arrancar Microsoft Access 2000.<br />

• Seleccionar la orden Nueva. . . del Menú Archivo.<br />

• Dentro del cuadro de diálogo Nueva, en la ficha General,<br />

seleccionar Base de datos y hacer click en el botón Aceptar.<br />

• Ingresar un nombre para la base de datos, para nuestro caso<br />

ingrese <strong>Curso</strong>sLibres. En seguida se mostrará una ventana<br />

similar a la siguiente:<br />

Pág. 303


• Proceda a crear una nueva tabla. Para ello seleccionar la<br />

opción Tablas y haga doble click en Crear una tabla en vista<br />

Diseño.<br />

• Introducir el nombre, el tipo y las propiedades para cada uno<br />

de los campos. Para nuestro caso ingrese lo siguiente:<br />

Tabla <strong>Curso</strong><br />

Nombre del<br />

Campo<br />

Tipo Ancho Descripción<br />

CurCodigo T 03 Código del curso<br />

CurNombre T 30 Nombre del curso<br />

CurVacantes N 03 Número de vacantes disponibles<br />

CurProfe T 50 Nombre del profesor de teoría<br />

CurSilabo M 50 Sílabo de cada curso<br />

• Luego, debe asignar un nombre a la tabla al momento de<br />

cerrarla. Para nuestro caso asígnele el nombre de <strong>Curso</strong>.<br />

• Por último, proceda a abrir la tabla e introducir datos. Para<br />

nuestro caso, ingrese la siguiente información:<br />

Pág. 304


CurCodigo CurNombre CurProfe<br />

BC1 Borland C++ Nivel I Linares Alarcon, Adams<br />

BC2 Borland C++ Nivel II Córdoba Saavedra, Javier<br />

BC3 Borland C++ Nivel III Castillo Peralta, Carlos<br />

VB1 MS <strong>Visual</strong> <strong>Basic</strong> Nivel I Linares Alarcon, Adams<br />

VB2 MS <strong>Visual</strong> <strong>Basic</strong> Nivel II Linares Alarcon, Adams<br />

VB3 MS <strong>Visual</strong> <strong>Basic</strong> Nivel III Castillo Peralta, Carlos<br />

VC1 MS <strong>Visual</strong> C++ Nivel I Córdoba Saavedra, Javier<br />

VC2 MS <strong>Visual</strong> C++ Nivel II Castillo Peralta, Carlos<br />

VJ1 MS <strong>Visual</strong> J++ Nivel I Castillo Peralta, Carlos<br />

VJ2 MS <strong>Visual</strong> J++ Nivel II Castillo Peralta, Carlos<br />

VF1 MS <strong>Visual</strong> FoxPro Nivel I Linares Alarcon, Adams<br />

VF2 MS <strong>Visual</strong> FoxPro Nivel II Castillo Peralta, Carlos<br />

VF3 MS <strong>Visual</strong> FoxPro Nivel III Castillo Peralta, Carlos<br />

PB1 Power Builder Nivel I Córdoba Saavedra, Javier<br />

PB2 Power Builder Nivel II Córdoba Saavedra, Javier<br />

SQ1 MS SQL Server Nivel I Córdoba Saavedra, Javier<br />

SQ2 MS SQL Server Nivel II Córdoba Saavedra, Javier<br />

WIN MS Windows 98 Montes Tejada, Estela<br />

A menudo, el proceso de diseño de la base de datos es<br />

bastante complejo. Para nosotros ha sido fácil, pues se nos<br />

brinda la estructura de las tablas.<br />

De manera análoga, proceda a crear la siguiente tabla<br />

según se indica a continuación:<br />

Tabla Laboratorio<br />

Nombre del<br />

Campo<br />

Tipo Ancho Descripción<br />

LabCodigo T 03 Código del curso<br />

Pág. 305


LabHora T 08 Horario de laboratorio<br />

LabProfe T 50 Nombre del profesor de laboratorio<br />

Al momento de cerrar la tabla que acaba de crear, asígnele<br />

el nombre de Laboratorio. Luego, proceda a ingresar la<br />

siguiente información:<br />

LabCodigo LabHora LabProfe<br />

BC1 SA 08-10 Castillo Peralta, Carlos<br />

BC2 SA 10-12 Linares Alarcon, Adams<br />

BC3 DO 10-12 Castillo Peralta, Carlos<br />

VB1 SA 08-10 Montes Tejada, Estela<br />

VB2 DO 10-12 Linares Alarcon, Adams<br />

VB3 DO 08-10 Castillo Peralta, Carlos<br />

VC1 DO 08-10 Linares Alarcon, Adams<br />

VC2 DO 10-12 Córdoba Saavedra, Javier<br />

VJ1 SA 16-18 Castillo Peralta, Carlos<br />

VJ2 SA 18-20 Castillo Peralta, Carlos<br />

VF1 SA 08-10 Linares Alarcon, Adams<br />

VF2 DO 08-10 Córdoba Saavedra, Javier<br />

VF3 DO 14-16 Linares Alarcon, Adams<br />

PB1 VI 16-18 Córdoba Saavedra, Javier<br />

PB2 VI 14-16 Córdoba Saavedra, Javier<br />

SQ1 SA 16-18 Córdoba Saavedra, Javier<br />

SQ2 SA 18-20 Córdoba Saavedra, Javier<br />

WIN SA 10-12 Montes Tejada, Estela<br />

Aplicación Nº 1<br />

Elaborar una aplicación que permita realizar el<br />

mantenimiento de la información almacenada en la tabla <strong>Curso</strong> de<br />

Pág. 306


la base de datos <strong>Curso</strong>sLibres.MDB. El diseño de la interfaz<br />

debe ser similar a la figura mostrada:<br />

Los botones ubicados en el marco Navegador (Primero,<br />

Anterior, Siguiente y Ultimo, de izquierda a derecha) permiten<br />

desplazarse a través de la tabla. Los botones ubicados en el<br />

marco Mantenimiento (Nuevo, Editar, Guardar y Eliminar, de<br />

izquierda a derecha) permiten realizar las operaciones básicas<br />

de mantenimiento de la tabla.<br />

Para desarrollar nuestra aplicación, lo primero que<br />

debemos hacer es conectarnos a la base de datos<br />

<strong>Curso</strong>sLibres.MDB. Para ello ingrese a <strong>Visual</strong> <strong>Basic</strong> de manera<br />

habitual, a continuación en el menú Proyecto seleccione la<br />

opción Agregar Data Environment y se creará una nueva conexión<br />

para la que debe establecer propiedades de vínculo de datos. En<br />

la ventana Data Environment cambie el nombre del objeto<br />

DataEnvironment por De<strong>Curso</strong>sLibres y el de la conexión por<br />

Cn<strong>Curso</strong>sLibres. El aspecto de la ventana Data Environment<br />

deberá ser similar a la siguiente figura:<br />

Pág. 307


Luego haga click con el botón derecho del ratón en<br />

Cn<strong>Curso</strong>sLibres y seleccione la opción Propiedades. Deberá<br />

presentarse un cuadro de diálogo similar al siguiente:<br />

En la ficha Proveedor del cuadro de diálogo anterior,<br />

seleccione Microsoft Jet 4.0 OLE DB Provider y haga click en el<br />

Pág. 308


otón Siguiente. En seguida aparecerá un cuadro de diálogo<br />

similar al mostrado:<br />

En la ficha Conexión del cuadro de diálogo Propiedades de<br />

Data Link escriba el nombre de la base de datos<br />

<strong>Curso</strong>sLibres.MDB y haga click en el botón Probar conexión.<br />

Luego si la conexión es satisfactoria haga click en el botón<br />

Aceptar.<br />

En seguida en la barra de herramientas de la ventana Data<br />

Environment haga click en el botón Agregar Comando y denomine<br />

al comando Cm<strong>Curso</strong>. Luego haga click derecho sobre el comando y<br />

seleccione Propiedades:<br />

Pág. 309


Compruebe que este comando utiliza la conexión<br />

Cn<strong>Curso</strong>sLibres, luego establezca el nombre de la tabla a<br />

utilizar, en este caso <strong>Curso</strong> y haga click en el botón Aceptar.<br />

A continuación seleccione el comando Cm<strong>Curso</strong> y arrástrelo<br />

hacia el formulario. Finalmente agregue los siguientes<br />

controles al formulario:<br />

3 marcos<br />

9 botones de comandos<br />

En seguida proceda a establecer las propiedades<br />

requeridas:<br />

Form1<br />

Frame1<br />

Nombre FrmManten<strong>Curso</strong><br />

Caption Mantenimiento de cursos<br />

BorderStyle 3-Fixed Dialog<br />

Pág. 310


Frame2<br />

Frame3<br />

Nombre FraIngreso<br />

Caption<br />

Nombre FraNavegador<br />

Caption Navegador<br />

Nombre FraMantenimiento<br />

Caption Mantenimiento<br />

LblFieldLabel(0)<br />

Nombre LblFieldLabel<br />

Caption Código:<br />

LblFieldLabel(1)<br />

Nombre LblFieldLabel<br />

Caption Nombre:<br />

LblFieldLabel(2)<br />

Nombre LblFieldLabel<br />

Caption Vacantes:<br />

LblFieldLabel(3)<br />

Nombre LblFieldLabel<br />

Caption Profesor:<br />

TxtCurCodigo<br />

Nombre TxtCurCodigo<br />

Locked True<br />

Text<br />

TxtCurNombre<br />

Pág. 311


Nombre TxtCurNombre<br />

Locked True<br />

Text<br />

TxtCurVacantes<br />

Nombre TxtCurVacantes<br />

Locked True<br />

Text<br />

TxtCurProfe<br />

Nombre TxtCurProfe<br />

Locked True<br />

Text<br />

Command1<br />

Command2<br />

Command3<br />

Command4<br />

Nombre CmdPrimero<br />

Caption<br />

Picture C:\FundVB\Bitmaps\First.bmp<br />

Style 1-Graphical<br />

Nombre CmdAnterior<br />

Caption<br />

Picture C:\FundVB\Bitmaps\Previous.bmp<br />

Style 1-Graphical<br />

Nombre CmdSiguiente<br />

Caption<br />

Picture C:\FundVB\Bitmaps\Next.bmp<br />

Style 1-Graphical<br />

Pág. 312


Command5<br />

Command6<br />

Command7<br />

Command8<br />

Command9<br />

Nombre CmdUltimo<br />

Caption<br />

Picture C:\FundVB\Bitmaps\Last.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdNuevo<br />

Picture C:\FundVB\Bitmaps\New.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdEditar<br />

Picture C:\FundVB\Bitmaps\Edit.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdGuardar<br />

Picture C:\FundVB\Bitmaps\Save.bmp<br />

Style 1-Graphical<br />

Nombre<br />

Caption<br />

CmdEliminar<br />

Picture C:\FundVB\Bitmaps\Delete.bmp<br />

Style 1-Graphical<br />

Nombre CmdSalir<br />

Pág. 313


Caption &Salir<br />

Picture C:\FundVB\Bitmaps\Exit.bmp<br />

Style 1-Graphical<br />

El código asociado a la aplicación se muestra a<br />

continuación:<br />

Private Sub CmdPrimero_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveFirst<br />

End Sub<br />

Private Sub CmdUltimo_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveLast<br />

End Sub<br />

Private Sub CmdAnterior_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MovePrevious<br />

If De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.BOF Then<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveFirst<br />

MsgBox “Estamos en el primer registro”<br />

End If<br />

End Sub<br />

Private Sub CmdSiguiente_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveNext<br />

If De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.EOF Then<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveLast<br />

MsgBox “Estamos en el último registro”<br />

End If<br />

End Sub<br />

Private Sub CmdNuevo_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.AddNew<br />

Pág. 314


ModoEditar True<br />

End Sub<br />

Private Sub CmdEditar_Click()<br />

ModoEditar True<br />

End Sub<br />

Private Sub CmdGuardar_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.Update<br />

ModoEditar False<br />

End Sub<br />

Private Sub CmdEliminar_Click()<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.Delete<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveNext<br />

If De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.EOF Then<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveLast<br />

End If<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

Unload Me<br />

End<br />

Private Sub Form_Unload(Cancel As Integer)<br />

If MsgBox(“¿Desea terminar la aplicación?”, _<br />

vbQuestion + vbYesNo, “Pregunta”) = vbYes Then<br />

End<br />

Else<br />

Cancel = True<br />

End If<br />

End Sub<br />

Private Sub Form_Activate()<br />

ModoEditar False<br />

Pág. 315


End Sub<br />

Private Sub ModoEditar(ByVal Ok As Boolean)<br />

TxtCurCodigo.Locked = Not Ok: TxtCurNombre.Locked = Not Ok<br />

TxtCurVacantes.Locked = Not Ok: TxtCurProfe.Locked = Not Ok<br />

CmdNuevo.Enabled = Not Ok: CmdEditar.Enabled = Not Ok<br />

CmdGuardar.Enabled = Ok: CmdEliminar.Enabled = Not Ok<br />

CmdPrimero.SetFocus: If Ok Then TxtCurCodigo.SetFocus<br />

End Sub<br />

Finalmente antes de ejecutar la aplicación debemos<br />

asegurarnos de elegir el tipo de bloqueo adecuado. Para ello<br />

haga click derecho sobre el comando Cm<strong>Curso</strong> y elija la opción<br />

Propiedades y en la ficha Avanzadas selecciones el tipo de<br />

bloqueo 3-Optimistic, tal como se muestra en la figura<br />

siguiente:<br />

Aplicación Nº 2<br />

Pág. 316


Desarrollar una aplicación que permita mostrar en una<br />

grilla el contenido de la tabla <strong>Curso</strong>. El diseño de la interfaz<br />

se muestra a continuación:<br />

Para desarrollar la aplicación, lo primero que debemos<br />

hacer es conectarnos a la base de datos <strong>Curso</strong>sLibres.MDB.<br />

Luego, añada un Comando y denomínelo CmConsulta<strong>Curso</strong>. Haga<br />

click derecho sobre el comando y seleccione Propiedades:<br />

Compruebe que este comando utiliza la conexión<br />

Cn<strong>Curso</strong>sLibres. Luego seleccione la opción Instrucción SQL<br />

Pág. 317


(Structured Query Language, Lenguaje de Estructuras de<br />

Consultas) e ingrese el siguiente código:<br />

Select CurCodigo As Código, CurNombre As Nombre,<br />

CurVacantes As Vacantes, CurProfe As Profesor From <strong>Curso</strong><br />

Luego, haga click en el botón Aceptar. La ventana<br />

DataEnvironment debe presentar el siguiente aspecto:<br />

A continuación seleccione el comando CmConsulta<strong>Curso</strong> y<br />

arrástrelo con el botón derecho del ratón hacia el formulario.<br />

Del menú desplegable que se presenta, seleccione la opción<br />

Cuadrícula de datos.<br />

Luego, cambie las dimensiones de la grilla de tal forma<br />

que ocupe la totalidad del formulario. Finalmente guarde y<br />

pruebe su aplicación.<br />

Aplicación Nº 3<br />

Pág. 318


Desarrollar una aplicación que permita seleccionar de un<br />

control DataCombo el nombre de un profesor y visualizar los<br />

cursos que dicta dicho profesor.<br />

Lo primero que debe hacer es conectarse a la base de datos<br />

<strong>Curso</strong>sLibres.MDB. En seguida añada un comando y denomínelo<br />

CmConsultaProfe. Luego haga click derecho sobre el comando y<br />

seleccione Propiedades. Compruebe que este comando utiliza la<br />

conexión Cn<strong>Curso</strong>sLibres. Luego seleccione la opción Instrucción<br />

SQL e ingrese el siguiente código:<br />

Select CurCodigo As Código, CurNombre As Nombre,<br />

CurProfe As Profesor From <strong>Curso</strong> Where (CurProfe = ?)<br />

A continuación proceda a añadir otro comando y denomínelo<br />

CmProfe. Compruebe que este comando utiliza la conexión<br />

Cn<strong>Curso</strong>sLibres. Seleccione la opción Instrucción SQL e ingrese<br />

el siguiente código:<br />

Select Distinct CurProfe From <strong>Curso</strong><br />

Luego proceda ha ubicar los siguientes controles en el<br />

formulario:<br />

1 control DataCombo<br />

1 control DataGrid<br />

Pág. 319


1 botón de comandos<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

DataCombo1<br />

DataGrid1<br />

Command1<br />

Nombre FrmConsultaProfe<br />

Caption Consulta de profesores<br />

BorderStyle 3-Fixed Dialog<br />

Nombre DbcProfe<br />

ListField CurProfe<br />

RowMember CmProfe<br />

RowSource De<strong>Curso</strong>sLibres<br />

Nombre Dbgrd<strong>Curso</strong>s<br />

Font Arial (Negrita 10)<br />

HeadFont Arial (Negrita 10)<br />

Nombre CmdBuscar<br />

Caption &Buscar<br />

A continuación ingrese el siguiente código:<br />

Private Sub CmdBuscar_Click()<br />

If De<strong>Curso</strong>sLibres.rsCmConsultaProfe.State = adStateOpen Then<br />

De<strong>Curso</strong>sLibres.rsCmConsultaProfe.Close<br />

End If<br />

De<strong>Curso</strong>sLibres.CmConsultaProfe (DbcProfe.Text)<br />

Set Dbgrd<strong>Curso</strong>s.DataSource = De<strong>Curso</strong>sLibres.rsCmConsultaProfe<br />

End Sub<br />

Pág. 320


Aplicación Nº 4<br />

Desarrollar una aplicación que permita mostrar el<br />

contenido de la tabla Laboratorio, relacionada con la tabla<br />

<strong>Curso</strong>, tal como se muestra a continuación:<br />

Observar que la tabla Laboratorio sólo cuenta con tres<br />

campos. El campo que contiene el nombre del curso pertenece a<br />

la tabla <strong>Curso</strong>.<br />

La sentencia SQL que permite obtener consultas a partir de<br />

múltiples tablas (para nuestro caso <strong>Curso</strong> y Laboratorio), se<br />

indica a continuación:<br />

Select Laboratorio.LabCodigo As Código,<br />

<strong>Curso</strong>.CurNombre As Nombre,<br />

Laboratorio.LabHora As Horario,<br />

Laboratorio.LabProfe As [Jefe de práctica]<br />

From Laboratorio, <strong>Curso</strong><br />

Where Laboratorio.LabCodigo = <strong>Curso</strong>.CurCodigo<br />

GUÍA DE LABORATORIO Nº 7<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Pág. 321


Objetivos<br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Utilizar el objeto ADO Connection para crear una conexión a<br />

una base de datos.<br />

• Crear un objeto ADO Recordset para recuperar información de<br />

una base de datos.<br />

• Utilizar el método Execute de una conexión para actualizar la<br />

información de una base de datos.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab7, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Elaborar una aplicación que permita realizar el<br />

mantenimiento de la información contenida en la tabla <strong>Curso</strong>.<br />

En esta aplicación Ud. debe diseñar la interfaz y luego<br />

escribir código para conectarse y recuperar información de la<br />

base de datos.<br />

Pág. 322


Para el diseño de la interfaz, proceda a ubicar los<br />

siguientes controles en el formulario:<br />

3 marcos<br />

4 etiquetas<br />

4 cajas de texto<br />

8 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Frame2<br />

Frame3<br />

Label1<br />

Nombre FrmManten<strong>Curso</strong>s<br />

Caption Mantenimiento de cursos<br />

BorderStyle 3-Fixed Dialog<br />

Moveable False<br />

StartUpPosition 2-CenterScreen<br />

Nombre FraIngreso<br />

Caption<br />

Nombre FraNavegador<br />

Caption Navegador<br />

Nombre FraMantenimiento<br />

Caption Mantenimiento<br />

Nombre LblCodigo<br />

Caption Código:<br />

Pág. 323


Label2<br />

Label3<br />

Label4<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Nombre LblNombre<br />

Caption Nombre:<br />

Nombre LblVacantes<br />

Caption Vacantes:<br />

Nombre LblProfesor<br />

Caption Profesor:<br />

Nombre TxtCurCodigo<br />

Locked<br />

Text<br />

True<br />

Nombre TxtCurNombre<br />

Locked<br />

Text<br />

True<br />

Nombre TxtCurVacantes<br />

Locked<br />

Text<br />

True<br />

Nombre TxtCurProfe<br />

Locked True<br />

Pág. 324


Text<br />

Para establecer las propiedades de los botones de comando<br />

Command1, Command2, . . ., Command8, copiar los pasos de la<br />

pág. 87 a la pág. 88 de la Guía de Laboratorio Nº 6 (Aplicación<br />

Nº 1).<br />

Antes de ingresar código a la aplicación, debemos tener en<br />

cuenta que para poder utilizar los objetos ADO es una<br />

aplicación <strong>Visual</strong> <strong>Basic</strong> es necesario cargar la librería<br />

correspondiente. Para ello selecciones el menú Proyecto y elija<br />

la opción Referencias. En el cuadro de diálogo Referencias<br />

seleccione la opción Microsoft ActiveX Data Objects 2.1<br />

Library, tal como se indica en la figura siguiente:<br />

Luego de hacer click en el botón Aceptar estará en<br />

condiciones de utilizar los objetos ADO en su aplicación.<br />

Pág. 325


El código necesario para realizar la conexión y efectuar<br />

el mantenimiento de la tabla se muestra a continuación.<br />

Observar la analogía cuando se utiliza Data Environment.<br />

Dim Cn As ADODB.Connection<br />

Dim Rs As ADODB.Recordset<br />

Private Sub ModoEditar(ByVal Ok As Boolean)<br />

TxtCurCodigo.Locked = Not Ok<br />

TxtCurNombre.Locked = Not Ok<br />

TxtCurVacantes.Locked = Not Ok<br />

TxtCurProfe.Locked = Not Ok<br />

CmdNuevo.Enabled = Not Ok<br />

CmdEditar.Enabled = Not Ok<br />

CmdGuardar.Enabled = Ok<br />

CmdEliminar.Enabled = Not Ok<br />

If Ok Then TxtCurCodigo.SetFocus<br />

End Sub<br />

Private Sub Form_Load()<br />

ModoEditar False<br />

Set Cn = New ADODB.Connection<br />

Set Rs = New ADODB.Recordset<br />

Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _<br />

“Data Source=C:\FundVB\Data\<strong>Curso</strong>sLibres.MDB;” & _<br />

“Persist Security Info=False”<br />

Rs.ActiveConnection = Cn<br />

Rs.<strong>Curso</strong>rType = adOpenKeyset<br />

Rs.LockType = adLockOptimistic<br />

Rs.Open “Select * From <strong>Curso</strong>”<br />

Set TxtCurCodigo.DataSource = Rs<br />

TxtCurCodigo.DataField = “CurCodigo”<br />

Set TxtCurNombre.DataSource = Rs<br />

Pág. 326


TxtCurNombre.DataField = “CurNombre”<br />

Set TxtCurVacantes.DataSource = Rs<br />

TxtCurVacantes.DataField = “CurVacantes”<br />

Set TxtCurProfe.DataSource = Rs<br />

TxtCurProfe.DataField = “CurProfe”<br />

End Sub<br />

Private Sub CmdPrimero_Click()<br />

Rs.MoveFirst<br />

End Sub<br />

Private Sub CmdAnterior_Click()<br />

Rs.MovePrevious<br />

If Rs.BOF Then<br />

Rs.MoveFirst<br />

MsgBox “Estamos en el primer registro”<br />

End If<br />

End Sub<br />

Private Sub CmdSiguiente_Click()<br />

Rs.MoveNext<br />

If Rs.EOF Then<br />

Rs.MoveLast<br />

MsgBox “Estamos en el último registro”<br />

End If<br />

End Sub<br />

Private Sub CmdUltimo_Click()<br />

Rs.MoveLast<br />

End Sub<br />

Private Sub CmdNuevo_Click()<br />

Rs.AddNew<br />

ModoEditar True<br />

Pág. 327


End Sub<br />

Private Sub CmdEditar_Click()<br />

ModoEditar True<br />

End Sub<br />

Private Sub CmdGuardar_Click()<br />

Rs.Update<br />

ModoEditar False<br />

End Sub<br />

Private Sub CmdEliminar_Click()<br />

Rs.Delete<br />

Rs.MoveNext<br />

If Rs.EOF Then<br />

Rs.MoveLast<br />

End If<br />

End Sub<br />

Private Sub Form_Unload(Cancel As Integer)<br />

Cn.Close<br />

Set Cn = Nothing<br />

End Sub<br />

Aplicación Nº 2<br />

Desarrollar una aplicación que permita realizar una<br />

consulta a la tabla <strong>Curso</strong>. Para ello el usuario debe<br />

seleccionar de un cuadro combinado (combo) el nombre de un<br />

profesor y a continuación se deben visualizar los cursos a su<br />

cargo. El diseño de la interfaz debe ser similar a la figura<br />

mostrada:<br />

Pág. 328


Para el desarrollo de esta aplicación, proceda ha ubicar<br />

los siguientes controles en el formulario:<br />

1 control ComboBox<br />

1 control DataGrid<br />

1 botón de comandos<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Combo1<br />

Nombre FrmConsultaProfe<br />

Caption Consulta de profesores<br />

BorderStyle 3-Fixed Dialog<br />

Nombre CboProfe<br />

Text<br />

DataGrid1<br />

Nombre Dbgrd<strong>Curso</strong>s<br />

Font Arial (Negrita 10)<br />

HeadFont Arial (Negrita 10)<br />

Pág. 329


Command1<br />

seguida:<br />

Nombre CmdBuscar<br />

Caption &Buscar<br />

Default True<br />

A continuación debe ingresar el código que se muestra en<br />

Dim Cn As ADODB.Connection<br />

Dim Rs<strong>Curso</strong> As ADODB.Recordset<br />

Dim RsProfe As ADODB.Recordset<br />

Private Sub Form_Load()<br />

Set Cn = New ADODB.Connection<br />

Set RsProfe = New ADODB.Recordset<br />

Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _<br />

“Data Source=C:\FundVB\Data\<strong>Curso</strong>sLibres.MDB;” & _<br />

“Persist Security Info=False”<br />

RsProfe.ActiveConnection = Cn<br />

RsProfe.<strong>Curso</strong>rType = adOpenStatic<br />

RsProfe.LockType = adLockOptimistic<br />

RsProfe.<strong>Curso</strong>rLocation = adUseClient<br />

RsProfe.Open “Select Distinct CurProfe From <strong>Curso</strong>”<br />

Do While Not RsProfe.EOF()<br />

CboProfe.AddItem RsProfe(“CurProfe”)<br />

RsProfe.MoveNext<br />

Loop<br />

End Sub<br />

Private Sub CmdBuscar_Click()<br />

Set Rs<strong>Curso</strong> = New ADODB.Recordset<br />

Rs<strong>Curso</strong>.ActiveConnection = Cn<br />

Rs<strong>Curso</strong>.<strong>Curso</strong>rType = adOpenStatic<br />

Pág. 330


Rs<strong>Curso</strong>.LockType = adLockReadOnly<br />

Rs<strong>Curso</strong>.<strong>Curso</strong>rLocation = adUseClient<br />

Rs<strong>Curso</strong>.Open “Select CurCodigo As Código, ” & _<br />

“CurNombre As Nombre, CurProfe As Profesor ” & _<br />

“From <strong>Curso</strong> Where CurProfe = '” & CboProfe.Text & “'”<br />

Set Dbgrd<strong>Curso</strong>s.DataSource = Rs<strong>Curso</strong><br />

End Sub<br />

Private Sub Form_Unload(Cancel As Integer)<br />

Cn.Close<br />

Set Cn = Nothing<br />

End Sub<br />

Aplicación Nº 3<br />

Desarrollar una aplicación que permita realizar el<br />

mantenimiento de las tablas de la base de datos<br />

<strong>Curso</strong>sLibres.MDB (estas tablas le serán proporcionadas con<br />

datos suficientes, por el Jefe de Práctica).<br />

El diseño de la interfaz debe ser similar a la siguiente<br />

figura:<br />

Pág. 331


Por ejemplo para realizar el mantenimiento de la tabla<br />

<strong>Curso</strong> debemos preparar los siguientes formularios:<br />

Pág. 332


Para desarrollar nuestra aplicación debe agregar un módulo<br />

de código al proyecto. Luego ingrese lo siguiente:<br />

Public Cn As ADODB.Connection<br />

También será necesario agregar un formulario MDI. Luego,<br />

cambie el nombre del formulario por el de MDI<strong>Curso</strong>sLibres. En<br />

seguida, diseñe el menú para la aplicación según se indica:<br />

Caption Name ShortCut<br />

&Mantenimiento<br />

MnuManten Ninguno<br />

&Alumnos MnuMantenAlumno Ninguno<br />

&Nuevo<br />

MnuMantenAlumnoNuevo Ninguno<br />

&Editar MnuMantenAlumnoEditar Ninguno<br />

&Eliminar<br />

MnuMantenAlumnoEliminar Ninguno<br />

&<strong>Curso</strong>s MnuManten<strong>Curso</strong> Ninguno<br />

&Nuevo<br />

&Editar<br />

&Eliminar<br />

MnuManten<strong>Curso</strong>Nuevo Ninguno<br />

MnuManten<strong>Curso</strong>Editar<br />

Ninguno<br />

MnuManten<strong>Curso</strong>Eliminar Ninguno<br />

&Laboratorio MnuMantenLaboratorio Ninguno<br />

&Nuevo<br />

MnuMantenLaboratorioNuevo Ninguno<br />

&Editar MnuMantenLaboratorioEditar Ninguno<br />

&Eliminar MnuMantenLaboratorioEliminar Ninguno<br />

&Distrito MnuMantenDistrito Ninguno<br />

&Nuevo MnuMantenDistritoNuevo Ninguno<br />

&Editar MnuMantenDistritoEditar Ninguno<br />

&Eliminar MnuMantenDistritoEliminar Ninguno<br />

- MnuMantLinea Ninguno<br />

&Salir MnuMantSalir Ctrl + X<br />

Pág. 333


Luego, haga doble click sobre el formulario e ingrese el<br />

siguiente código:<br />

Private Sub MDIForm_Load()<br />

Set Cn = New ADODB.Connection<br />

End Sub<br />

Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _<br />

“Data Source=C:\FundVB\Data\<strong>Curso</strong>sLibres.MDB;” & _<br />

“Persist Security Info=False”<br />

Private Sub MnuManten<strong>Curso</strong>sNuevo_Click()<br />

Load FrmNuevo<strong>Curso</strong><br />

FrmNuevo<strong>Curso</strong>.Show<br />

End Sub<br />

Private Sub MnuManten<strong>Curso</strong>sEditar_Click()<br />

Load FrmEditar<strong>Curso</strong><br />

FrmEditar<strong>Curso</strong>.Show<br />

End Sub<br />

Private Sub MnuManten<strong>Curso</strong>sEliminar_Click()<br />

Load FrmEliminar<strong>Curso</strong><br />

FrmEliminar<strong>Curso</strong>.Show<br />

End Sub<br />

Para desarrollar la opción Nuevo de la tabla <strong>Curso</strong>, añada<br />

un nuevo formulario al proyecto. Luego, ubique los siguientes<br />

controles en el formulario:<br />

4 etiquetas<br />

4 cajas de texto<br />

3 botones de comando<br />

Luego<br />

indica:<br />

proceda a establecer las propiedades según se<br />

Pág. 334


Form1<br />

Label1<br />

Label2<br />

Label3<br />

Label4<br />

Text1<br />

Text2<br />

Text3<br />

Nombre FrmManten<strong>Curso</strong>s<br />

Caption Nuevo curso<br />

BorderStyle 3-Fixed Dialog<br />

MDIChild True<br />

Nombre LblCodigo<br />

Caption Código:<br />

Nombre LblNombre<br />

Caption Nombre:<br />

Nombre LblVacantes<br />

Caption Vacantes:<br />

Nombre LblProfesor<br />

Caption Profesor:<br />

Nombre TxtCurCodigo<br />

Text<br />

Nombre TxtCurNombre<br />

Text<br />

Nombre TxtCurVacantes<br />

Text<br />

Pág. 335


Text4<br />

Command1<br />

Command2<br />

Command3<br />

Nombre TxtCurProfe<br />

Text<br />

Nombre CmdGrabar<br />

Caption &Grabar<br />

Nombre CmdNuevo<br />

Caption &Nuevo<br />

Nombre CmdCerrar<br />

Caption &Cerrar<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Private Sub Form_Load()<br />

CmdGrabar.Enabled = True<br />

CmdNuevo.Enabled = False<br />

End Sub<br />

Private Sub CmdGrabar_Click()<br />

Cn.Execute “Insert Into <strong>Curso</strong>(CurCodigo, CurNombre, ” & _<br />

“CurVacantes, CurProfe) Values ('” & TxtCurCodigo & _<br />

“',” & “'” & TxtCurNombre & “',” & _<br />

Val(TxtCurVacantes) & “,” & “'” & TxtCurProfe & “')”<br />

CmdGrabar.Enabled = False<br />

CmdNuevo.Enabled = True<br />

End Sub<br />

Pág. 336


Private Sub CmdNuevo_Click()<br />

TxtCurCodigo = “”<br />

TxtCurNombre = “”<br />

TxtCurVacantes = “”<br />

TxtCurProfe = “”<br />

CmdGrabar.Enabled = True: CmdNuevo.Enabled = False<br />

TxtCurCodigo.SetFocus<br />

End Sub<br />

Private Sub CmdCerrar_Click()<br />

Unload Me<br />

End Sub<br />

Para desarrollar la opción Editar de la tabla <strong>Curso</strong>, añada<br />

un nuevo formulario al proyecto. Luego, ubique los siguientes<br />

controles en el formulario:<br />

1 marco<br />

4 etiquetas<br />

4 cajas de texto<br />

4 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Nombre FrmManten<strong>Curso</strong>s<br />

Caption Editar curso<br />

BorderStyle 3-Fixed Dialog<br />

MDIChild True<br />

Nombre FraCodigo<br />

Caption<br />

Pág. 337


Label1<br />

Label2<br />

Label3<br />

Label4<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Nombre LblCodigo<br />

Caption Código:<br />

Nombre LblNombre<br />

Caption Nombre:<br />

Nombre LblVacantes<br />

Caption Vacantes:<br />

Nombre LblProfesor<br />

Caption Profesor:<br />

Nombre TxtCurCodigo<br />

Text<br />

Nombre TxtCurNombre<br />

Text<br />

Nombre TxtCurVacantes<br />

Text<br />

Nombre TxtCurProfe<br />

Text<br />

Pág. 338


Command1<br />

Command2<br />

Command3<br />

Command4<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdGrabar<br />

Caption &Grabar<br />

Nombre CmdNuevo<br />

Caption &Nuevo<br />

Nombre CmdCerrar<br />

Caption &Cerrar<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Private Sub Form_Load()<br />

CmdAceptar.Enabled = True<br />

CmdGrabar.Enabled = False<br />

CmdNuevo.Enabled = False<br />

End Sub<br />

Private Sub CmdAceptar_Click()<br />

Dim Rs As New ADODB.Recordset<br />

Set Rs = Cn.Execute(“Select CurNombre, ” & _<br />

“CurVacantes, CurProfe From <strong>Curso</strong> ” & _<br />

“Where CurCodigo = '” & TxtCurCodigo & “'”)<br />

If (Rs.EOF And Rs.BOF) Then<br />

MsgBox “No existe ningún curso con este código”<br />

TxtCurCodigo.SetFocus<br />

Pág. 339


TxtCurCodigo.SelStart = 0<br />

TxtCurCodigo.SelLength = Len(TxtCurCodigo)<br />

Exit Sub<br />

End If<br />

TxtCurNombre = Rs!CurNombre<br />

TxtCurVacantes = Rs!CurVacantes<br />

TxtCurProfe = Rs!CurProfe<br />

Rs.Close<br />

Set Rs = Nothing<br />

TxtCurCodigo.Enabled = False<br />

CmdAceptar.Enabled = False<br />

CmdGrabar.Enabled = True<br />

CmdNuevo.Enabled = True<br />

End Sub<br />

Private Sub CmdGrabar_Click()<br />

End Sub<br />

Cn.Execute “Update <strong>Curso</strong> Set CurNombre = '” & _<br />

TxtCurNombre & “',” & “CurVacantes = ” & _<br />

Val(TxtCurVacantes) & “,” & “CurProfe = '” & _<br />

TxtCurProfe & “'” & “ Where CurCodigo = '” & _<br />

TxtCurCodigo & “'”<br />

Private Sub CmdNuevo_Click()<br />

TxtCurCodigo = “”<br />

TxtCurNombre = “”<br />

TxtCurVacantes = “”<br />

TxtCurProfe = “”<br />

CmdAceptar.Enabled = True<br />

CmdGrabar.Enabled = False<br />

CmdNuevo.Enabled = False<br />

TxtCurCodigo.Enabled = True<br />

TxtCurCodigo.SetFocus<br />

Pág. 340


End Sub<br />

Private Sub CmdCerrar_Click()<br />

Unload Me<br />

End Sub<br />

Para desarrollar la opción Eliminar de la tabla <strong>Curso</strong>s,<br />

añada un nuevo formulario al proyecto. Luego, ubique los<br />

siguientes controles en el formulario:<br />

1 marco<br />

4 etiquetas<br />

4 cajas de texto<br />

4 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Form1<br />

Frame1<br />

Label1<br />

Label2<br />

Nombre FrmManten<strong>Curso</strong>s<br />

Caption Eliminar curso<br />

BorderStyle 3-Fixed Dialog<br />

MDIChild True<br />

Nombre FraCodigo<br />

Caption<br />

Nombre LblCodigo<br />

Caption Código:<br />

Nombre LblNombre<br />

Pág. 341


Label3<br />

Label4<br />

Text1<br />

Text2<br />

Text3<br />

Text4<br />

Command1<br />

Command2<br />

Caption Nombre:<br />

Nombre LblVacantes<br />

Caption Vacantes:<br />

Nombre LblProfesor<br />

Caption Profesor:<br />

Nombre TxtCurCodigo<br />

Text<br />

Nombre TxtCurNombre<br />

Text<br />

Nombre TxtCurVacantes<br />

Text<br />

Nombre TxtCurProfe<br />

Text<br />

Nombre CmdAceptar<br />

Caption &Aceptar<br />

Nombre CmdEliminar<br />

Pág. 342


Command3<br />

Command4<br />

Caption &Eliminar<br />

Nombre CmdNuevo<br />

Caption &Nuevo<br />

Nombre CmdCerrar<br />

Caption &Cerrar<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Private Sub Form_Load()<br />

CmdAceptar.Enabled = True<br />

CmdEliminar.Enabled = False<br />

CmdNuevo.Enabled = False<br />

End Sub<br />

Private Sub CmdEliminar_Click()<br />

Cn.Execute “Delete From <strong>Curso</strong> ” & _<br />

“Where CurCodigo = '” & TxtCurCodigo & “'”<br />

Call CmdNuevo_Click<br />

End Sub<br />

Private Sub CmdNuevo_Click()<br />

TxtCurCodigo = “”<br />

TxtCurNombre = “”<br />

TxtCurVacantes = “”<br />

TxtCurProfe = “”<br />

CmdAceptar.Enabled = True<br />

CmdEliminar.Enabled = False<br />

CmdNuevo.Enabled = False<br />

Pág. 343


TxtCurCodigo.Enabled = True<br />

TxtCurCodigo.SetFocus<br />

End Sub<br />

Private Sub CmdAceptar_Click()<br />

Dim Rs As New ADODB.Recordset<br />

Set Rs = Cn.Execute(“Select CurNombre, ” & _<br />

“CurVacantes, CurProfe From <strong>Curso</strong> ” & _<br />

“Where CurCodigo = '” & TxtCurCodigo & “'”)<br />

If (Rs.EOF And Rs.BOF) Then<br />

MsgBox “No existe ningún curso con este código”<br />

TxtCurCodigo.SetFocus<br />

TxtCurCodigo.SelStart = 0<br />

TxtCurCodigo.SelLength = Len(TxtCurCodigo)<br />

Exit Sub<br />

End If<br />

TxtCurNombre = Rs!CurNombre<br />

TxtCurVacantes = Rs!CurVacantes<br />

TxtCurProfe = Rs!CurProfe<br />

Rs.Close<br />

Set Rs = Nothing<br />

TxtCurCodigo.Enabled = False<br />

CmdAceptar.Enabled = False<br />

CmdEliminar.Enabled = True<br />

CmdNuevo.Enabled = True<br />

End Sub<br />

Private Sub CmdCerrar_Click()<br />

Unload Me<br />

End Sub<br />

De manera similar proceda a desarrollar el código para los<br />

formularios de mantenimiento de las demás tablas.<br />

Pág. 344


Aplicación Nº 4<br />

Elaborar una aplicación que permita recuperar y mantener<br />

la información de la base de datos <strong>Curso</strong>sLibres.MDB. Para tal<br />

fin debe preparar un formulario que permita establecer la<br />

conexión con el origen de datos. Luego, si la conexión es<br />

satisfactoria el usuario tiene la posibilidad de elegir una de<br />

las tablas de la base de datos para realizar las operaciones<br />

habituales de mantenimiento o simplemente para ejecutar<br />

consultas. El diseño de la interfaz debe ser similar a la<br />

siguiente figura:<br />

Las opciones Mantenimiento y Consulta deben ser análogas a<br />

las realizadas en aplicaciones anteriores.<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Pág. 345


GUÍA DE LABORATORIO Nº 8<br />

Objetivos<br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Usar el diseñador de reportes DataReport.<br />

• Utilizar y controlar la impresora para obtener reportes<br />

impresos.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab8, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Diseñar un reporte que muestre la información almacenada<br />

en la tabla <strong>Curso</strong>s. El formato del reporte pedido se muestra a<br />

continuación:<br />

Para diseñar nuestro reporte, lo primero que debemos hacer<br />

es conectarnos a la base de datos <strong>Curso</strong>sLibres.MDB. La conexión<br />

la haremos efectiva mediante el Data Environment. Luego, añada<br />

Pág. 346


un Comando y denomínelo Cm<strong>Curso</strong>. Establezca el nombre de la<br />

tabla a utilizar, para nuestro caso <strong>Curso</strong>. El aspecto de la<br />

ventana Data Environment deberá ser similar a la figura:<br />

Luego, del menú Proyecto seleccionar la opción Agregar<br />

Data Report, lo cual permite agregar el diseñador de reportes:<br />

En seguida del Data Environment seleccionar cada campo que<br />

desee incluir en el reporte y luego arrastre el campo hacia la<br />

sección Detalles del Data Report.<br />

Pág. 347


El diseñador de reportes presenta un conjunto de controles<br />

que permiten mejorar la presentación de nuestro reporte. En<br />

seguida ubicar los siguientes controles:<br />

2 etiquetas en la sección Encabezado de informe<br />

4 etiquetas en la sección Encabezado de página<br />

A continuación proceda a establecer las propiedades según<br />

se indica:<br />

Etiqueta1<br />

Etiqueta2<br />

Etiqueta3<br />

Etiqueta4<br />

Etiqueta5<br />

Nombre RptLblVAB<br />

Caption Instituto de Educación Superior<br />

“Víctor Andrés Belaúnde”<br />

Font Arial (Negrita 09)<br />

Nombre RptLblNombre<br />

Caption Reporte de <strong>Curso</strong>s<br />

Font Arial (Negrita Cursiva 16)<br />

Nombre RptLblCodigo<br />

Caption Código:<br />

Font Arial (Negrita 10)<br />

Nombre RptLblNombre<br />

Caption Nombre:<br />

Font Arial (Negrita 10)<br />

Nombre RptLblVacantes<br />

Caption Vacantes:<br />

Pág. 348


Etiqueta6<br />

Font Arial (Negrita 10)<br />

Nombre RptLblProfesor<br />

Caption Profesor:<br />

Font Arial (Negrita 10)<br />

Para insertar la fecha actual dar un click con el botón<br />

derecho del ratón sobre el diseñador de reportes en la sección<br />

de Encabezado de informe, del menú contextual que se presenta<br />

seleccionar la opción Insertar control, luego Fecha actual<br />

(formato corto). En seguida, cambiar las siguientes<br />

propiedades:<br />

DataReport1<br />

DataMember Cm<strong>Curso</strong><br />

DataSource De<strong>Curso</strong>sLibres<br />

Luego, seleccione del menú Proyecto la opción Propiedades<br />

de Proyecto, y en la ficha General del cuadro de diálogo<br />

Propiedades del proyecto, establecer DataReport1 como objeto<br />

inicial. Haga click en Aceptar y ejecute su aplicación.<br />

Aplicación Nº 2<br />

Diseñar un reporte que permita mostrar un listado de<br />

profesores y los cursos que tienen a su cargo. Tener en cuenta<br />

que la información relacionada con cada profesor debe empezar<br />

en una página nueva. El formato del reporte pedido se muestra a<br />

continuación:<br />

Pág. 349


En esta aplicación explicaremos como crear grupos de<br />

datos. Para ello iniciar un nuevo proyecto. En seguida,<br />

conectarse a la base de datos <strong>Curso</strong>sLibres.MDB mediante el Data<br />

Environment. Luego, añada un Comando y denomínelo CmProfesor.<br />

Establezca el nombre de la tabla a utilizar, para nuestro caso<br />

<strong>Curso</strong>. Para realizar el agrupamiento por profesor seleccionar<br />

la ficha Agrupar del cuadro de diálogo Propiedades de<br />

CmProfesor. A continuación activar la casilla de verificación<br />

Agrupar comando, luego seleccionar de la lista de campos, el<br />

campo por el cual se desea agrupar la información, para nuestro<br />

caso seleccionar CurProfe y dar un click en el botón “ ><br />

”. El<br />

cuadro de diálogo Propiedades de CmProfesor debe presentar un<br />

aspecto similar a la figura siguiente:<br />

Pág. 350


A continuación sobre el diseñador de reportes dar un click<br />

con el botón derecho del ratón y del menú emergente que se<br />

presenta elegir la opción Insertar encabezado o pie de grupo.<br />

Del objeto De<strong>Curso</strong>sLibres arrastrar el campo CurProfe de la<br />

sección Campo de resumen en CmProfesor_Grouping al diseñador de<br />

reportes pero a la sección Encabezado de grupo. Los demás<br />

campos arrastrarlos de la sección Campos de Detalle en<br />

CmProfesor a la sección Detalle del generador de reportes. Por<br />

último proceda a cambiar las siguientes propiedades del objeto<br />

DataReport:<br />

DataReport1<br />

DataMember CmProfesor_Grouping<br />

DataSource De<strong>Curso</strong>sLibres<br />

Aplicación Nº 3<br />

Desarrollar una aplicación que permita crear un reporte<br />

para mostrar la información de la base de datos<br />

<strong>Curso</strong>sLibres.MDB. Para tal fin debe preparar un formulario que<br />

Pág. 351


permita al usuario elegir una tabla, y en seguida se debe<br />

generar el reporte correspondiente. Además el usuario puede<br />

obtener una vista preliminar del reporte o una copia impresa.<br />

El diseño de la interfaz debe ser similar a la figura que se<br />

muestra a continuación:<br />

Para desarrollar nuestra aplicación, proceda a diseñar los<br />

reportes correspondientes según:<br />

Tabla Reporte<br />

Alumno DataReport1<br />

<strong>Curso</strong> DataReport2<br />

Laboratorio DataReport3<br />

Luego,<br />

formulario:<br />

ubique los siguientes controles sobre el<br />

1 marco<br />

3 botones de opción<br />

3 botones de comando<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Pág. 352


Form1<br />

Frame1<br />

Option1<br />

Option2<br />

Option3<br />

Command1<br />

Nombre FrmReporte<strong>Curso</strong>sLibres<br />

Caption <strong>Curso</strong>s Libres<br />

BorderStyle 3-Fixed Dialog<br />

Nombre FraTablas<br />

Caption<br />

Nombre OptTablaAlumno<br />

Caption Alumno<br />

Value True<br />

Nombre OptTabla<strong>Curso</strong><br />

Caption <strong>Curso</strong><br />

Value False<br />

Nombre OptTablaLaboratorio<br />

Caption Laboratorio<br />

Value False<br />

Nombre CmdVistaPrevia<br />

Caption VistaPrevia<br />

Picture C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Bitmaps\Win95\<br />

Explorer.bmp<br />

Style 1-Graphical<br />

Pág. 353


Command2<br />

Command3<br />

Nombre CmdImprimir<br />

Caption Imprimir<br />

Picture C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Bitmaps\Win95\<br />

Printfld.bmp<br />

Style 1-Graphical<br />

Nombre CmdSalir<br />

Caption Salir<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Private Sub CmdImprimir_Click()<br />

If OptTablaAlumno.Value Then<br />

DataReport<strong>1.</strong>PrintReport True<br />

ElseIf OptTabla<strong>Curso</strong>.Value Then<br />

DataReport2.PrintReport True<br />

ElseIf OptTablaLaboratorio.Value Then<br />

DataReport2.PrintReport True<br />

End If<br />

End Sub<br />

Private Sub CmdVistaPrevia_Click()<br />

If OptTablaAlumno.Value Then<br />

DataReport<strong>1.</strong>Show<br />

ElseIf OptTabla<strong>Curso</strong>.Value Then<br />

DataReport2.Show<br />

ElseIf OptTablaLaboratorio.Value Then<br />

DataReport2.Show<br />

End If<br />

End Sub<br />

Pág. 354


Private Sub CmdSalir_Click()<br />

Unload Me<br />

End Sub<br />

Cuando ejecute la aplicación, al dar un click en el botón<br />

Imprimir se visualizará el siguiente cuadro de diálogo, el cual<br />

nos permitirá confirmar o cancelar la impresión:<br />

Aplicación Nº 4<br />

Diseñar un reporte combinando datos de la tabla <strong>Curso</strong> y<br />

Laboratorio. El reporte debe mostrar el código del curso, el<br />

nombre del curso, el nombre del profesor de teoría, el nombre<br />

del jefe de práctica y el horario de laboratorio. Dar formato<br />

al reporte según su criterio.<br />

FIN PARTE II<br />

Pág. 355


GUÍA DE LABORATORIO<br />

Parte III<br />

ELABORADO POR<br />

CARLOS CASTILLO PERALTA<br />

cc_peralta@hotmail.com<br />

INTRODUCCIÓN<br />

Pág. 356


La presente Guía de Laboratorio de Microsoft <strong>Visual</strong> <strong>Basic</strong>,<br />

se elaboró con la finalidad de complementar la parte teórica<br />

con la parte práctica del curso. Los problemas presentan un<br />

grado de dificultad gradual, es decir, en cada práctica primero<br />

se comienzan con problemas muy sencillos con la finalidad de<br />

que el estudiante esclarezca dudas y quede claro en los<br />

conceptos asimilados en la teoría, y luego en los problemas<br />

posteriores se va incrementando el nivel de dificultad.<br />

Esta guía explora una gran variedad de materias y contiene<br />

muchos problemas recopilados a lo largo de varios años de<br />

experiencia. Espero que satisfaga las necesidades de los<br />

estudiantes y colegas, ya que ha sido elaborada teniendo en<br />

cuenta los objetivos de aprendizaje del curso.<br />

Si desean compartirla con otros colegas, me agradaría<br />

mucho que lo hicieran, con la única condición de que siempre se<br />

respete el derecho del autor.<br />

Desde ya les deseo la mejor de las suertes en el<br />

aprendizaje de Microsoft <strong>Visual</strong> <strong>Basic</strong>.<br />

Carlos Castillo Peralta<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Lima, Diciembre del 2000<br />

Pág. 357


GUÍA DE LABORATORIO Nº 9<br />

Objetivos<br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Crear y utilizar clases dentro de una aplicación <strong>Visual</strong><br />

<strong>Basic</strong>.<br />

• Diseñar y utilizar controles ActiveX personalizados.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab9, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Implementar una clase denominada Circulo, la cual debe<br />

contar con las propiedades públicas Radio y Area. Para tal fin<br />

seleccione la opción Agregar módulo de clase del Menú Proyecto:<br />

En la ficha Nuevo seleccione la opción Módulo de clase y<br />

haga click en Abrir. En seguida active la ventana de<br />

propiedades y cambie el nombre de la nueva clase por Circulo.<br />

Pág. 358


La ventana de código de la clase debe presentar la siguiente<br />

apariencia:<br />

A continuación proceda a ingresar el siguiente código para<br />

la clase:<br />

Private R As Double<br />

Public Property Get Radio() As Variant<br />

Radio = R<br />

End Property<br />

Public Property Let Radio(ByVal vNewValue As Variant)<br />

If IsNumeric(vNewValue) Then<br />

R = CDbl(vNewValue)<br />

Else<br />

R = 0<br />

End If<br />

End Property<br />

Public Property Get Area() As Variant<br />

Area = 3.141592 * R * R<br />

End Property<br />

Private Sub Class_Initialize()<br />

R = 0<br />

End Sub<br />

Pág. 359


Luego proceda a ubicar los siguientes controles en el<br />

formulario:<br />

2 etiquetas<br />

2 cajas de texto<br />

3 botones de comando<br />

A continuación proceda a establecer las propiedades según<br />

se indica:<br />

Form1<br />

Label1<br />

Label2<br />

Text1<br />

Text2<br />

Nombre FrmEjemClaseCirculo<br />

Caption Ejemplo con la clase Circulo<br />

Nombre LblRadio<br />

Caption Radio:<br />

Nombre LblArea<br />

Caption Area:<br />

Nombre TxtRadio<br />

Text<br />

Nombre TxtArea<br />

Text<br />

Una vez que ha establecido las propiedades indicadas,<br />

proceda a ingrese el siguiente código para el formulario de<br />

prueba:<br />

Pág. 360


Dim A As Circulo<br />

Private Sub Form_Load()<br />

Set A = New Circulo<br />

End Sub<br />

Private Sub Form_Unload(Cancel As Integer)<br />

Set A = Nothing<br />

End Sub<br />

Private Sub TxtRadio_Change()<br />

A.Radio = TxtRadio<br />

TxtArea = A.Area<br />

End Sub<br />

Guarde y pruebe su aplicación. El resultado debe ser<br />

similar a la siguiente figura:<br />

Aplicación Nº 2<br />

Diseñar un control ActiveX que muestre el mensaje<br />

“Bienvenido al Mundo de la Programación con ActiveX”.<br />

Adicionalmente, el control debe permitir al usuario la<br />

posibilidad de cambiar el color del texto.<br />

Para comenzar nuestra aplicación, debe ingresar a <strong>Visual</strong><br />

<strong>Basic</strong> y en la ventana de diálogo Nuevo Proyecto seleccione<br />

Control ActiveX, y luego haga click en el botón Aceptar.<br />

Pág. 361


Con esta opción, podrá crear un Control Active X. Las<br />

diferencias entre una opción y la usual (EXE estándar) las verá<br />

mejor conforme avance en el desarrollo de la presente Práctica<br />

de Laboratorio.<br />

En seguida añada un nuevo proyecto EXE estándar. Esto lo<br />

puede realizar desde el Menú Archivo opción Agregar Proyecto.<br />

Luego establezca las propiedades indicadas a continuación:<br />

Proyecto1<br />

Nombre ActiveXMiControl<br />

UserControl1<br />

Proyecto2<br />

Form1<br />

Nombre MiControl<br />

ToolboxBitmap C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Bitmaps\Assorted\<br />

Heart.bmp<br />

Nombre VbpMiControl<br />

Pág. 362


Nombre FrmPruebaMiControl<br />

Caption Prueba de Control ActiveX<br />

BorderStyle 3-Fixed Dialog<br />

La ventana del Explorador de proyectos debe presentar la<br />

siguiente apariencia:<br />

En la ventana anterior haga click con el botón derecho del<br />

ratón sobre MiControl y elija la opción Ver código. En el<br />

ComboBox General seleccione UserControl y en el ComboBox<br />

Declaraciones<br />

código:<br />

seleccione Paint. Ahora ingrese el siguiente<br />

Private Sub UserControl_Paint()<br />

Const Msg = “Bienvenido al Mundo de la Programación ” & _<br />

“con ActiveX”<br />

UserControl.Cls<br />

UserControl.Print Msg<br />

End Sub<br />

Luego en el Explorador de proyectos, hacer click con el<br />

botón derecho del ratón sobre la carpeta Controles de usuario y<br />

seleccione la opción Propiedades de ActiveXMiControl. En<br />

seguida se mostrará la ventana Propiedades del proyecto:<br />

Pág. 363


En la ventana anterior, en la ficha General, apartado<br />

Descripción del proyecto, escribir “Este es mi primer Control<br />

ActiveX”, tal como se muestra. Luego pulsar el botón Aceptar.<br />

Cierre todas las ventanas abiertas y haga un sólo click<br />

sobre la carpeta Controles de usuario. A continuación ingrese<br />

al Menú Archivo y seleccione la opción Generar<br />

ActiveXMiControl.ocx,<br />

defecto.<br />

guarde el archivo con su nombre por<br />

Luego, establezca como inicial el formulario<br />

FrmPruebaMiControl y añadir desde el Cuadro de herramientas<br />

nuestro control recientemente creado.<br />

Del Menú Proyecto seleccione la opción Componentes y<br />

veremos la descripción de nuestro control con su casilla de<br />

verificación activada, tal como se muestra a continuación:<br />

Pág. 364


En seguida, guarde y ejecute su aplicación. El resultado<br />

debe ser similar al siguiente:<br />

En este momento, Ud. acaba de terminar el diseño de su<br />

primer control ActiveX. No se preocupe por las diferencias que<br />

puede haber encontrado con respecto a la forma tradicional de<br />

programar. Conforme avancemos en el desarrollo de la práctica<br />

veremos que esta forma de programar en base a componentes es<br />

bastante sencilla.<br />

Pág. 365


Sin embargo, debemos modificar nuestro control, de tal<br />

forma que nos permita cambiar el color de texto de<br />

presentación. Para tal fin, vamos a hacer uso del Asistente<br />

para interfaz de control ActiveX y el Asistente para páginas de<br />

propiedades. Estos complementos deben ser instalados desde el<br />

menú principal Complementos y seleccionar la opción<br />

Administrador<br />

continuación:<br />

de complementos, tal como se indica a<br />

En la ventana anterior debe activar las casillas de<br />

verificación Cargado/Descargado y Cargar al iniciar. Luego haga<br />

click en el botón Aceptar.<br />

En seguida el menú Complementos deberá presentar la<br />

siguiente apariencia:<br />

Pág. 366


Luego, haga click sobre la opción Asistente para interfaz<br />

de control ActiveX. En seguida, aparecerá una ventana de<br />

presentación, haga doble click en el botón Siguiente. Tendremos<br />

entonces una ventana similar a la que se muestra:<br />

Haga click con el ratón sobre el botón . La propiedad ForeColor es la propiedad encargada de<br />

cambiar el color de texto, la cual no está disponible en<br />

nuestro control, por ello debemos asociarla. El aspecto del<br />

Asistente para interfaz de control ActiveX debe ser similar a:<br />

Pág. 367


Pulse, luego el botón Siguiente. En seguida aparecerá otra<br />

ventana, haga nuevamente click en el botón Siguiente.<br />

Pág. 368


Ahora hemos llegado a la ventana en la cual vamos a<br />

asociar a nuestro control la propiedad ForeColor. Seleccione<br />

del ComboBox Control UserControl y del ComboBox Miembro<br />

ForeColor, tal como se indica en la ventana anterior. Pulse el<br />

botón Siguiente y en la siguiente ventana pulse el botón<br />

Finalizar. Aparecerá luego una ventana de información, lea<br />

detenidamente su contenido y luego haga click en el botón<br />

Cerrar. A continuación guarde su aplicación y genere nuevamente<br />

el control.<br />

Para probar el control abra el formulario<br />

FrmPruebaMiControl y añada al Cuadro de herramientas el<br />

componente Microsoft Common Dialog Control 6.0. En seguida<br />

añada al formulario un MiControl, un CommonDialog y un<br />

CommandButton. Cambie el nombre del botón Command1 por<br />

CmdAceptar e ingrese el siguiente código:<br />

Private Sub CmdAceptar_Click()<br />

CommonDialog<strong>1.</strong>ShowColor<br />

MiControl<strong>1.</strong>ForeColor = CommonDialog<strong>1.</strong>Color<br />

MiControl<strong>1.</strong>Visible = False<br />

MiControl<strong>1.</strong>Visible = True<br />

End Sub<br />

Guarde y luego ejecute su aplicación, el resultado será<br />

similar al siguiente:<br />

Pág. 369


Al hacer click sobre el botón Aceptar, se presenta la<br />

siguiente caja de diálogo en la cual podemos elegir el nuevo<br />

color para el texto de bienvenida:<br />

Preste atención en que la propiedad Visible se utiliza<br />

para actualizar el contenido del control y se pueda ver el<br />

cambio de color. No es la mejor forma de hacerlo, deberíamos<br />

hacerlo mediante código dentro del mismo control, pero por el<br />

momento y para probar como asociar una propiedad a un control<br />

es más que suficiente.<br />

Aplicación Nº 3<br />

Diseñar un control ActiveX que presente la forma de un<br />

cuadro de texto, pero que sólo admita números. Es decir, el<br />

usuario sólo podrá escribir en el control números, cualquier<br />

otro carácter que no sea un número, será rechazado por el<br />

control y no se imprimirá en el cuadro de texto.<br />

Al igual que en la aplicación anterior crear el grupo de<br />

proyectos y establezca las propiedades según:<br />

Pág. 370


Proyecto1<br />

Nombre ActiveXNumBox<br />

UserControl1<br />

Proyecto2<br />

Form1<br />

Nombre NumBox<br />

ToolboxBitmap C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Bitmaps\Assorted\<br />

Diamond.bmp<br />

Nombre VbpNumBox<br />

Nombre FrmPruebaNumBox<br />

Caption Prueba de Control ActiveX<br />

BorderStyle 3-Fixed Dialog<br />

Para diseñar nuestro control utilizaremos un control<br />

TextBox el cual debe insertar en el formulario NumBox<br />

(UserControl). Luego elimine el contenido de la propiedad Text.<br />

Tener cuidado en que el control ha de ser del mismo tamaño del<br />

cuadro de texto. Luego, el cuadro de texto debe redimensionarse<br />

de acuerdo al control en tiempo de diseño, esto es a la hora de<br />

insertar nuestro control en un formulario. Para ello es<br />

necesario ingresar el siguiente código:<br />

Private Sub UserControl_Resize()<br />

Text<strong>1.</strong>Top = 0<br />

Text<strong>1.</strong>Left = 0<br />

Text<strong>1.</strong>Width = UserControl.Width<br />

Text<strong>1.</strong>Height = UserControl.Height<br />

End Sub<br />

Pág. 371


Private Sub UserControl_InitProperties()<br />

Text1 = Extender.Name<br />

End Sub<br />

Private Sub Text1_KeyPress(KeyAscii As Integer)<br />

If Not (KeyAscii = 8 Or _<br />

(KeyAscii >= 48 And KeyAscii


ejemplo 5 de Setiembre de 1752. El control deberá mostrar el<br />

día de la semana correspondiente a la fecha ingresada, tal como<br />

se muestra en la figura siguiente:<br />

El calendario Gregoriano actual obedece a la reforma del<br />

calendario Juliano que ordenó el papa Gregorio XIII en 1752,<br />

para ponerlo de acuerdo con los movimientos de los cuerpos<br />

celestes. Lo cual trajo como consecuencia adelantar las fechas<br />

del 2 de Setiembre al 14 de Setiembre de 1752, es decir las<br />

fechas comprendidas en este intervalo de tiempo nunca<br />

existieron.<br />

Pág. 373


GUÍA DE LABORATORIO Nº 10<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Crear documentos ActiveX que se ejecuten directamente en una<br />

página Web.<br />

• Utilizar documentos ActiveX que incorporan hipervínculos.<br />

• Desarrollar documentos ActiveX para interactuar con bases de<br />

datos relacionales.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab10, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Como primer ejercicio vamos a desarrollar un documento<br />

ActiveX que permite recuperar información de la base de datos<br />

<strong>Curso</strong>sLibres.MDB.<br />

Un documento ActiveX, es simplemente un formulario que se<br />

puede ejecutar directamente en los exploradores de Internet.<br />

Los documentos ActiveX se diseñan de la misma manera que los<br />

formularios estándar de <strong>Visual</strong> <strong>Basic</strong>. Para comenzar a<br />

desarrollar nuestro documento ActiveX, debe ingresar a <strong>Visual</strong><br />

<strong>Basic</strong> y en la ventana de diálogo Nuevo Proyecto seleccione EXE<br />

de documento ActiveX y luego haga click en el botón Aceptar,<br />

tal como se indica en la figura:<br />

Pág. 374


usuario:<br />

A continuación proceda a diseñar la siguiente interfaz de<br />

Para tal efecto, proceda a ubicar los siguientes controles<br />

en el formulario:<br />

3 etiquetas<br />

Pág. 375


1 cuadro combinado<br />

1 control DataGrid<br />

1 botón de comandos<br />

En seguida proceda a establecer las propiedades según se<br />

indica:<br />

Label1<br />

Label2<br />

Label3<br />

Combo1<br />

Nombre LblTitulo1<br />

AutoSize True<br />

Caption Instituto de Educación Superior<br />

Font Arial (Negrita 12)<br />

ForeColor &H00C00000&<br />

Nombre LblTitulo2<br />

AutoSize True<br />

Caption “Víctor Andrés Belaúnde”<br />

Font Times New Roman (Negrita 24)<br />

ForeColor &H000000FF&<br />

Nombre LblTablas<br />

AutoSize True<br />

Caption Vacantes:<br />

Font Arial (Negrita 10)<br />

Nombre CboTabla<br />

Font Arial (Negrita 10)<br />

Text<br />

DataGrid1<br />

Pág. 376


Command1<br />

Nombre BdgrdTabla<br />

Font Arial (Negrita 10)<br />

HeadFont Arial (Negrita 10)<br />

Nombre CmdAceptar<br />

Caption &Mostrar<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Dim Cn As ADODB.Connection<br />

Dim RsAlumno As ADODB.Recordset<br />

Dim Rs<strong>Curso</strong> As ADODB.Recordset<br />

Dim RsLaboratorio As ADODB.Recordset<br />

Private Sub UserDocument_Initialize()<br />

Set Cn = New ADODB.Connection<br />

Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _<br />

“Data Source=C:\FundVB\Data\<strong>Curso</strong>sLibres.MDB;” & _<br />

“Persist Security Info=False”<br />

CboTabla.AddItem “Alumno”<br />

CboTabla.AddItem “<strong>Curso</strong>”<br />

CboTabla.AddItem “Laboratorio”<br />

End Sub<br />

Private Sub MostrarAlumno()<br />

Set RsAlumno = New ADODB.Recordset<br />

RsAlumno.ActiveConnection = Cn<br />

RsAlumno.<strong>Curso</strong>rType = adOpenStatic<br />

RsAlumno.LockType = adLockReadOnly<br />

RsAlumno.<strong>Curso</strong>rLocation = adUseClient<br />

RsAlumno.Open “Select AluCodigo As Código, ” & _<br />

Pág. 377


“(AluPaterno + ' ' + AluMaterno) As Apellidos, ” & _<br />

“AluNombres As Nombres From Alumno”<br />

Set DbgrdTabla.DataSource = RsAlumno<br />

End Sub<br />

Private Sub Mostrar<strong>Curso</strong>()<br />

Set Rs<strong>Curso</strong> = New ADODB.Recordset<br />

Rs<strong>Curso</strong>.ActiveConnection = Cn<br />

Rs<strong>Curso</strong>.<strong>Curso</strong>rType = adOpenStatic<br />

Rs<strong>Curso</strong>.LockType = adLockReadOnly<br />

Rs<strong>Curso</strong>.<strong>Curso</strong>rLocation = adUseClient<br />

Rs<strong>Curso</strong>.Open “Select CurCodigo As Código, ” & _<br />

“CurNombre As Nombre, ” & _<br />

“CurVacantes As Vacantes, ” & _<br />

“CurProfe As Profesor From <strong>Curso</strong>”<br />

Set DbgrdTabla.DataSource = Rs<strong>Curso</strong><br />

End Sub<br />

Private Sub MostrarLaboratorio()<br />

Set RsLaboratorio = New ADODB.Recordset<br />

RsLaboratorio.ActiveConnection = Cn<br />

RsLaboratorio.<strong>Curso</strong>rType = adOpenStatic<br />

RsLaboratorio.LockType = adLockReadOnly<br />

RsLaboratorio.<strong>Curso</strong>rLocation = adUseClient<br />

RsLaboratorio.Open “Select LabCodigo As Código, ” & _<br />

“LabHora As Horario, ” & _<br />

“LabProfe As [Jefe de práctica] From Laboratorio”<br />

Set DbgrdTabla.DataSource = RsLaboratorio<br />

End Sub<br />

Private Sub CmdMostrar_Click()<br />

Select Case CboTabla.ListIndex<br />

Pág. 378


Case 0<br />

Call MostrarAlumno<br />

Case 1<br />

Call Mostrar<strong>Curso</strong><br />

Case 2<br />

Call MostrarLaboratorio<br />

End Select<br />

End Sub<br />

Finalmente guarde y pruebe su documento ActiveX. El<br />

resultado debe ser similar a la figura que se muestra a<br />

continuación:<br />

Aplicación Nº 2<br />

Al documento ActiveX desarrollado en el ejercicio<br />

anterior, añadirle un botón Acerca de, que presente la<br />

Pág. 379


información referente al autor (o autores) de la aplicación. El<br />

diseño del formulario debe ser tal como se muestra a<br />

continuación:<br />

En primer lugar proceda a añadir un formulario estándar al<br />

proyecto. Cambie el nombre del formulario por el de FrmAcercaDe<br />

y diseñe la interfaz pedida.<br />

En seguida añada un botón de comandos al documento ActiveX<br />

y cambie su nombre por CmdAcerca. Luego haga doble click sobre<br />

dicho botón e ingrese el siguiente código:<br />

Private Sub CmdAcerca_Click()<br />

Load FrmAcercaDe<br />

FrmAcercaDe.Show vbModal<br />

End Sub<br />

Finalmente guarde y pruebe su aplicación. Como puede<br />

apreciar desarrollar documentos ActiveX no es nada complicado.<br />

Aplicación Nº 3<br />

Al documento ActiveX desarrollado anteriormente añadirle<br />

un botón Ir a, que permita enlazarnos con la dirección que se<br />

Pág. 380


ingrese en el cuadro de texto adjunto. El diseño del documento<br />

se muestra a continuación:<br />

Para lograr lo que se pide, añada un botón de comandos y<br />

un cuadro de texto y cambie sus nombres por CmdURL y TxtURL<br />

respectivamente. Luego ingrese el siguiente código:<br />

Private Sub CmdURL_Click()<br />

UserDocument.Hyperlink.NavigateTo TxtURL<br />

End Sub<br />

Aplicación Nº 4<br />

Elaborar un documento ActiveX que permita mostrar el<br />

contenido de la tabla <strong>Curso</strong> de la base de datos<br />

Pág. 381


<strong>Curso</strong>sLibres.MDB. A continuación el usuario selecciona un curso<br />

y tiene la posibilidad de separar la matrícula o en su defecto<br />

matricularse en el curso de su elección. El diseño de la<br />

aplicación debe ser similar a la siguiente figura:<br />

Sugerencia: Añadir una nueva tabla a la base de datos para<br />

registrar a los alumnos matriculados o con separación de<br />

matrícula.<br />

GUÍA DE LABORATORIO Nº 11<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Pág. 382


Objetivos<br />

capaz de:<br />

Luego de completar este laboratorio, el estudiante será<br />

• Diseñar páginas Web dinámicas mediante aplicaciones DHTML.<br />

• Desarrollar aplicaciones DHTML para interactuar con los datos<br />

de un sistema distribuido de bases de datos relacionales.<br />

• Implementar<br />

código HTML.<br />

aplicaciones mediante código <strong>Visual</strong> <strong>Basic</strong> y<br />

• Agregar funcionalidad a sus aplicaciones para explorar Web.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab11, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

En este ejercicio, vamos a desarrollar una aplicación<br />

DHTML que lea un número entero y muestre su tabla de<br />

multiplicar.<br />

En su forma más sencilla, una aplicación DHTML (Dynamic<br />

HyperText Markup Language) puede consistir de una o más páginas<br />

HTML enlazadas con código <strong>Visual</strong> <strong>Basic</strong> y el modelo de objetos<br />

HTML dinámico.<br />

Para comenzar a desarrollar nuestra aplicación, ingresar a<br />

<strong>Visual</strong> <strong>Basic</strong> y en la ventana de diálogo Nuevo Proyecto<br />

seleccione Aplicación DHTML, y haga click en el botón Aceptar.<br />

Pág. 383


Al observar la ventana del Explorador de proyectos, esta<br />

presentará la siguiente apariencia:<br />

<strong>Visual</strong> <strong>Basic</strong> agrega automáticamente un Diseñador de<br />

páginas DHTML al proyecto. En seguida, haga doble click sobre<br />

DHTMLPage1<br />

indican:<br />

y proceda a establecer las propiedades que se<br />

DHTMLPage1<br />

Nombre DHTMLTablaMultiplicar<br />

Id DHTMLTablaMultiplicar<br />

Pág. 384


Para crear la interfaz de la aplicación DHTML, simplemente<br />

tenemos que ir agregando elementos HTML de la caja de<br />

herramientas. De esa manera, realice el diseño de la página<br />

mostrada en la siguiente figura:<br />

Una vez terminado el proceso de diseño de la página,<br />

seleccione el encabezado Tabla de Multiplicar y haga click en<br />

el cuarto botón de la barra de herramientas del Diseñador<br />

(Ajustar la selección en . . . ). En seguida, sin<br />

dejar de seleccionar el encabezado, active la Ventana de<br />

propiedades y establezca lo siguiente:<br />

Tabla de Multiplicar<br />

Id Titulo<br />

A continuación proceda a establecer las propiedades para<br />

los demás controles según se indica:<br />

Pág. 385


TextField1<br />

Nombre TxtN<br />

Id TxtN<br />

Value<br />

TextArea1<br />

Nombre TxtTabla<br />

Id TxtTabla<br />

Value<br />

En seguida haga doble click sobre el cuadro de texto TxtN<br />

e ingrese lo siguiente:<br />

Private Sub DHTMLPage_Load()<br />

Document.bgColor = “Yellow”<br />

Titulo.Style.Color = “Red”<br />

End Sub<br />

Private Sub Titulo_onmouseout()<br />

Titulo.Style.Color = “Red”<br />

End Sub<br />

Private Sub Titulo_onmouseover()<br />

Titulo.Style.Color = “Blue”<br />

End Sub<br />

Private Sub TxtN_onpropertychange()<br />

If IsNumeric(TxtN.Value) Then<br />

Dim N As Integer, I As Integer, S As String<br />

N = Val(TxtN.Value)<br />

For I = 0 To 12<br />

S = S & N & “ * ” & I & “ = ” & N * I & vbCrLf<br />

Next I<br />

Pág. 386


TxtTabla.Value = S<br />

Else<br />

TxtTabla.Value = “”<br />

End If<br />

End Sub<br />

Finalmente, guarde y pruebe su aplicación DHTML. El<br />

resultado debe ser similar a la figura siguiente:<br />

Aplicación Nº 2<br />

Desarrollar una aplicación DHTML que permita visualizar el<br />

contenido de la tabla <strong>Curso</strong> de la base de datos<br />

<strong>Curso</strong>sLibres.MDB. El diseño de la página debe ser similar al<br />

mostrado:<br />

Pág. 387


Para desarrollar nuestra aplicación, lo primero que debe<br />

de hacer es abrir una nuevo proyecto DHTML. Luego debe crear la<br />

conexión a la base de datos <strong>Curso</strong>sLibres.MDB. Para ello ingrese<br />

al menú Proyecto seleccione la opción Agregar Data Environment.<br />

En la ventana Data Environment cambie el nombre del objeto<br />

DataEnvironment por De<strong>Curso</strong>sLibres y el de la conexión por<br />

Cn<strong>Curso</strong>sLibres. Luego, añada un Comando y denomínelo Cm<strong>Curso</strong>.<br />

Haga click derecho sobre el comando y seleccione Propiedades. A<br />

continuación seleccione la opción Instrucción SQL e ingrese el<br />

siguiente código:<br />

Select CurCodigo, CurNombre, CurVacantes, CurProfe From <strong>Curso</strong><br />

Pág. 388


Luego haga click en el botón Aceptar. El aspecto de la<br />

ventana Data Environment debe ser similar al siguiente:<br />

En seguida proceda a diseñar la página. Para ello digite<br />

los encabezados y etiquetas necesarios. Luego añada los<br />

siguientes controles HTML al diseñador de páginas DHTML:<br />

4 cajas de texto<br />

4 botones de comandos<br />

Pág. 389


A continuación, proceda a establecer las propiedades según<br />

se indica:<br />

“Víctor Andrés Belaúnde”<br />

TextField1<br />

TextField2<br />

TextField3<br />

TextField4<br />

Button1<br />

Id Titulo<br />

Nombre TxtCurCodigo<br />

Id<br />

Value<br />

TxtCurCodigo<br />

Nombre TxtCurNombre<br />

Id<br />

Value<br />

TxtCurNombre<br />

Nombre TxtCurVacantes<br />

Id<br />

Value<br />

TxtCurVacantes<br />

Nombre TxtCurProfe<br />

Id<br />

Value<br />

TxtCurProfe<br />

Nombre CmdPrimero<br />

Id CmdPrimero<br />

Value Primero<br />

Pág. 390


Button2<br />

Button3<br />

Button4<br />

Nombre CmdAnterior<br />

Id CmdAnterior<br />

Value Anterior<br />

Nombre CmdSiguiente<br />

Id CmdSiguiente<br />

Value Siguiente<br />

Nombre CmdUltimo<br />

Id CmdUltimo<br />

Value Ultimo<br />

Mediante el Data Environment, ADO y el objeto<br />

BindingCollection, es posible enlazar elementos de una página<br />

DHTML con un origen de datos cuando se carga la página. Esto le<br />

permite modificar los datos y escribir código para actualizar<br />

un conjunto de registros subyacente o simplemente desplazarse a<br />

través de los mismos. Por ejemplo, puede usar un objeto<br />

BindingCollection con un objeto Recordset de ADO para enlazar<br />

los elementos TextField de la página de código HTML con campos<br />

de la tabla <strong>Curso</strong>.<br />

Para poder utilizar los objetos de la Microsoft Data<br />

Binding Collection es necesario cargar la librería<br />

correspondiente. Selecciones el menú Proyecto y elija la opción<br />

Referencias. En el cuadro de diálogo Referencias seleccione la<br />

opción Microsoft Data Binding Collection, tal como se indica en<br />

la figura:<br />

Pág. 391


A continuación declare una variable de tipo<br />

BindingCollection en la sección de Declaraciones de la página<br />

DHTML y proceda a ingresar el código que se muestra:<br />

Dim ColBind As BindingCollection<br />

Private Sub DHTMLPage_Load()<br />

Document.bgColor = “Yellow”<br />

Titulo.Style.Color = “Blue”<br />

Set ColBind = New BindingCollection<br />

Set ColBind.DataSource = De<strong>Curso</strong>sLibres<br />

ColBind.DataMember = “Cm<strong>Curso</strong>”<br />

ColBind.Add TxtCurCodigo, “Value”, “CurCodigo”<br />

ColBind.Add TxtCurNombre, “Value”, “CurNombre”<br />

ColBind.Add TxtCurVacantes, “Value”, “CurVacantes”<br />

ColBind.Add TxtCurProfe, “Value”, “CurProfe”<br />

End Sub<br />

Private Function CmdPrimero_onclick() As Boolean<br />

Pág. 392


De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveFirst<br />

End Function<br />

Private Function CmdAnterior_onclick() As Boolean<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MovePrevious<br />

If De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.BOF Then<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveFirst<br />

End If<br />

End Function<br />

Private Function CmdSiguiente_onclick() As Boolean<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveNext<br />

If De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.EOF Then<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveLast<br />

End If<br />

End Function<br />

Private Function CmdUltimo_onclick() As Boolean<br />

De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong>.MoveLast<br />

End Function<br />

Finalmente, guarde y pruebe su aplicación.<br />

Aplicación Nº 3<br />

Diseñar una aplicación que permita cargar en una tabla<br />

HTML el contenido de la tabla <strong>Curso</strong>. La tabla HTML se debe<br />

crear dinámicamente de acuerdo al número de registros<br />

existentes.<br />

Para desarrollar nuestra aplicación, añada una nueva<br />

página DHTML al proyecto anterior. Para ello seleccione el menú<br />

Proyecto y elija la opción Agregar DHTML Page. En seguida<br />

proceda a ingresar el siguiente código:<br />

Dim ColBind As BindingCollection<br />

Pág. 393


Private Sub DHTMLPage_Load()<br />

Dim RsResults As ADODB.Recordset<br />

Set ColBind = New BindingCollection<br />

Set ColBind.DataSource = De<strong>Curso</strong>sLibres<br />

ColBind.DataMember = “Cm<strong>Curso</strong>”<br />

Set RsResults = De<strong>Curso</strong>sLibres.rsCm<strong>Curso</strong><br />

Do While Not RsResults.EOF<br />

Document.body.insertAdjacentHTML “BeforeEnd”, _<br />

“” & _<br />

“” & RsResults!CurCodigo & “” & _<br />

“” & RsResults!CurNombre & “” & _<br />

“” & RsResults!CurVacantes & “” & _<br />

“” & RsResults!CurProfe & “” & _<br />

“”<br />

RsResults.MoveNext<br />

Loop<br />

RsResults.MoveFirst<br />

RsResults.Close<br />

End Sub<br />

Finalmente, no olvide cambiar el componente de inicio<br />

antes de ejecutar su aplicación.<br />

Aplicación Nº 4<br />

Diseñar una aplicación DHTML que permita seleccionar de un<br />

control Select (similar a un cuadro combinado), el nombre de un<br />

profesor y a continuación se muestren en una tabla HTML<br />

dinámica los cursos que dicta dicho profesor.<br />

Un elemento Select, es similar a un cuadro combinado. Por<br />

ejemplo, para agregar un elemento Select denominado SelProfe a<br />

una la página HTML, simplemente arrastrar el elemento a la<br />

página. A continuación establecer las siguientes propiedades:<br />

Pág. 394


Seleccion1<br />

Nombre SelProfe<br />

Id SelProfe<br />

Value<br />

Para especificar los elementos de lista que se deben<br />

mostrar en el elemento Select agregar el siguiente código al<br />

procedimiento de evento Load de la página HTML, veamos:<br />

Private Sub DHTMLPage_Load()<br />

Dim SelElement As HTMLSelectElement<br />

Dim Cn As ADODB.Connection<br />

Dim RsProfe As ADODB.Recordset<br />

Set Cn = New ADODB.Connection<br />

Set RsProfe = New ADODB.Recordset<br />

Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _<br />

“Data Source=C:\FundVB\Data\<strong>Curso</strong>sLibres.MDB;” & _<br />

“Persist Security Info=False”<br />

RsProfe.ActiveConnection = Cn<br />

RsProfe.<strong>Curso</strong>rType = adOpenStatic<br />

RsProfe.LockType = adLockOptimistic<br />

RsProfe.<strong>Curso</strong>rLocation = adUseClient<br />

RsProfe.Open “Select Distinct CurProfe From <strong>Curso</strong>”<br />

Do While Not RsProfe.EOF()<br />

Set SelElement = Document.createElement(“OPTION”)<br />

SelElement.Text = RsProfe!CurProfe<br />

SelProfe.Options.Add SelElement<br />

RsProfe.MoveNext<br />

Loop<br />

End Sub<br />

Al ejecutar su aplicación debe ser similar a la figura<br />

mostrada:<br />

Pág. 395


Finalmente a manera de ejercicio para el estudiante,<br />

proceda a escribir el código necesario para mostrar la<br />

información relacionada con cada profesor.<br />

Pág. 396


GUÍA DE LABORATORIO Nº 12<br />

Objetivos<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong><br />

Luego de completar este laboratorio, el estudiante será<br />

capaz de:<br />

• Utilizar<br />

<strong>Basic</strong>.<br />

funciones API de Windows desde Microsoft <strong>Visual</strong><br />

• Convertir declaraciones de C a <strong>Visual</strong> <strong>Basic</strong>.<br />

• Añadir un sistema de ayuda a una aplicación.<br />

• Usar el asistente para empaquetado y distribución.<br />

• Generar programas de instalación mediante disquetes, carpetas<br />

en una unidad local de red o en una publicación Web.<br />

Consideraciones<br />

Para el desarrollo del presente laboratorio Ud. deberá<br />

crear una carpeta C:\FundVB\Lab12, para guardar sus trabajos<br />

correspondientes a este laboratorio.<br />

Aplicación Nº 1<br />

Un programador de aplicaciones <strong>Visual</strong> <strong>Basic</strong>, además de<br />

conocer su entorno de trabajo, debe conocer su entorno de<br />

programación, conocido generalmente como Interfaz de<br />

Programación de Aplicaciones para Windows (Windows Application<br />

Programming Interface, Windows API).<br />

La API de Windows viene a ser un conjunto de funciones<br />

desarrolladas en lenguaje C. Sin embargo, muchos programadores<br />

de <strong>Visual</strong> <strong>Basic</strong> recurren a estas funciones para conseguir hacer<br />

lo que es imposible (o muy complicado) desde <strong>Visual</strong> <strong>Basic</strong>.<br />

Pág. 397


Las funciones API de Windows no son nada complicadas como<br />

pueden pensar algunos programadores de <strong>Visual</strong> <strong>Basic</strong>.<br />

Como primer ejercicio vamos a escribir una aplicación que<br />

permita modificar el título de un formulario. En la práctica,<br />

siempre se modifican los títulos del formulario con la<br />

propiedad Caption de <strong>Visual</strong> <strong>Basic</strong>, pero este ejercicio ofrece<br />

una manera sencilla de declarar y llamar a una API de Windows.<br />

El primer paso consiste en añadir un módulo de código al<br />

proyecto. En seguida proceda a declarar la función en la<br />

sección de declaraciones del módulo:<br />

Public Declare Function SetWindowText Lib “user32” _<br />

Alias “SetWindowTextA” (ByVal hWnd As Long, _<br />

ByVal lpString As String) As Long<br />

Luego, en el formulario ingrese el código que se muestra a<br />

continuación:<br />

Private Sub Form_Load()<br />

SetWindowText Form<strong>1.</strong>hWnd, “Bienvenidos a la API de Windows”<br />

End Sub<br />

Al ejecutar su aplicación, su resultado debe ser similar a<br />

la siguiente figura:<br />

Pág. 398


Aplicación Nº 2<br />

Desarrollar una aplicación que permita reproducir un<br />

archivo Wav o Midi. Utilizar la función API de Windows<br />

mciExecute para lograr el objetivo deseado.<br />

Como se sabe, el lenguaje C diferencia las letras<br />

mayúsculas de las minúsculas. Por ello, si Ud. comete un error,<br />

por ejemplo utiliza una letra mayúscula en lugar de una<br />

minúscula (o viceversa), la función declarada no será<br />

reconocida y obtendrá un mensaje de error.<br />

Para evitar este tipo de problemas, vamos a utilizar el<br />

Visor API de Windows. En seguida, del menú Complementos elija<br />

la opción Administrador de Complementos. Del cuadro de diálogo<br />

que se presenta cargar la opción Visor de API de VB 6. Al dar<br />

un click en el botón Aceptar, se añadirá en el menú<br />

Complementos la opción Visor de API.<br />

En seguida ingrese al Visor de API. Se debe presentar una<br />

pantalla similar a la siguiente:<br />

Pág. 399


En la pantalla anterior, seleccione el menú Archivo y<br />

elija la opción Cargar archivo de texto. En el cuadro de<br />

diálogo que se presenta elegir el archivo Win32api.Txt y dar un<br />

click en el botón Abrir.<br />

Pág. 400


De la siguiente pantalla Ud. podrá seleccionar la función<br />

que desea, luego active la opción público y dar un click en el<br />

botón Agregar para visualizar el código de declaración de dicha<br />

función.<br />

En seguida haga click en el botón Copiar y pegue dicho<br />

código a su aplicación. Recordar que la declaración de la<br />

función API se debe realizar en un módulo, por lo tanto debe<br />

agregar un nuevo módulo y pegar el siguiente código:<br />

Public Declare Function mciExecute Lib “winmm.dll” _<br />

(ByVal lpstrCommand As String) As Long<br />

Luego proceda a diseñar la interfaz de la aplicación. Para<br />

ello ubique los siguientes controles:<br />

1 control Image<br />

Pág. 401


2 botones de comando<br />

En seguida establezca las propiedades según se indica a<br />

continuación:<br />

Form1<br />

Image1<br />

Command1<br />

Command2<br />

Nombre FrmMultimedia<br />

Caption Hacer sonar un fichero Wav o Midi<br />

BorderStyle 3-Fixed Dialog<br />

Picture C:\Archivos de programa\Microsoft <strong>Visual</strong><br />

Studio\Common\Graphics\Icons\Misc\Mike.ico<br />

Stretch True<br />

Nombre CmdEjecutar<br />

Caption &Ejecutar<br />

Nombre CmdSalir<br />

Caption &Salir<br />

Una vez establecidas las propiedades, proceda a ingresar<br />

el siguiente código:<br />

Private Sub CmdEjecutar_Click()<br />

iResult = mciExecute(“Play c:\vbN2\bmp\34.wav”)<br />

End Sub<br />

Private Sub CmdSalir_Click()<br />

Unload Me<br />

End Sub<br />

Aplicación Nº 3<br />

Pág. 402


Uno de los temas en los que Windows ha creado un estándar<br />

es el sistema de ayuda de las aplicaciones. Para ello incluye<br />

una aplicación denominada WinHelp como motor de ayuda de<br />

Windows.<br />

Los pasos necesarios para crear un sistema de ayuda son<br />

los siguientes:<br />

• Crear un archivo de texto RTF.<br />

• Compilar el archivo RTF mediante el compilador de ayudas Help<br />

Workshop, para obtener el archivo HLP.<br />

• Utilizar el motor de ayuda WinHelp.<br />

En vista de lo anterior, lo primero que necesitamos para<br />

crear nuestro sistema de ayuda, es un archivo con formato RTF<br />

donde se incluirá el texto de la ayuda. Para ello ingrese a<br />

Microsoft Word 2000 y digite lo siguiente:<br />

Profesor Carlos Castillo Peralta<br />

Contenido<br />

• Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel I<br />

• Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel II<br />

• Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel III<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0<br />

<strong>Curso</strong> de programación<br />

En seguida ubique el cursor en la última línea de texto y<br />

presione la combinación de teclas Ctrl + Enter, para comenzar<br />

en una nueva página. A continuación digite lo siguiente:<br />

Pág. 403


Profesor Carlos Castillo Peralta<br />

Nivel I<br />

• Conceptos básicos<br />

• Elementos del lenguaje<br />

• Entrada y salida de datos<br />

• Sentencias de control<br />

• Arreglos<br />

• Estructuras<br />

• Archivos de datos<br />

Volver<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0<br />

<strong>Curso</strong> de programación<br />

En seguida ubique el cursor en la última línea de texto<br />

que acaba de ingresar y pulse Ctrl + Enter para comenzar a<br />

digitar el siguiente texto en una página diferente:<br />

Profesor Carlos Castillo Peralta<br />

Nivel II<br />

• Creación de bases de datos<br />

• Aplicaciones Cliente Servidor<br />

• Sentencias SQL<br />

• Entorno de datos<br />

• Objetos de Datos ActiveX (ADO)<br />

• Reportes<br />

Volver<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0<br />

<strong>Curso</strong> de programación<br />

Pág. 404


De manera análoga a los demás casos, ubique el cursor en<br />

la última línea de texto y presione Ctrl + Enter. En seguida<br />

ingrese el siguiente texto:<br />

Profesor Carlos Castillo Peralta<br />

Nivel III<br />

• Creación componentes<br />

• Lenguaje HTML<br />

• <strong>Visual</strong> <strong>Basic</strong> Script<br />

• Aplicaciones DHTML<br />

• API de Windows<br />

• Creación de archivos de ayuda<br />

• Empaquetado y distribución<br />

Volver<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0<br />

<strong>Curso</strong> de programación<br />

Finalmente, debe obtener un archivo de cuatro páginas.<br />

Guarde su archivo como MiAyuda.RTF.<br />

El archivo de ayuda que vamos a construir va a utilizar<br />

más de una página, y en ese caso se requiere especificar un<br />

identificador para cada página.<br />

Ahora procederemos a crear los identificadores de páginas.<br />

Para ello ubicar el cursor en la primera página antes del<br />

encabezado Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0 y seleccione del menú<br />

Insertar la opción Nota al pie. Luego, ingresar como marca<br />

personal el símbolo # tal como se muestra en la siguiente<br />

figura:<br />

Pág. 405


Al dar click en el botón Aceptar, el cursor se ubicará<br />

automáticamente en el pie de página donde debe digitar VBMain<br />

delante del símbolo #.<br />

En la misma página, ubicar el cursor delante de la palabra<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel I y darle el atributo de subrayado<br />

doble. Luego, escribir VB1 inmediatamente después del texto<br />

subrayado y a este identificador darle el atributo de oculto.<br />

Realizar acciones similares para las dos siguientes<br />

líneas, después del texto Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel II<br />

escribir VB2 y para Microsoft <strong>Visual</strong> <strong>Basic</strong> Nivel III escribir<br />

VB3. No olvidar que estos identificadores deben tener atributo<br />

de oculto.<br />

En la segunda página ubicar el cursor antes del encabezado<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong> 6.0 y seleccione del menú Insertar la<br />

opción Nota al pie. Luego, ingresar como marca personal el<br />

símbolo # y luego digitar en el pie de página VB<strong>1.</strong> Luego en la<br />

misma página, posicionar el cursor delante de la palabra Volver<br />

y darle el atributo de subrayado doble. Escribir VBMain<br />

inmediatamente después del texto subrayado y a este<br />

identificador darle el atributo de oculto.<br />

Pág. 406


Continuar de manera similar con las siguientes páginas. Al<br />

concluir vuelva a guardar su archivo. La primera página debe<br />

presentar una apariencia similar a la siguiente figura:<br />

Continuando con nuestro esquema, ahora debemos generar el<br />

archivo HLP a partir del archivo RTF que acabamos de crear.<br />

Para ello debemos ejecutar la aplicación Microsoft Help<br />

Workshop. Desde el menú Inicio, elija la carpeta Programas,<br />

luego elija la carpeta Microsoft <strong>Visual</strong> Studio 6.0, en seguida<br />

seleccione la carpeta Herramientas de Microsoft <strong>Visual</strong> Studio<br />

6.0, y luego haga clic sobre la aplicación Help Workshop. A<br />

continuación se presentará una ventana similar a la mostrada en<br />

la siguiente figura:<br />

Pág. 407


Seleccione el menú File y elija la opción New. A<br />

continuación<br />

siguiente:<br />

se mostrará un cuadro de diálogo similar al<br />

Seleccione la opción Help Project y dar un click en el<br />

botón OK. En seguida se presentará una ventana en la cual debe<br />

indicar el nombre y la ruta del archivo HLP que desea generar.<br />

Para nuestro caso digite MiAyuda y haga click sobre el botón<br />

Guardar, tal como se indica en la figura que se muestra a<br />

continuación:<br />

Pág. 408


Al hacer click en el botón Guardar, en seguida se<br />

presentará la siguiente pantalla:<br />

Ahora que Ud. ha creado un proyecto de ayuda, necesita<br />

agregar la información sobre su archivo o archivos de ayuda.<br />

Pág. 409


¿Ha creado su archivo de ayuda MiAyuda.RTF? Si Ud. ya lo<br />

ha creado haga click en el botón Files y en seguida aparecerá<br />

la siguiente pantalla:<br />

Luego dar un click en el botón Add. En seguida se<br />

presentará la siguiente ventana en la cual debe especificar el<br />

nombre y la ruta de su archivo de ayuda RTF. Para nuestro<br />

seleccione MiAyuda y haga click en el botón Abrir.<br />

Pág. 410


En seguida se mostrará la siguiente pantalla. Ud. haga<br />

click sobre el botón OK.<br />

A continuación se presentará una pantalla similar a la<br />

figura mostrada:<br />

Pág. 411


A continuación vamos a definir una ventana. Para ello haga<br />

click sobre el botón Windows. En seguida aparecerá un cuadro de<br />

diálogo en el cual debe ingresar el nombre de la ventana. Para<br />

nuestro caso digite Main. Luego haga click en el botón OK.<br />

En seguida se presentará el siguiente cuadro de diálogo.<br />

En la ficha General ingrese el texto que se indica para la<br />

barra de título de la ventana.<br />

Pág. 412


En la ficha Position defina el tamaño inicial de la<br />

ventana de ayuda, para ello haga click en el botón Auto-Sizer.<br />

En seguida se presentará una ventana de prueba similar a<br />

la que se muestra en la figura siguiente. Cambie las<br />

dimensiones de esta ventana según su parecer y haga click en el<br />

botón OK.<br />

Pág. 413


A continuación seleccione la ficha Buttons y active los<br />

botones que Ud. quiere agregar para su ventana.<br />

Luego seleccione la ficha Color. En seguida se presentará<br />

una pantalla similar a la siguiente:<br />

Pág. 414


Para cambiar el color de la zona de no desplazamiento o la<br />

zona de desplazamiento pulse el botón Change al lado de la<br />

ventana de muestra. Escoja el color que Ud. desee y entonces<br />

haga click en el botón Aceptar.<br />

El archivo de proyecto debe presentar una apariencia<br />

similar a la figura mostrada:<br />

Bueno, Ud. acaba de crear su primer proyecto de ayuda<br />

básico. Más adelante si así lo necesitará puede cambiar<br />

cualquiera de estas opciones. Para ello simplemente debe abrir<br />

su archivo de proyecto de ayuda y realizar los cambios que<br />

considere pertinente.<br />

Finalmente guarde y pruebe su proyecto. Para lo cual debe<br />

dar click en el botón Save and Compile. En seguida se<br />

presentará una pantalla similar a la siguiente:<br />

Pág. 415


En seguida ingrese al menú File y elija la opción Run<br />

WinHelp.<br />

mostrada:<br />

Luego, se presentará una pantalla similar a la<br />

Pág. 416


En seguida dar click en el botón View Help. A continuación<br />

se presentará una pantalla similar a la figura siguiente.<br />

Pruebe ingresando a las otras páginas, para ello simplemente<br />

haga click en cualquiera de los tres ítems que se muestran en<br />

la sección Contenido.<br />

¿Sabe Ud. como añadir una imagen de mapa de bits a nuestro<br />

archivo de ayuda? La respuesta es bastante sencilla. Para ello<br />

realice los siguientes pasos:<br />

Ingrese a Microsoft Word 2000 y proceda a abrir el archivo<br />

MiAyuda.RTF. Ubiquese en la primera página y añada el siguiente<br />

texto {BMC CCP.BMP} antes del nombre del profesor. Luego guarde<br />

su archivo.<br />

A continuación cargue el Help Workshop. Luego dar click<br />

sobre el botón Bitmaps. Se presentará una pantalla similar a la<br />

figura siguiente:<br />

Pág. 417


En seguida haga click en el botón Add. A continuación se<br />

presentará una ventana similar a la siguiente figura:<br />

En el cuadro de diálogo anterior seleccione la ruta que se<br />

indica. Luego haga click en el botón OK.<br />

Finalmente, grabe y compile su proyecto de ayuda. Para<br />

ello dar click en el botón View Help.<br />

Pág. 418


A continuación se presentará una ventana similar a la<br />

siguiente figura:<br />

Por último, veremos como utilizar nuestros archivos de<br />

ayuda desde una aplicación <strong>Visual</strong> <strong>Basic</strong>. Para tal fin abra un<br />

nuevo proyecto y añada un botón de comandos al formulario.<br />

Cambie el nombre del botón por CmdAyuda y proceda a ingresar el<br />

siguiente código:<br />

Private Sub CmdAyuda_Click()<br />

Dim Ayuda<br />

Ayuda = Shell(“C:\Windows\WinHelp.exe ” & _<br />

“C:\FundVB\Lab12\MiAyuda.HLP”, 1)<br />

End Sub<br />

Aplicación Nº 4<br />

Pág. 419


Después de crear una aplicación <strong>Visual</strong> <strong>Basic</strong>, por lo<br />

general debemos proporcionársela al usuario final, ya sea en<br />

disquetes, CD, a través de una red local, o bien a través de<br />

una Intranet o Internet. Esto requiere primero empaquetar la<br />

aplicación y después distribuirla.<br />

Como ejemplo, vamos a generar el programa de instalación<br />

para la aplicación creada en el ejercicio anterior. Para ello<br />

es necesario que tenga abierta dicha aplicación.<br />

Primero debemos iniciar el Asistente de empaquetado y<br />

distribución. Para tal fin, del Menú Complementos seleccione la<br />

opción Administrador de complementos y añada la utilidad<br />

Package and Deployment Wizard. Al momento de iniciar el<br />

Asistente se visualizará una ventana similar a la siguiente<br />

figura:<br />

En seguida haga click en el botón Empaquetar. Esto hará<br />

que el Asistente le presente varios cuadros de diálogo que le<br />

Pág. 420


pedirán información referente al proyecto que vamos a<br />

empaquetar y le permitirá elegir qué opciones quiere incorporar<br />

al programa de instalación, el tipo de empaquetado, la carpeta<br />

donde se almacenará el paquete de instalación, qué archivos<br />

desea incluir adicionalmente en el paquete, qué grupos y<br />

elementos de grupo del menú Inicio se deberán crear en el<br />

equipo del usuario final durante la instalación de la<br />

aplicación, etc. A medida que avanza, si necesita más<br />

información consulte al Jefe de Práctica.<br />

Una vez concluido el proceso de empaquetado cierre<br />

Microsoft <strong>Visual</strong> <strong>Basic</strong>. Luego haga click en el menú Inicio y<br />

seleccione la opción Ejecutar. Seguidamente ingrese la ruta de<br />

nuestro programa de instalación y dar click en Aceptar, tal<br />

como se indica en la figura:<br />

En esos instantes se dará inicio a la instalación de<br />

nuestra aplicación. Concluido este proceso, seleccione el menú<br />

Inicio, carpeta Programas y ubique la carpeta que contiene la<br />

aplicación. Finalmente proceda a ejecutar su aplicación.<br />

Fin de las prácticas de laboratorio.<br />

Suerte.<br />

Pág. 421

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!