CAPÍTULO 1 FUNDAMENTOS Microsoft Visual Basic es un conjunto de herramientas que posibilitan el desarrollo de aplicaciones para Windows de una manera rápida y sencilla, basado en el lenguaje BASIC y en la programación orientada a objetos. La palabra “Visual” hace referencia al método que se utiliza para crear la interfaz gráfica de usuario. En lugar de escribir numerosas líneas de código para implementar la interfaz, simplemente se utiliza el ratón para agregar objetos prefabricados en el lugar deseado dentro de la pantalla. La palabra “Basic” hace referencia al lenguaje BASIC (Beginners All-Purpose Symbolic Instruction Code), un lenguaje utilizado por más programadores que ningún otro lenguaje en la historia de la informática. Visual Basic ha evolucionado a partir del lenguaje BASIC original y ahora contiene centenares de instrucciones, funciones y palabras clave, muchas de las cuales están directamente relacionadas con la interfaz gráfica de Windows. El lenguaje de programación Visual Basic no es exclusivo de Microsoft Visual Basic. Este lenguaje es utilizado también por Microsoft Excel, Microsoft Access y muchas Pág. 1 otras aplicaciones Windows. El lenguaje de programación Visual Basic Script para programar en Internet es un subconjunto del lenguaje Visual Basic. De tal forma, que la inversión realizada en el aprendizaje de Visual Basic le ayudará a abarcar estas otras áreas. EJECUTANDO VISUAL BASIC Si ya tiene instalado Visual Basic, para ejecutarlo proceda igual que con cualquier otra aplicación Windows: hacer click en el icono correspondiente. En seguida se presentará una ventana similar a la figura siguiente: Pág. 2 En la ventana anterior indicar el tipo de proyecto que desea crear (para nuestro caso seleccionar EXE estándar) y dar click sobre el botón “Abrir”. En ese instante se presentará el Entorno Integrado de Desarrollo (IDE) de Visual Basic: Los elementos que componen el IDE de Visual Basic son: • Barra de menús • Barra de herramientas • Cuadro de herramientas • Diseñador de formularios • Explorador de proyectos • Ventana de propiedades • Posición del formulario • Menús contextuales Barra de menús Pág. 3 Presenta las órdenes que se utilizan para desarrollar una aplicación. Las opciones más utilizadas son: Archivo, Edición, Ver, Ventana y Ayuda. Se proporcionan otros menús para tener acceso a funciones específicas de programación como Proyecto, Formato o Depuración. Barra de herramientas Facilita el acceso rápido a las órdenes más comúnmente utilizadas. Omitimos el significado de cada botón porque le será mostrado al pasar el puntero del ratón sobre cada uno de ellos. Puede visualizar otras barras de herramientas ejecutando la opción Barra de herramientas del Menú Ver. Cuadro de herramientas Proporciona un conjunto de herramientas que diseñar la interfaz gráfica de usuario. Pág. 4 permiten Icono Descripción Puntero Cuadro de imagen Etiqueta Cuadro de texto Marco Botón de comando Casilla de verificación Botón de opción Cuadro combinado Cuadro de lista Barra de desplazamiento horizontal Barra de desplazamiento vertical Cronómetro Cuadro de lista de unidades Cuadro de lista de directorios Cuadro de lista de archivos Formas Líneas Imagen Contenedor OLE Pág. 5 Para utilizar algún objeto simplemente debe hacer doble click sobre el icono correspondiente, luego puede cambiar su posición y sus dimensiones. Diseñador de formularios Es la ventana sobre la que colocaremos los objetos (controles) de la interfaz de usuario. Explorador de proyectos Contiene el conjunto de archivos que constituyen aplicación o proyecto. Pág. 6 la Ventana de propiedades Como veremos más adelante, cada objeto lleva asociado un conjunto de propiedades. Para ver o especificar los valores de las propiedades de los objetos, utilizaremos la ventana de propiedades. Posición del formulario Esta ventana le permite especificar la posición de los formularios de la aplicación. Menús contextuales Pág. 7 Es un relativas menú a un emergente que determinado presenta objeto. órdenes Para específicas abrir un menú contextual, dar click derecho sobre el objeto. Por ejemplo, al dar click derecho sobre el formulario se presenta el siguiente menú contextual. Ventana de código Se presenta cuando se hace doble click sobre un objeto que se encuentra en el Diseñador de formularios. Esta ventana muestra dos cuadros combinados (combos) en la parte superior, en una aparece el nombre del objeto (izquierda) y en la otra el nombre del evento (derecha). Pág. 8 MI PRIMERA APLICACIÓN Hay tres pasos principales para crear una aplicación en Visual Basic: • Crear la interfaz. • Establecer propiedades. • Escribir el código. Para siguiente ver como ejemplo se para realiza crear esto, una siga aplicación los pasos del sencilla que consiste en un formulario y un botón de comando. Cuando haga click en el botón de comando aparecerá el mensaje “Visual Basic es fácil” en un cuadro de diálogo predefinido. Creación de la interfaz Para el desarrollo del presente ejemplo proceda a crear una nueva aplicación. En seguida añadir un botón de comando al formulario, para ello en el Cuadro de herramientas, dar doble click sobre el control deseado, tal como se indica en la figura siguiente: Pág. 9 La apariencia de la interfaz debe ser similar a la figura mostrada: Estableciendo las propiedades Para ver las propiedades de un objeto, simplemente debe seleccionarlo siguiente y pulsar muestra las la tecla F4. propiedades Por del ejemplo botón de la figura comando y podemos ver que la propiedad Caption tiene el valor “Command1”. Pág. 10 Puede cambiar seleccionándolo modificando su de el la valor, valor de ventana por ejemplo cualquier anterior para y el propiedad simplemente caso anterior establezca el valor de la propiedad Caption de “Command1” a “Haga click aquí”. De manera similar proceda cambiar la propiedad Caption del formulario a “Mi primera aplicación”. La apariencia interfaz debe ser similar a la figura mostrada: Pág. 11 de la Escribiendo el código Para ingresar el código a la aplicación debe dar doble click sobre el control al cual asociaremos dicho código. Para nuestro caso dar doble click sobre el botón de comando e ingresar el código que se indica a continuación: Para guardar la aplicación que acaba de crear, seleccione la opción Guardar Proyecto del Menú Archivo. Bueno, ahora sólo falta que ejecute su aplicación. Para ello simplemente debe pulsar la tecla F5. El resultado debe ser similar al siguiente: Pág. 12 CAPÍTULO 2 LOS OBJETOS Visual Basic se basa en la programación orientada a objetos (POO), la cual es una forma de programación que utiliza objetos (similares a los objetos del mundo real) para la solución de problemas. La POO permite descomponer un problema en bloques relacionados. Cada bloque pasa a ser un objeto autocontenido que contiene sus propios datos e instrucciones. De esta manera, la complejidad se reduce y se pueden realizar programas más largos de una manera sencilla. MECANISMOS BÁSICOS DE LA POO Los mecanismos básicos de la programación orientada objetos son: • Objetos • Propiedades • Métodos • Eventos • Mensajes • Clases Pág. 13 a Objetos Un objeto es una entidad que tiene atributos particulares (propiedades) y unas formas de operar sobre ellos (métodos). Por tanto, un objeto contiene variables que especifican su estado y operaciones que definen su comportamiento. Son ejemplos de objetos: formularios, botones de comando, cuadros de texto, etiquetas, etc. Propiedades Las objeto. propiedades Hay representan propiedades las particulares, características como Caption que del la poseen los botones de comando por ejemplo, y genéricas como Name que la poseen todos lo objetos. Métodos Los métodos son procedimientos asociados a un objeto. Se ejecutan como respuesta a un evento, por ejemplo al dar click en un botón de comando. También pueden ser invocados de reaccionar explícitamente en el programa. Eventos Un evento es la capacidad de un objeto cuando ocurre una determinada acción (acción y reacción). Como respuesta a un evento se envía un mensaje y se ejecuta un determinado método (procedimiento). Pág. 14 Mensajes Un mensaje es una llamada a un método (procedimiento), de tal forma que cuando un objeto recibe un mensaje la respuesta a ese mensaje es ejecutar el procedimiento asociado. Cuando se ejecuta un programa orientado a objetos, los objetos están constantemente recibiendo, interpretando y respondiendo a mensajes de otros objetos. Clases Una clase es una descripción para producir objetos de esa clase o tipo. Es decir se trata de una generalización de un tipo específico de objetos. En otras palabras, un objeto es una variable del tipo definido por una clase. Por ejemplo, piense en un molde para hacer pasteles, el molde es la clase y los pasteles los objetos. CARACTERÍSTICAS DE LA POO Las características fundamentales de la programación orientada a objetos son: • Abstracción • Encapsulamiento • Herencia • Polimorfismo Pág. 15 Abstracción La abstracción permite no detenernos en los detalles concretos del funcionamiento de las cosas, sino centrarnos en los aspectos que realmente nos importan y nos son útiles en un determinado momento, en cierta medida, se podría decir que es “úsese el objeto y olvídese de como funciona en forma interna”. Por ejemplo, para manejar una computadora no necesitamos saber como funcionan sus circuitos electrónicos, en términos de corriente, tensión, etc. Encapsulamiento Esta característica permite ver un objeto como una “caja negra” autocontenida en la que se ha metido de alguna manera toda la información manipular los que objetos maneja como dicho unidades objeto. básicas, Esto permite permaneciendo oculta su estructura interna. Herencia La herencia es la característica que permite compartir automáticamente propiedades y métodos entre objetos. Es decir, se pueden crear nuevas clases de objetos en base a clases existentes. Más concreto, un objeto puede heredar un conjunto general de propiedades y métodos a las que puede Pág. 16 añadir aquellas características que son específicas suyas. El usuario de Visual Basic no dispone de esta característica. Polimorfismo Polimorfismo, del griego cuyo significado es “muchas formas”, es la característica que permite implementar múltiples formas de un mismo método, dependiendo cada una de ellas de la clase sobre la que se realiza la implementación. Esto hace posible que se puede acceder a una variedad de métodos distintos (todos con el mismo nombre) utilizando exactamente el mismo medio de acceso. LOS OBJETOS DE VISUAL BASIC Visual Basic soporta la abstracción, la encapsulación, el polimorfismo y la reutilización de código. La reutilización de código es la capacidad de trasladar características de un objeto a otro, lo que se logra con alguna forma de herencia. Esto se consigue mediante la creación y uso del objeto. Los objetos de Visual Basic están divididos en dos tipos: controles y contenedores. Los controles son un medio gráfico que permiten a los usuarios interactuar con la aplicación para la manipulación de datos y ejecución de tareas. Son ejemplo de controles: etiquetas, cuadros de texto, botones de comando, casillas de Pág. 17 verificación, botones de opción, cuadros de lista, cuadros combinados, etc. Los contenedores son objetos que pueden incluir otros objetos y permiten el acceso a los objetos que contienen. Entre los más utilizados tenemos a los formularios, marcos y cuadrículas. El formulario más los controles constituyen la interfaz de la aplicación. REFERENCIANDO OBJETOS La sintaxis para referenciar objetos es la siguiente: OBJETO.PROPIEDAD = VALOR Por ejemplo, para establecer el título de un formulario a “Visual Basic es fácil”, la orden sería: Form1.Caption = “Visual Basic es fácil” LOS EVENTOS Cada objeto responde a un conjunto de eventos. Como respuesta a un evento se ejecuta un determinado procedimiento. Los procedimientos asociados a un evento presentan la forma: Private Sub OBJETO_EVENTO() SENTENCIAS End Sub Pág. 18 Para aclarar este concepto desarrollaremos la siguiente aplicación, la cual consiste en un formulario, un cuadro de texto y un botón de comando. El usuario debe ingresar un mensaje en el cuadro de texto y al pulsar el botón de comando, el mensaje recientemente ingresado, se coloca como título del formulario. Para ello proceda a construir la interfaz mostrada en la figura anterior. Luego, dar doble click sobre el botón de comando e ingrese el siguiente código: Private Sub Command1_Click() Form1.Caption = Text1.Text End Sub Seguidamente guarde y proceda ejecutar su aplicación. Como puede verificar, el evento Click se dispara cada vez que el usuario pulsa (hace click) sobre un control. CONVENCIÓN DE NOMBRES PARA LOS OBJETOS Pág. 19 La convención a seguir en la presente guía - para dar nombre a los objetos - consiste en utilizar ciertos prefijos, los cuales indicaran el tipo de objeto del que se trata. Prefijo Objeto Frm Formulario Fra Marco Lbl Etiqueta Txt Cuadro de texto Cmd Botón de comando Chk Casilla de verificación Opt Botón de opción Lst Cuadro de lista Cbo Cuadro combinado Tim Cronómetro HS Barra de desplazamiento horizontal VS Barra de desplazamiento vertical Pic Cuadro de imagen Img Imagen Drv Cuadro de lista de unidades Dir Cuadro de lista de directorios Fil Cuadro de lista de archivos Ole Contenedor OLE Grd Cuadrícula Pág. 20 Gra Gráfico Ctr Control (se utiliza en procedimientos cuando el tipo de control es desconocido) CAPÍTULO 3 EL LENGUAJE Visual Basic es un lenguaje de programación basado en el lenguaje BASIC, al cual incorpora la funcionalidad de la programación orientada a objetos. El código de Visual Basic se almacena en módulos, donde cada módulo está subdividido en distintas secciones, una para cada objeto del módulo. Cada sección de código puede contener uno o más procedimientos, formados por declaraciones de constantes y variables, expresiones, sentencias de control y llamadas a procedimientos y/o funciones. En este capítulo vamos a analizar los diferentes elementos que intervienen al momento de realizar el código para una aplicación. TIPOS DE DATOS Los datos con los que trabajaremos probablemente incluyan información relacionada con números, dinero, nombres, Pág. 21 descripciones, fechas, etc. Cada dato corresponde a un determinado tipo, es decir, pertenece a una categoría de datos que se manipulan de maneras similares. Tipo Descripción Rango Integer Entero (2 bytes) -32768 a 32767 Long Entero largo (4 bytes) -2147483648 a 2147483647 Single Punto flotante de simple -3.40E+38 a precisión (4 bytes) Double Punto flotante de 3.40E+38 doble -1.79D+308 a precisión (8 bytes) Currency Monetario (8 bytes) 1.79D+308 +/922337203685477.5807 Byte Carácter (1 byte) String Cadena de caracteres byte por carácter) 0 a 255 (1 Aproximadamente hasta 64K (65400 caracteres) Boolean Lógico (2 bytes) True o False Date Fecha/Hora (8 bytes) 01/ENERO/100 a 31/DICIEMBRE/9999 Variant (por omisión) Cualquier tipo de dato Con números hasta el intervalo de un tipo Double. Con caracteres Pág. 22 22 bytes + 1 byte por carácter IDENTIFICADORES Los identificadores son nombres dados a los elementos de una aplicación, tales como constantes, variables, procedimientos, funciones, objetos, etc. Un identificador es una secuencia caracteres. de Para caracteres la que construcción puede de ser de hasta identificadores 255 debemos tener presente las siguientes reglas: • Deben comenzar con una letra y no puede contener espacios en blanco. • Letras, dígitos y caracteres subrayados están permitidos después del primer carácter. • No se puede identificador. utilizar Una una palabra palabra reservada reservada tiene un como significado especial para Visual Basic. CONSTANTES Una durante constante la almacena ejecución de un un dato cuyo programa. valor Para no cambia declarar constante utilice la siguiente sintaxis: Const NOMBRE_CONSTANTE [As TIPO] = VALOR Pág. 23 una Si no se declara el tipo de constante (utilizando As TIPO) se asigna a la constante el tipo de dato más apropiado a su valor. El valor de una constante puede ser numérico, alfanumérico, carácter o de tipo fecha y hora. Por ejemplo: Const MAXIT = 25 Const PI As Double = 3.141592 Const CADENA As String = “Visual Basic es fácil” Const FECHA_POR_DEFECTO = #01/01/99# VARIABLES Una variable almacena un dato cuyo valor puede cambiar durante la ejecución de un programa. Para declarar una variable utilice la siguiente sintaxis: Dim NOMBRE_VARIABLE [As TIPO] Cuando se declara una variable y no se especifica su tipo (con As TIPO), se asume que es de tipo Variant. La instrucción Dim puede realizar más de una declaración, teniendo en cuenta que la cláusula opcional As TIPO le permite definir el tipo de dato de cada variable que vaya a declarar. Por ejemplo: Dim X, Y As Integer Pág. 24 La sentencia anterior le puede inducir a pensar que X e Y son de tipo Integer, lo cual no es cierto, pues X es de tipo Variant (por omisión) e Y es de tipo Integer. Para asignar valores a una variable, utilizar la siguiente sintaxis: NOMBRE_VARIABLE = VALOR A manera de ejemplo considere lo siguiente: Dim CANTIDAD As Integer, PRECIO As Double, TOTAL As Double CANTIDAD = 30 PRECIO = 1.5 TOTAL = CANTIDAD * PRECIO OPERADORES Los operadores manipulados los son símbolos operandos. Los que indican operandos son cómo serán los datos (constantes y/o variables) sobre los que actúa los operadores para producir un determinado resultado. Operadores aritméticos Operador Significado ^ Exponenciación - Menos unario Pág. 25 * / \ División entera Mod + Multiplicación y división - Resto de una división entera Suma y resta Operadores relacionales Operador Significado = Igual que <> Diferente que < Menor que > Mayor que <= Menor o igual que => Mayor o igual que Operadores lógicos Operador Significado Not Negación And Conjunción Or Disyunción inclusiva Xor Disyunción exclusiva Eqv Equivalencia (opuesto a Xor) Imp Implicación (falso si primer operando verdadero y segundo operando falso) Pág. 26 Operadores de cadenas de caracteres Operador Significado Concatenación & Like Compara dos cadenas de caracteres SENTENCIAS Una sentencia es una línea de código que indica una o más operaciones a realizar. sentencias, separadas Una unas de línea puede otras por incluir dos varias puntos. Por ejemplo: Dim CANTIDAD As Integer, PRECIO As Double, TOTAL As Double CANTIDAD = 30 : PRECIO = 1.5 : TOTAL = CANTIDAD * PRECIO Una sentencia Visual Basic puede escribirse en más de una línea física utilizando el carácter de continuación de línea (un espacio en blanco seguido del carácter de subrayado). Por ejemplo: Dim CH4_ENTRADA As Double, CH4_SALIDA As Double, _ CH4_GENERA As Double, CH4_CONSUME AS Double ENTRADA Y SALIDA DE DATOS Visual Basic posee una serie de objetos (controles) que pueden ser utilizados como mecanismos de entrada y salida (E/S) de datos. Sin embargo, estos serán estudiados en capítulos posteriores. Pág. 27 Otra posibilidad de proporcionar datos o de visualizarlos durante la ejecución de una aplicación es utilizando cajas de diálogos predefinidas. Debido a que esta es la forma más simple de realizar la E/S de datos nos ocuparemos de ella. Entrada de datos La entrada de datos permite proporcionar valores durante la ejecución de una aplicación. Estos valores son ingresados generalmente mediante el teclado y asignados a variables del programa. En Visual Basic una forma de ingresar datos a la aplicación es utilizando la caja de diálogo predefinida provista por la función InputBox. Su sintaxis es la siguiente: VARIABLE = InputBox(MENSAJE [, TÍTULO] [, PREDETERMINADO]) Donde MENSAJE es el mensaje que indica al usuario el tipo de información que debe ingresar. Por ejemplo, las sentencias: Dim EDAD As Integer EDAD = InputBox(“Ingrese su edad?”) Da lugar a que Visual Basic presente la siguiente caja de diálogo solicitando la información requerida: Pág. 28 Como puede observar, el resto de los parámetros son opcionales. TÍTULO es el texto que se muestra en la barra de título del cuadro de diálogo, si se omite TÍTULO, el nombre de la aplicación es la que se muestra en la barra de título. PREDETERMINADO es una expresión de cadena que aparece en el cuadro de texto como respuesta predeterminada si no se proporciona ningún otro texto. Si se omite PREDETERMINADO el cuadro de texto se muestra vacío. A manera de ejemplo considere lo siguiente: Dim EDAD As Integer EDAD = InputBox(“Ingrese su edad?”, “Ficha de datos”, 18) En este caso se visualiza la caja de diálogo presenta en la figura siguiente: Pág. 29 que se Salida de datos La salida de datos generalmente información de realizar operación la la memoria de y consiste mostrarla salida de datos en en en tomar pantalla. Visual la Para Basic, podemos utilizar el procedimiento MsgBox, cuya sintaxis es como sigue: MsgBox MENSAJE [, ICONO, TÍTULO] MENSAJE es La cadena que se muestra como salida en la caja de diálogo. ICONO es se refiere al estilo de icono que se va ha utilizar y TÍTULO es una texto que se mostrará en la barra de título de la caja de diálogo. Por ejemplo: Dim EDAD As Integer EDAD = InputBox(“Ingrese su edad?”) EDAD = EDAD + 10 MsgBox “Dentro de 10 años su edad será:” & Str(EDAD) Si ejecuta el código anterior e ingresa su edad (en mi caso 29 años) la salida debe ser similar a la figura siguiente: Pág. 30 Para crear que una pueda nueva ejecutar aplicación el y código haga anterior, doble click proceda sobre a el formulario, luego ingrese el código anterior: Private Sub Form_Load() Dim EDAD As Integer EDAD = InputBox(“Ingrese su edad?”) EDAD = EDAD + 10 MsgBox “Dentro de 10 años su edad será:” & Str(EDAD) End Sub A manera de observación cabe señalar que la función Str() se utiliza para convertir una expresión numérica a una cadena de caracteres. ESTRUCTURAS DE CONTROL Las estructuras de control permiten tomar decisiones y realizar un proceso repetidas veces (procesos iterativos). Para ello Visual Basic dispone de las siguientes estructuras de control: If . . . Then . . . Else, If . . . Then . . . ElseIf, Select Case, For . . . Next, While . . . . Wend, Do . . . Loop y GoTo. Estructura If . . . Then . . . Else Este tipo de estructura evalúa una determinada condición y en función a ello ejecuta uno de entre dos posibles grupos de sentencias. Su sintaxis es la siguiente: Pág. 31 If CONDICIÓN Then SENTENCIAS_VERDADERAS Else SENTENCIAS_FALSAS End If Si CONDICIÓN es SENTENCIAS_VERDADERAS. grupo de verdadera Si se CONDICIÓN ejecuta es falsa el se grupo de ejecuta el SENTENCIAS_FALSAS. Por ejemplo, el siguiente código determina si un entero A es o no divisible por otro entero B: Dim A As Integer, B As Integer A = InputBox(“Ingrese A?”) B = InputBox(“Ingrese B?”) If A Mod B = 0 Then MsgBox Str(A) & “ es divisible por ” & Str(B) Else MsgBox Str(A) & “ no es divisible por ” & Str(B) End If Estructura If . . . Then . . . ElseIf Este tipo de estructura se utiliza para elegir una de entre múltiples alternativas. Su sintaxis es como sigue: If CONDICIÓN_1 Then Pág. 32 SENTENCIAS_1 ElseIf CONDICIÓN_2 Then SENTENCIAS_2 . . . Else SENTENCIAS_FALSAS End If Si CONDICIÓN_1 es verdadera se ejecuta el grupo de SENTENCIAS_1, y si es no se cumple, se evalúan secuencialmente las condiciones siguientes hasta Else, ejecutándose las sentencias correspondientes al primer ElseIf cuya condición sea verdadera. Si todas las condiciones son falsas, se ejecutan las SENTENCIAS_FALSAS correspondientes a Else. Por ejemplo considere el siguiente código, el cual imprime el nombre del mes correspondiente a los números del 1 al 12. Dim N As Integer N = InputBox(“Ingrese N?”) If N = 1 Then MsgBox “Enero” ElseIf N = 2 Then : MsgBox “Febrero” ElseIf N = 3 Then : MsgBox “Marzo” ElseIf N = 4 Then : MsgBox “Abril” ElseIf N = 5 Then : MsgBox “Mayo” Pág. 33 ElseIf N = 6 Then : MsgBox “Junio” ElseIf N = 7 Then : MsgBox “Julio” ElseIf N = 8 Then : MsgBox “Agosto” ElseIf N = 9 Then : MsgBox “Setiembre” ElseIf N = 10 Then : MsgBox “Octubre” ElseIf N = 11 Then : MsgBox “Noviembre” ElseIf N = 12 Then : MsgBox “Diciembre” Else : MsgBox “Error de datos” End If Estructura Select Case Este estructura es una alternativa a la estructura If . . . Then . . . ElseIf, cuando lo que necesita es comparar la misma expresión con diferentes valores. Su sintaxis es la siguiente: Select Case EXPRESIÓN_TEST Case EXPRESIÓN_1 SENTENCIAS_1 Case EXPRESIÓN_2 SENTENCIAS_2 . . . Case Else SENTENCIAS_FALSAS End Select Pág. 34 En este caso se comprueba el valor de EXPRESIÓN_TEST frente a la lista expresiones EXPRESIÓN_1, EXPRESIÓN_2, . . . y así sucesivamente, y busca el primer Case que incluya el valor evaluado en EXPRESIÓN_TEST, ejecutando a continuación el bloque de sentencias correspondiente. Si no existe un valor igual a EXPRESIÓN_TEST, entonces se ejecuta las SENTENCIAS_FALSAS correspondientes al Case Else. A manera de ejemplo vamos a codificar el programa de la sección anterior el cual imprime el nombre del mes correspondiente a los números del 1 al 12. Pero en esta vez utilizaremos la estructura Select Case (compare con cual de ambas estructuras es más cómodo trabajar). Dim N As Integer N = InputBox(“Ingrese N?”) Select Case N Case 1 : MsgBox “Enero” Case 2 : MsgBox “Febrero” Case 3 : MsgBox “Marzo” Case 4 : MsgBox “Abril” Case 5 : MsgBox “Mayo” Case 6 : MsgBox “Junio” Case 7 : MsgBox “Julio” Case 8 : MsgBox “Agosto” Case 9 : MsgBox “Setiembre” Pág. 35 Case 10 : MsgBox “Octubre” Case 11 : MsgBox “Noviembre” Case 12 : MsgBox “Diciembre” Case Else MsgBox “Error de datos” End Select Cabe destacar que Select Case también se puede utilizar de la siguiente manera: Dim X As Integer X = InputBox(“Ingrese X?”) Select Case X Case 1 MsgBox “X = 1” Case 2, 3 MsgBox “X = 2 o X = 3” Case 4 To 10 MsgBox “4 <= X <= 10” Case Else MsgBox “X < 1 o X > 10” End Select Estructura For . . . Next Esta estructura es utilizada para ejecutar un bucle un número determinado de veces. El número de iteraciones deberá Pág. 36 ser conocido de antemano. Su sintaxis es la que se presenta a continuación: For CONTADOR = INICIO To FINAL [Step INCREMENTO/DECREMENTO] SENTENCIAS_REPETITIVAS [Exit For] Next Donde la variable CONTADOR es inicializada con el valor de INICIO y se incrementa o decrementa hasta un valor FINAL. INCREMENTO/DECREMENTO define la manera en que cambia el valor de la variable CONTADOR en cada iteración. La sentencia Exit For permite salir del bucle For . . . Next antes de que este finalice. Por ejemplo, el siguiente código imprime los cuadrados de los números enteros del 1 al 25. Dim C As Integer For C = 1 To 25 Print C Next Para que este código funcione correctamente debe establecer la propiedad AutoRedraw del formulario a True. Estructura While . . . Wend La estructura While . . . Wend es aquella en la que el número de iteraciones no se conoce por anticipado y el cuerpo Pág. 37 del bucle se repite mientras se cumple una determinada condición. Su sintaxis es la siguiente: While CONDICIÓN SENTENCIAS_REPETITIVAS Wend La estructura While . . . Wend evalúa la CONDICIÓN en cada iteración y si el resultado es verdadero continúa su ejecución. El bucle termina cuando CONDICIÓN es falsa. A manera de ejemplo, considere el siguiente código, el cual imprime en pantalla la suma de los N primeros números naturales, es decir S = 1 + 2 + 3 + 4 + . . . + N Dim N As Integer, S As Integer S = 0 N = InputBox(“Ingrese N?”) While N <> 0 S = S + N N = N - 1 Wend MsgBox “La suma es S= ” & Str(S) Estructura Do . . . Loop Esta estructura ejecuta un bucle mientras una condición dada sea cierta, o hasta que una condición dada sea cierta. La Pág. 38 condición puede ser verificada antes o después de ejecutarse el cuerpo del bucle. Su sintaxis es: Formato 1: Do [While/Until] CONDICIÓN SENTENCIAS_REPETITIVAS [Exit Do] Loop Formato 2: Do SENTENCIAS_REPETITIVAS [Exit Do] Loop [While/Until] CONDICIÓN Esta estructura (como se puede observar en ambos formatos) permite realizar varias estructuras diferentes dependiendo si la condición de terminación está al principio o al final del cuerpo del bucle. Como ejemplo, consideremos el siguiente programa, el cual calcula el factorial de un entero N ingresado por teclado: Dim N As Integer, FACT As Integer, C As Integer FACT = 1 C = 1 N = InputBox(“Ingrese N?”) Do FACT = FACT * C C = C + 1 Loop While C <= N Pág. 39 MsgBox “El factorial de ” & Str(N) & “ es=” & Str(FACT) Sentencia GoTo Transfiere el control a una línea específica de código, identificada por una etiqueta o por un número de línea. Su sintaxis es: GoTo ETIQUETA/NUMERO_LÍNEA Aunque el uso del GoTo se ha depreciado considerablemente, en el presente trabajo no se juzgará su validez. Sin embargo, se ha establecido que no hay situaciones de programación que requieran el uso del GoTo, es decir, no es un elemento necesario para hacer completo el lenguaje. Sin embargo, el GoTo es un convenio que, si su usa con cuidado, puede ser beneficioso en ciertas situaciones de programación. Por ejemplo podría escribir un bucle para imprimir los cuadrados de los números enteros del 1 al 25. Dim X As Integer X = 0 LABEL1: X = X + 1 Print X ^ 2 If X < 25 Then GoTo LABEL1 Pág. 40 Un uso abusivo de la sentencia GoTo da lugar a códigos difíciles de interpretar y de mantener. Por ello, se recomienda su uso solamente en ocasiones excepcionales. La tarea que vaya a desempeñar cualquiera de una sentencia las GoTo estructuras puede de suplirse control utilizando vistas en las secciones anteriores. ARREGLOS Un arreglo o matriz es una estructura de datos en la que se almacena una colección finita de datos del mismo tipo, que comparten un nombre común, a los que se puede acceder por la posición (índice) que ocupa cada uno de ellos dentro del arreglo. Cada elemento del arreglo es una variable que puede contener un número o una cadena de caracteres, dependiendo del tipo de arreglo que se declare. Los arreglos en Visual Basic se clasifican en estáticos y dinámicos. Arreglos estáticos Son aquellos arreglos cuyo tamaño no puede cambiar en tiempo de ejecución. La declaración de un arreglo estático se puede realizar mediante la siguiente sintaxis: Dim NOMBRE_ARREGLO(DIMENSONES) As TIPO Pág. 41 Donde DIMENSIONES es una lista de números, separados por comas y que definen las dimensiones del arreglo. Esta lista puede ser de la siguiente forma: DIMENSIÓN_1, DIMENSIÓN_2, DIMENSIÓN_3, . . ., DIMENSIÓN_ K Para el caso de un arreglo formado por “ K ” dimensiones, es decir un arreglo K -dimensional. A manera de ejemplo considere los siguientes casos que se pueden presentar: Dim LISTA(9) As Integer Dim MATRIZ(4, 3) As Double Dim NOMBRES(19) As String * 30 En el primer caso se declara un arreglo unidimensional de 10 elementos de tipo entero (por defecto los elementos de un arreglo se numeran a partir de 0). En el segundo caso se define de un arreglo bidimensional de 20 elementos (5 filas por 4 columnas) de tipo punto flotante en doble precisión. En el tercer caso se define una arreglo unidimensional de 20 elementos de tipo cadena de caracteres (cada elemento tiene una longitud fija de 30 caracteres). Como arreglo se por observa la numeración defecto comienza en de cero, los elementos para hacer Pág. 42 de un que la numeración comience en 1, debe ingresar la siguiente orden en la sección de Declaraciones del módulo de formulario: Luego, para declarar los mismos arreglos de los casos anteriores, las sentencias serían las siguientes: Dim LISTA(10) As Integer Dim MATRIZ(5, 4) As Double Dim NOMBRES(20) As String * 30 Establecer la sentencia Option Base a 1 o trabajar con el valor predeterminado (cero) queda a consideración del lector. Arreglos dinámicos Son aquellos arreglos en los que su tamaño puede definirse o modificarse en tiempo de ejecución. Para declara una arreglo dinámico utilice la siguiente sintaxis: Dim NOMBRE_ARREGLO() As TIPO Para definir el tamaño del arreglo utilizar la siguiente sintaxis: Pág. 43 ReDim NOMBRE_ARREGLO(NÚMERO_ELEMENTOS) Cada vez que se ejecuta la sentencia ReDim, todos los valores almacenados en el arreglo se pierden. Para definir o cambiar el tamaño del arreglo conservando los valores del mismo use la siguiente sintaxis: ReDim Preserve NOMBRE_ARREGLO(NÚMERO_ELEMENTOS) Para liberar el espacio de memoria utilizado por arreglos dinámicos que ya no son útiles, utilizar la sintaxis: Erase NOMBRE_ARREGLO La orden Erase asigna cero a cada elemento de los arreglos numéricos y nulo (“”) a cada elemento de los arreglos de cadena de caracteres. A manera de ejemplo considere el siguiente código declara y hace uso de un arreglo dinámico: Dim I As Integer, N As Integer, TEMP() As Integer N = InputBox(“Ingrese N?”) ReDim TEMP(N - 1) For I = 0 To N - 1 TEMP(I) = I + 1 Print TEMP(I) Next Erase TEMP Pág. 44 que REGISTROS Un registro es un nuevo tipo de dato, que se define como una colección de datos de diferentes tipos, conocidos como “campos”, los cuales se encuentran evidentemente relacionados. Un registro sólo se puede ser creado en la sección de declaraciones de un módulo. La sintaxis correspondiente es: Private Type NOMBRE_REGISTRO DECLARACIONES_DE_LOS_MIEMBROS End Type Por ejemplo considere el siguiente código que define la estructura ALUMNO: Private Type ALUMNO ID_ALUMNO As String * 7 NOMBRE As String * 25 DIRECCION As String * 35 TELEFONO As String * 7 ESTADO As Boolean End Type Luego, podemos declarar una variable tipo ALUMNO de la siguiente forma: Dim X As ALUMNO Pág. 45 Para referirse a un determinado miembro del registro se utiliza el operador selector de campos ( . ), veamos: X.ID_ALUMNO = “980976G” X.NOMBRE = “Carlos Castillo Peralta” X.DIRECCION = “Jr. C. Richardson 412 Chorrillos” X.TELEFONO = “2510850” X.ESTADO = True Las mismas órdenes del párrafo anterior se pueden escribir de una manera más fácil, más legible y más eficiente si utiliza la sentencia With . . . End With, del siguiente modo: With X . ID_ALUMNO = “980976G” .NOMBRE = “Carlos Castillo Peralta” .DIRECCION = “Jr. C. Richardson 412 Chorrillos” .TELEFONO = “2510850” .ESTADO = True End With FUNCIONES Las funciones son uno de los elementos básicos programación. A continuación serán estudiadas detalladamente. Declaración de una función Pág. 46 en Una función es un procedimiento que cuando se ejecuta devuelve un único resultado al procedimiento que la invocó. La sintaxis correspondiente a la declaración de una función es: Function NOMBRE_FUNCIÓN([LISTA_PARÁMETROS]) [As TIPO] SENTENCIAS [NOMBRE_FUNCIÓN = VALOR_RETORNADO] [Exit Function] End Function Donde separadas LISTA_PARÁMETROS por comas que se es una secuencia corresponden con de los variables argumentos pasados cuando es invocada la función. Para especificar el tipo de datos que será retornado por la función utilice la cláusula opcional As TIPO, el tipo es Variant por omisión. El valor retornado por la función es almacenado en propio nombre, es decir en NOMBRE_FUNCIÓN, que actúa su como variable dentro del cuerpo de la función. Si no se efectúa esta asignación el valor devuelto será cero si la función es de tipo numérica, nulo (“”) si la función es de tipo cadena, o vacío (Empty) si la función es de tipo Variant. La cláusula opcional Exit Function permite salir de una función antes de que la función finalice, en caso sea esto necesario. Pág. 47 La sintaxis para la llamada a una función es de la siguiente forma: VARIABLE = NOMBRE_FUNCIÓN([LISTA_ARGUMENTOS]) Donde variables LISTA_ARGUMENTOS o argumentos expresiones debe ser es una separadas igual al secuencia por número comas. de de El constantes, número parámetros de de la función. Los tipos de los argumentos deben coincidir con los tipos de sus correspondientes parámetros. A manera de ejemplo considere la implementación de la siguiente función: f ( x) = x 2 + 2 x + 3 En la sección de Declaraciones del módulo de formulario ingrese el siguiente código: Function F(X As Double) As Double F = X ^ 2 + 2 * X + 3 End Function Para invocar la función creada recientemente, codifique las siguientes líneas: Dim A As Double, RESP As Double A = InputBox(“Ingrese A?”) RESP = F(A) Pág. 48 MsgBox (Str(RESP)) Paso de argumentos a una función El paso de argumentos a una función es la forma como se ingresan los datos y variables al interior de la función y se presenta de dos formas: • Por referencia • Por valor Paso de argumentos por referencia En las funciones de Visual Basic, los argumentos se pasan por referencia (forma por defecto), de este modo cualquier cambio de valor que sufra un parámetro en el cuerpo de la función, también se produce en el argumento correspondiente de la llamada a la función. Esta forma de pasar los argumentos a una función es útil para funciones que devuelven más de un valor. Por ejemplo, considere la siguiente función que calcula las raíces reales de una ecuación cuadrática Ax 2 + Bx + C = 0 . Function RAIZ(A As Double, B As Double, C As Double, _ X1 As Double, X2 As Double) As Boolean Dim D As Double D = B ^ 2 - 4 * A * C If D >= 0 Then X1 = (-B - Sqr(D)) / (2 * A) X2 = (-B + Sqr(D)) / (2 * A) Pág. 49 RAIZ = True ' Verdadero si hay raíces reales RAIZ = False ' Falso si no hay raíces reales Else End If End Function La llamada a esta función se puede realizar de la manera que se presenta a continuación: Dim A As Double, B As Double, C As Double Dim X1 As Double, X2 As Double A = InputBox(“Ingrese A?”) B = InputBox(“Ingrese B?”) C = InputBox(“Ingrese C?”) If RAIZ(A, B, C, X1, X2) Then MsgBox “X1= ” & Str(X1) MsgBox “X2= ” & Str(X2) Else MsgBox “NO EXISTEN RAÍCES REALES” End If Paso de argumentos por valor Cuando se ejecuta una función, se podrá especificar que el valor de un argumento no sea cambiado por esta función, pasando dicho argumento por valor. Para ello se debe anteponer Pág. 50 la palabra reservada ByVal a la declaración del parámetro en la cabecera de la función. Por ejemplo: Function F(ByVal X As Double) As Double F = X ^ 2 + 2 * X + 3 End Function La cabecera de la función F especifica que X será pasado por valor y no por referencia. Funciones recursivas Se dice que una función es recursiva si se llama a sí misma. Por ejemplo la función FACTORIAL cuyo código se presenta a continuación es recursiva: Function FACTORIAL(N As Integer) As Long If N <> 0 Then FACTORIAL = FACTORIAL(N - 1) * N Else FACTORIAL = 1 End If End Function PROCEDIMIENTOS La sintaxis para definir un procedimiento es siguiente: Private Sub NOMBRE_PROCEDIMIENTO([LISTA_PARÁMETROS]) Pág. 51 la SENTENCIAS [Exit Sub] End Sub La explicación es análoga a la dada para las funciones. Sin embargo, un procedimiento no puede ser utilizado en una expresión, ya que un procedimiento no retorna ningún valor a través de su nombre. La llamada a un procedimiento puede ser realizada de alguna de las dos formas siguientes: Call NOMBRE_PROCEDIMIENTO([LISTA_ARGUMENTOS]) ó NOMBRE_PROCEDIMIENTO([LISTA_ARGUMENTOS]) Por ejemplo, el siguiente código corresponde a un procedimiento que calcula e imprime la suma de los N primeros números naturales impares, es decir: S = 1 + 3 + 5 + . . . + N Private Sub SUMA_IMPAR(N As Integer) Dim S As Integer, I As Integer S = 0 For I = 1 To N If I Mod 2 <> 0 Then S = S + I End If Pág. 52 Next MsgBox “La suma es S= ” & Str(S) End Sub La llamada a este procedimiento podría ser de la forma: Call SUMA_IMPAR(25) Pág. 53 CAPÍTULO 4 USO DE LOS CONTROLES Los controles son aquellos objetos que se encuentran dentro de un contenedor y que permiten la interacción entre el usuario y la aplicación, ya sea para manipular datos y/o ejecutar tareas. En Visual Basic, los controles suelen ser agrupados en tres categorías: • Controles básicos • Controles complementarios • Controles externos Los controles básicos son las etiquetas, cuadros de texto y botones de comando, pues utilizando estos tres controles se puede construir cualquier interfaz. Los controles complementarios son el resto de los controles, por ejemplo una casilla de verificación, un cuadro combinado o un cronómetro. Los controles externos se refieren a aquellos controles creados por terceros. Este tipo de controles son llamados ActiveX. Pág. 54 CONTROLES BÁSICOS Los controles básicos lo conforman las etiquetas, cuadros de texto y botones de comando, debido a que cualquier interfaz se puede implementar con sólo estos tres objetos. Etiqueta Una etiqueta es un control que permite presentar texto de solo lectura. Se utiliza para mostrar títulos y mensajes que por lo general no cambian. Sin embargo, si lo desea, puede escribir procedimientos que cambien el texto mostrado por una etiqueta como respuesta a eventos en tiempo de ejecución. Propiedad Alignment Descripción Especifica la forma como se alineará el texto. AutoSize Especifica si se cambia automáticamente el tamaño del control para que quepan sus contenidos. BackColor, ForeColor BackStyle Especifica el color de fondo y de primer plano empleado para mostrar el texto. Especifica si el fondo del control es transparente u opaco. Caption Especifica el texto que se muestra en el control. WordWrap Especifica si la etiqueta se extiende a más de una línea cuando el texto es amplio. Pág. 55 Cuadro de texto Un cuadro de texto es un control en el que el usuario pueda ingresar datos desde el teclado o visualizar un resultado generado por la aplicación. El valor de un cuadro de texto por lo general se asocia a una variable de memoria. Propiedad Enabled Descripción Habilita o deshabilita el control, es decir si se puede o no modificar el contenido. Locked Permite bloquear el acceso al control en tiempo de ejecución. MaxLenght Especifica la longitud máxima (en caracteres) que puede escribirse en el control. MultiLine Especifica si el control admitirá múltiples líneas. PasswordChar Determina si se muestran en el control los caracteres escritos por el usuario o los caracteres de marcador de posición. ScrollBars Especifica si se muestran las barras de desplazamiento horizontales o verticales. SelLength Especifica el número de caracteres seleccionados. SelStart Especifica el inicio del texto seleccionado. Si su valor es 0, el texto seleccionado comienza por el primer carácter. SelText Contiene el texto seleccionado. Text Contiene el texto introducido en el control. Puede inicializar el contenido en tiempo de diseño. Pág. 56 Los eventos asociados a un cuadro de texto son los contenido del siguientes: Evento Change Descripción Ocurre cuando se cambia el control utilizando el teclado o el ratón. KeyPress Ocurre cuando se pulsa una tecla. Botón de comando Un botón de comando es un control que suele emplearse para ejecutar una acción, como cerrar un formulario, imprimir un informe, etc. Propiedad Cancel Descripción Especifica si el control responderá a la tecla ESC, por lo general para terminar la aplicación. Caption Muestra un título para el control. Default Especifica si el control responderá a la tecla ENTRAR, sin importar la ubicación del enfoque. Enabled Permite habilitar o deshabilitar el control. Picture Especifica una imagen tipo icono para el control. Style Especifica la apariencia del control, ya sea estándar (estilo estándar de Windows) gráfica (con una imagen personalizada). Pág. 57 o Los botones de comando suelen responder al evento Click, cuya descripción es: Evento Descripción Click Ocurre cuando el usuario hace click sobre el control. A manera aplicación. de Esta consiste permite manipular dispone de los ejemplo cierta siguientes vamos en a un cantidad desarrollar cajero de billetes: siguiente automático dinero S/. la para 10.00; el cual lo cual S/. 20.00; S/. 50.00; S/. 100.00 y S/. 200.00. Elaborar una aplicación que permita la lectura de la cantidad a retirar e indique el menor número de billetes a utilizar. Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 6 etiquetas Pág. 58 6 cajas de texto 3 botones de comando Una vez ubicados los controles, establezca las propiedades según se indica: Form1 Nombre FrmCajero BorderStyle 3-Fixed Dialog Caption Cajero automático Label1 Nombre LblCantidad AutoSize True Caption Cantidad a retirar: Label2 Nombre LblB10 AutoSize True Caption Billetes de S/. 10 Label3 Nombre LblB20 AutoSize True Caption Billetes de S/. 20 Label4 Nombre LblB50 AutoSize True Caption Billetes de S/. 50 Label5 Pág. 59 Nombre LblB100 AutoSize True Caption Billetes de S/. 100 Label6 Nombre LblB200 AutoSize True Caption Billetes de S/. 200 Nombre TxtCantidad Text1 Text Text2 Nombre TxtB10 Text Text3 Nombre TxtB20 Text Text4 Nombre TxtB50 Text Text5 Nombre TxtB100 Text Text6 Nombre TxtB200 Text Command1 Pág. 60 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Caption &Salir Para añadir código a la aplicación haga doble click sobre el botón “Aceptar” e ingrese lo siguiente: Private Sub CmdAceptar_Click() Dim C As Integer, B200 As Integer, B100 As Integer, _ B50 As Integer, B20 As Integer, B10 As Integer C = Val(TxtCantidad) If C Mod 10 = 0 Then B200 = C \ 200 : C = C Mod 200 B100 = C \ 100 : C = C Mod 100 B50 = C \ 50 : C = C Mod 50 B20 = C \ 20 : B10 = C Mod 20 TxtB200 = Str(B200) TxtB100 = Str(B100) TxtB50 = Str(B50) TxtB20 = Str(B20) TxtB10 = Str(B10) Else Pág. 61 MsgBox “Cantidad a retirar debe ser múltiplo de 10” TxtCantidad = “” TxtCantidad.SetFocus End If End Sub Luego, haga doble click sobre el botón “Limpiar” y añada el siguiente código: Private Sub CmdLimpiar_Click() TxtCantidad = “” TxtB200 = “” TxtB100 = “” TxtB50 = “” TxtB20 = “” TxtB10 = “” TxtCantidad.SetFocus End Sub Finalmente dar doble click sobre el botón “Salir” y añada el siguiente código: Private Sub CmdSalir_Click() End End Sub Pág. 62 En el código anterior hemos utilizado el método SetFocus para enfocar la caja de texto TxtCantidad, esto es, para posicionar el cursor sobre ella. CONTROLES COMPLEMENTARIOS Los controles complementarios se utilizan como alternativa a los controles básicos en aplicaciones en las cuales su uso facilita o mejora el diseño de la interfaz. Como el lector podrá verificar, algunos controles son más adecuados que otros dependiendo del tipo de aplicación que se pretenda desarrollar. Marco Un marco es un objeto contenedor que puede utilizarse para agrupar casillas de verificación, botones de opción, botones de comando, etc. Propiedad Caption Descripción Muestra un título para el control. Casilla de verificación Una casilla de verificación se utiliza para alternar entre dos posibles valores (Activado/Desactivado). Cada casilla de verificación es independiente de las demás ya que cada una tiene su propio nombre (Name). Puede utilizar casillas de verificación en grupos para mostrar múltiples opciones entre Pág. 63 las cuales el usuario puede seleccionar todas las que desee a la vez. Propiedad Descripción Caption Muestra un título para el control. Value Devuelve o establece el estado del control, puede ser: Desactivado (0), Activado (1). Las casillas de verificación suelen responder al evento Click. Botón de opción Un botón de opción se utiliza para alternar entre dos posibles valores (Activado/Desactivado), de manera similar a las casillas de verificación, la diferencia radica en que de un grupo de botones de opción el usuario sólo puede seleccionar un único botón a la vez. Propiedad Descripción Caption Muestra un título para el control. Value Devuelve o establece el estado del control, puede ser: Desactivado (Falso), Activado (True). Los botones de opción también suelen responder al evento Click. Pág. 64 A manera de ejemplo vamos a desarrollar la siguiente aplicación, la cual permite cambiar el aspecto de un cuadro de texto, el usuario debe elegir el color (rojo, verde, azul) y el estilo (negrita, cursiva, subrayado) de la fuente a utilizar. Adicionalmente, cuando el usuario active la casilla de verificación “Convertir a mayúsculas”, todo el texto que haya escrito en el cuadro de texto se presentará en mayúsculas y todo texto que escriba a continuación (mientras la opción esté activada) también deberá aparecer en mayúsculas. Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 1 cuadro de texto 2 marcos 3 botones de opción 4 casillas de verificación Pág. 65 Una vez ubicados los controles, establezca las propiedades según se indica: Form1 Nombre FrmEditor BorderStyle 3-Fixed Dialog Caption Editor Nombre TxtMensaje ForeColor &H000000FF& Text1 Text Frame1 Nombre FraColor Caption Color Frame2 Nombre FraEstilo Caption Estilo Option1 Nombre OptRojo Caption Rojo ForeColor &H000000FF& Value True Option2 Nombre OptVerde Caption Verde ForeColor &H00008000& Pág. 66 Option3 Nombre OptAzul Caption Azul ForeColor &H00C00000& Check1 Nombre ChkNegrita Caption Negrita Font Arial (Negrita) Check2 Nombre ChkCursiva Caption Cursiva Font Arial (Cursiva) Check3 Nombre ChkSubrayado Caption Subrayado Font Arial (Subrayado) Check4 Nombre ChkMayuscula Caption Convertir a mayúsculas Una vez establecidas las propiedades, proceda a ingresar el código que se indica a continuación: Private Sub OptRojo_Click() If OptRojo.Value Then TxtMensaje.ForeColor = RGB(255, 0, 0) End If End Sub Pág. 67 Private Sub OptVerde_Click() If OptVerde.Value Then TxtMensaje.ForeColor = RGB(0, 255, 0) End If End Sub Private Sub OptAzul_Click() If OptAzul.Value Then TxtMensaje.ForeColor = RGB(0, 0, 255) End If End Sub Private Sub ChkNegrita_Click() If ChkNegrita.Value Then TxtMensaje.Font.Bold = True Else TxtMensaje.Font.Bold = False End If End Sub Private Sub ChkCursiva_Click() If ChkCursiva.Value Then TxtMensaje.Font.Italic = True Else TxtMensaje.Font.Italic = False End If End Sub Pág. 68 Private Sub ChkSubrayado_Click() If ChkSubrayado.Value Then TxtMensaje.Font.Underline = True Else TxtMensaje.Font.Underline = False End If End Sub Private Sub ChkMayuscula_Click() If ChkMayuscula.Value Then TxtMensaje = UCase(TxtMensaje) End If End Sub Private Sub TxtMensaje_KeyPress(KeyAscii As Integer) Dim CAR As String * 1 If ChkMayuscula.Value Then CAR = UCase(Chr(KeyAscii)) KeyAscii = Asc(CAR) End If End Sub La función RGB() especifica el color que se asigna a la propiedad ForeColor. La función UCase() retorna una cadena de caracteres en mayúsculas. Pág. 69 Cuadro de lista Un cuadro de lista es un control que presenta una lista de elementos en la que el usuario puede seleccionar uno o más de dichos elementos. Si el número de elementos supera el número que puede mostrarse, se agregará automáticamente una barra de desplazamiento al control. Propiedad List Descripción Contiene los elementos de la lista. Puede definirlos en tiempo de diseño. ListCount Especifica el número de elementos de la lista. Su valor siempre es uno más que el mayor valor de ListIndex. ListIndex Especifica el número de orden que ocupa el elemento seleccionado en la lista. Toma el valor de 0 para el primer elemento, si no ha selecciona ninguno retorna -1. MultiSelect Especifica si se pueden seleccionar varios elementos de la lista. SelCount Devuelve el número de elementos seleccionados. Selected Especifica si un elemento de la lista está seleccionado. Sorted Especifica si los elementos de la lista se ordenan alfabéticamente. Text Especifica el valor del elemento seleccionado en ese instante. El valor es tratado como una cadena de caracteres. Pág. 70 Los métodos que se pueden utilizar para un cuadro de lista son los siguientes: Método Descripción AddItem Agrega un nuevo elemento a la lista. Clear Elimina todos los elementos contenidos en la lista. RemoveItem Elimina en elemento de la lista. Cuadro combinado Un cuadro combinado es una mezcla de un cuadro de texto con una lista. En él no sólo se podrá ingresar un dato sino también seleccionarlo propiedades, eventos de y la métodos lista. que Presenta el cuadro las de mismas lista a excepción de lo siguiente: Propiedad Style Descripción Especifica si el control se comporta como un cuadro de texto o como una lista desplegable. Un cuadro de texto permite ingresar valores. Una lista desplegable sólo permite seleccionar valores. El valor predeterminado es 0-vbComboDropDown, e incluye una lista desplegable y un cuadro de texto. El valor 1-vbComboSimple incluye tan solo cuadro de texto. El valor 2-Dropdown List incluye sólo una lista desplegable. Pág. 71 Como ejemplo del uso de listas vamos a desarrollar una aplicación que permita ingresar el nombre de un curso, el cual pasa a formar parte de una lista de espera antes de ser programado para su dictado. Los cursos deben ser seleccionados de la lista de espera y trasladados a la lista de cursos programados y viceversa. Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 3 etiquetas 1 cuadro de texto 2 listas 5 botones de comando Pág. 72 En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmCursos BorderStyle 3-Fixed Dialog Caption Cursos Label1 Nombre LblCurso AutoSize True Caption Ingrese nuevo curso: Label2 Nombre LblSeleccionar AutoSize True Caption Seleccione un curso: Label3 Nombre LblProgramado AutoSize True Caption Curso programado: Nombre TxtCurso Text1 Text List1 Nombre LstSeleccionar Nombre LstProgramado List2 Pág. 73 Command1 Nombre CmdAgregar Caption Picture C:\FundVB\Bitmaps\AddItem.Bmp Style 1-Graphical Command2 Nombre CmdAgregarTodo Caption Picture C:\FundVB\Bitmaps\AddAll.Bmp Style 1-Graphical Command3 Nombre CmdQuitar Caption Picture C:\FundVB\Bitmaps\Remove.Bmp Style 1-Graphical Command4 Nombre CmdQuitarTodo Caption Picture C:\FundVB\Bitmaps\RemoveAll.Bmp Style 1-Graphical Command5 Nombre CmdAnnadir Caption &Añadir Default True Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub CmdAnnadir_Click() Pág. 74 LstSeleccionar.AddItem TxtCurso TxtCurso = “” TxtCurso.SetFocus End Sub Private Sub CmdAgregar_Click() Dim CURSO As String, I As Integer CURSO = LstSeleccionar.Text I = LstSeleccionar.ListIndex If LstSeleccionar.ListIndex >= 0 Then LstProgramado.AddItem CURSO LstSeleccionar.RemoveItem I End If End Sub Private Sub CmdQuitar_Click() Dim CURSO As String, I As Integer CURSO = LstProgramado.Text I = LstProgramado.ListIndex If LstProgramado.ListIndex >= 0 Then LstSeleccionar.AddItem CURSO LstProgramado.RemoveItem I End If End Sub Private Sub CmdAgregarTodo_Click() Dim I As Integer Pág. 75 For I = 0 To LstSeleccionar.ListCount - 1 LstProgramado.AddItem LstSeleccionar.List(I) Next LstSeleccionar.Clear End Sub Private Sub CmdQuitarTodo_Click() Dim I As Integer For I = 0 To LstProgramado.ListCount - 1 LstSeleccionar.AddItem LstProgramado.List(I) Next LstProgramado.Clear End Sub Seguidamente mostraremos un ejemplo del uso de los cuadros combinados. Para tal fin vamos a desarrollar una aplicación que permita realizar consultas acerca de un determinado curso. La relación de cursos se presentará mediante un cuadro combinado, del cual el usuario debe seleccionar el curso de su interés y en seguida se presentará el nombre del profesor encargado del curso (teoría), el nombre del jefe de práctica (laboratorio), así como los horarios de teoría y de laboratorio, respectivamente. Pág. 76 Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 1 etiqueta 1 cuadro de texto 1 cuadro combinado 1 botón de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmConsultaCursos BorderStyle 3-Fixed Dialog Caption Consulta de cursos Pág. 77 Label1 Nombre LblCursos Caption Cursos: Nombre TxtCurso MultiLine True ScrollBars 2-Vertical Text1 Text Combo1 Nombre CboCursos Text Style 2-Dropdown List Command1 Nombre CmdSalir Caption &Salir Seguidamente proceda a ingresar el código que se indica a continuación: Dim Matriz(5, 3) As String Private Sub Form_Load() CboCursos.AddItem “Microsoft Visual Basic Nivel I” CboCursos.AddItem “Microsoft Visual Basic Nivel II” CboCursos.AddItem “Microsoft Visual FoxPro Nivel I” CboCursos.AddItem “Microsoft Visual FoxPro Nivel II” CboCursos.AddItem “Microsoft Visual C++ Nivel I” CboCursos.AddItem “Microsoft Visual C++ Nivel II” Pág. 78 Matriz(0, 0) = “Castillo Peralta, Carlos” Matriz(1, 0) = “Castillo Peralta, Carlos” Matriz(2, 0) = “Linares Alarcon, Adams” Matriz(3, 0) = “Castillo Peralta, Carlos” Matriz(4, 0) = “Córdoba Saavedra, Javier” Matriz(5, 0) = “Castillo Peralta, Carlos” Matriz(0, 1) = “Sa 08-11” Matriz(1, 1) = “Sa 14-17” Matriz(2, 1) = “Sa 08-11” Matriz(3, 1) = “Do 08-11” Matriz(4, 1) = “Sa 14-17” Matriz(5, 1) = “Sa 17-20” Matriz(0, 2) = “Castillo Peralta, Carlos” Matriz(1, 2) = “Linares Alarcon, Adams” Matriz(2, 2) = “Montes Tejada, Estela” Matriz(3, 2) = “Linares Alarcon, Adams” Matriz(4, 2) = “Córdoba Saavedra, Javier” Matriz(5, 2) = “Córdoba Saavedra, Javier” Matriz(0, 3) = “Sa 11-13” Matriz(1, 3) = “Do 08-10” Matriz(2, 3) = “Sa 11-13” Matriz(3, 3) = “Do 14-16” Matriz(4, 3) = “Sa 18-20” Matriz(5, 3) = “Do 08-10” End Sub Pág. 79 Private Sub CboCursos_Click() Dim P_TEORIA As String, H_TEORIA As String Dim P_LAB As String, H_LAB As String P_TEORIA = “Profesor de teoría: ” & _ Matriz(CboCursos.ListIndex, 0) H_TEORIA = “Horario de teoría: ” & _ Matriz(CboCursos.ListIndex, 1) P_LAB = “Jefe de práctica: ” & _ Matriz(CboCursos.ListIndex, 2) H_LAB = “Horario laboratorio: ” & _ Matriz(CboCursos.ListIndex, 3) TxtCurso = P_TEORIA & vbCrLf & H_TEORIA & vbCrLf & _ P_LAB & vbCrLf & H_LAB End Sub Private Sub CmdSalir_Click() End End Sub La constante vbCrLf es una combinación de retorno de carro y avance de línea, es equivalente a Chr(13) + Chr(10). Para este información en ejemplo en memoria RAM particular mediante el hemos uso almacenado de un bidimensional (Matriz). Pág. 80 la arreglo Cronómetro Un cronómetro sirve para controlar el tiempo transcurrido desde el inicio de una acción. Propiedad Descripción Interval Especifica el número de milisegundos que se esperará para disparar el evento Timer. El control Cronómetro responde al evento Timer, cuya descripción es: Evento Descripción Timer Ocurre cuando especificado el en número la de milisegundos propiedad Interval ha transcurrido. A manera de ejemplo vamos a desarrollar la siguiente aplicación que simula el funcionamiento de un reloj digital. Pág. 81 Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles sobre el formulario: 1 etiqueta 1 cuadro de texto 1 cronómetro 1 botón de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmReloj BorderStyle 3-Fixed Dialog Caption Reloj digital Label1 Nombre LblHora Caption Hora Nombre TxtHora Text1 Text Timer1 Nombre Timer1 Interval 500 Command1 Nombre CmdTerminar Caption &Terminar Pág. 82 Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub Form_Activate() TxtHora = Time() End Sub Private Sub Timer1_Timer() If TxtHora <> Time() Then TxtHora = Time() End If End Sub Private Sub CmdTerminar_Click() End End Sub Cuadro de imagen Un cuadro de imagen se utiliza para mostrar un archivo de imagen (BMP, GIF o JPG). Recorta el gráfico si el control no es lo bastante grande para mostrar la imagen completa. Propiedad AutoSize Descripción Especifica si automáticamente el su control tamaño para ajusta mostrar un gráfico completo. Picture Especifica el archivo de imagen para control. Pág. 83 el El evento que suele manejarse para este control es MouseMove, cuya descripción es: Evento Descripción MouseMove Ocurre cuando el usuario mueve el ratón sobre el control. Imagen Un control imagen se utilizará para mostrar un archivo de imagen (BMP, GIF o JPG) de manera similar a un Cuadro de imagen. Sin embargo, este control utiliza menos recursos del sistema y se actualiza con más rapidez que un cuadro de imagen. Propiedad Picture Descripción Especifica el archivo de imagen para el control. Stretch Especifica archivo como gráfico se ajusta para que el quepa tamaño del dentro del control imagen. Para este control también se suele manejar el evento MouseMove. Barras de desplazamiento horizontal Una barra de desplazamiento horizontal representa un valor entero, la cual tiene un cuadrado que se desplaza a lo largo de la misma para fijar un valor. Pág. 84 La posición más a la izquierda se corresponde con el valor mínimo, la posición más a la derecha con el valor máximo, y cualquier otra posición es un valor entre ellos dos. Propiedad Max Descripción Especifica el valor máximo que puede tomar la propiedad Value. Min Especifica el valor mínimo que puede tomar la propiedad Value. LargeChange Especifica en cuanto cambiará el valor de la propiedad Value cuando el usuario haga click antes o después del cuadrado de desplazamiento. SmallChange Especifica en cuanto cambiará el valor de la propiedad Value cuando el usuario haga click en alguna de las flechas de los extremos de la barra. Value Especifica el valor del control, este se encuentra siempre entre los valores de las propiedades Min y Max. Las barras de desplazamientos responden a los eventos: Evento Change Descripción Ocurre inmediatamente después que el cuadrado de desplazamiento ha sido movido. Scroll Ocurre mientras el cuadrado de desplazamiento está siendo movido (este evento sólo ocurre cuando el cuadrado es arrastrado). Barras de desplazamiento vertical Pág. 85 Una barra de desplazamiento vertical representa un valor entero, la cual tiene un cuadrado que se desplaza a lo largo de la misma para fijar un valor. La posición más hacia arriba se corresponde con el valor mínimo, la posición más hacia abajo se corresponde con el valor máximo, y cualquier otra posición es un valor entre ellos dos. Las propiedades y eventos de las barras de desplazamiento horizontal y vertical son análogas. Como ejemplo, vamos a construir una aplicación que permita cambiar el color de fondo de un cuadro de imagen, mediante tres barras de desplazamiento (rojo, verde y azul). Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 3 etiquetas Pág. 86 3 barras de desplazamiento horizontal 1 cuadro de imagen En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmColores BorderStyle 3-Fixed Dialog Caption Colores Label1 Nombre LblRojo Caption Rojo Label2 Nombre LblVerde Caption Verde Label3 Nombre LblAzul Caption Azul HScroll1 Nombre HSRojo LargeChange 10 Max 255 Min 0 SmallChange 1 Value 255 HScroll2 Pág. 87 Nombre HSVerde LargeChange 10 Max 255 Min 0 SmallChange 1 Value 0 HScroll3 Nombre HSAzul LargeChange 10 Max 255 Min 0 SmallChange 1 Value 0 Picture1 Nombre PicFondo BackColor &H000000FF& Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub HSRojo_Change() PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul) End Sub Private Sub HSVerde_Change() PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul) End Sub Private Sub HSAzul_Change() Pág. 88 PicFondo.BackColor = RGB(HSRojo, HSVerde, HSAzul) End Sub En el código anterior se debió colocar HSRojo.Value, HSVerde.Value y HSAzul.Value, pero debido a que la propiedad Value es por defecto se puede omitir. Cuadro de lista de unidades Un cuadro de lista de unidades permite al usuario seleccionar una unidad de disco válida en tiempo de ejecución. Utilice este control para presentar una lista de todas las unidades válidas del sistema. Propiedad Drive Descripción Especifica la unidad seleccionada en tiempo de ejecución. Este control responde al evento Change, cuya descripción es la siguiente: Evento Change Descripción Ocurre cuando el usuario hace click sobre la unidad Change que desea también seleccionar. ocurre si se El evento selecciona unidad mediante el teclado. Cuadro de lista de directorios Pág. 89 la Un cuadro de lista de directorios muestra directorios y rutas de acceso en tiempo de ejecución. Utilice este control para mostrar una lista jerárquica de directorios. Propiedad Descripción Path Especifica la ruta de acceso actual. Un cuadro de lista de directorios también responde al evento Change. Cuadro de lista de archivos Un cuadro de lista de archivos encuentra y muestra los archivos del directorio especificado por la propiedad Path en tiempo de ejecución. Utilice este control para mostrar una lista de los archivos seleccionados por tipo. Propiedad Descripción Path Especifica la ruta de acceso actual. Pattern Especifica el tipo de archivo que se desea visualizar en el control. List Devuelve los elementos contenidos en la parte de lista del control. ListIndex Especifica el índice del elemento seleccionado actualmente en el control. Como ejemplo vamos a desarrollar una aplicación que permita el manejo de unidades, carpetas y archivos. El usuario Pág. 90 puede seleccionar la unidad actual de trabajo, la carpeta y el archivo y poder visualizar su contenido (en este caso archivos gráficos *.JPG). Para el desarrollo de la presente aplicación proceda a ubicar los siguientes controles en el formulario: 4 etiquetas 1 cuadro de lista de unidades 1 cuadro de lista de directorios 1 cuadro de lista de archivos 1 imagen En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmVisor Caption Visor Pág. 91 Label1 Nombre LblUnidad Caption Unidad Label2 Nombre LblCarpeta Caption Carpeta Label3 Nombre LblArchivo Caption Archivo Label4 Nombre LblVista Caption Vista previa Drive1 Nombre Drive1 Nombre Dir1 Nombre File1 Pattern *.JPG Dir1 File1 Image1 Nombre ImgVista Stretch True Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub Drive1_Change() Pág. 92 On Error GoTo DRIVE_ERROR Dir1.Path = Drive1.Drive Exit Sub DRIVE_ERROR: MsgBox “ERROR: Unidad no preparada”, vbCritical, “Error” Exit Sub End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub File1_Click() Dim ARCHIVO As String ARCHIVO = File1.Path & “\” ARCHIVO = ARCHIVO & File1.List(File1.ListIndex) ImgVista.Picture = LoadPicture(ARCHIVO) End Sub La instrucción On Error activa una rutina de control de errores y especifica la ubicación de la misma en un procedimiento. LA FUNCIÓN MSGBOX A menudo habrá situaciones en las cuales tendrá que presentar algún mensaje (por ejemplo una pregunta) y en función Pág. 93 de la respuesta del usuario se ejecutará una determinada acción. La función MsgBox() muestra un cuadro de diálogo predefinido y retorna un valor de tipo entero dependiendo del botón seleccionado por el usuario. Su sintaxis es de la siguiente forma: VALOR = MsgBox(MENSAJE [, BOTÓN + ICONO, TÍTULO]) Donde MENSAJE se refiere a una expresión de cadena que se muestra como mensaje en el cuadro de diálogo. BOTÓN es una expresión numérica que se refiere al tipo y cantidad de botones a utilizar. ICONO es una expresión numérica que se refiere al estilo de icono que se va ha utilizar. TÍTULO es una texto que se mostrará en la barra de título de la caja de diálogo. Tipo de botón Valor 0 Botón Aceptar Nombre vbOKOnly Pág. 94 1 Aceptar y Cancelar vbOKCancel 2 Anular, Reintentar, Ignorar vbAbortRetryIgnore 3 Sí, No y Cancelar vbYesNoCancel 4 Sí y No vbYesNo 5 Reintentar y Cancelar vbRetryCancel Tipo de icono Valor Icono Nombre 16 Mensaje crítico vbCritical 32 Signo de interrogación vbQuestion 48 Signo de exclamación vbExclamation 64 Signo de información vbInformation Valores retornados Valor Botón Nombre 1 Aceptar vbOK 2 Cancelar vbCancel 3 Anular vbAbort 4 Reintentar vbRetry 5 Ignorar vbIgnore 6 Sí vbYes 7 No vbNo Como ejemplo vamos a construir un formulario que presente un botón “Salir”, de tal forma que cuando el usuario pulse dicho botón se presente el siguiente mensaje: Pág. 95 En caso de que el usuario elija la opción “Sí”, la aplicación debe terminar. En caso contrario, es decir si el usuario elige la opción “No”, se debe proseguir con la aplicación. Para el desarrollo del presente ejemplo, proceda a ubicar sobre el formulario un botón de comando (CmdSalir), a continuación ingresar el siguiente código: Private Sub CmdSalir_Click() Dim RESP As Integer RESP = MsgBox(“Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Pregunta”) If RESP = vbYes Then End End If End Sub Para ilustrar mejor el uso de la función MsgBox() vamos a desarrollar la siguiente aplicación que permite mostrar los diferentes tipos de botones e iconos generados por la función. Pág. 96 Para ello proceda a ubicar los siguientes controles en el formulario: 2 cuadros de lista 1 botón de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmFuncionMsgBox BorderStyle 3-Fixed Dialog Caption Función MsgBox Nombre LstBoton Nombre LstIcono List1 List2 Command1 Pág. 97 Nombre CmdMensaje Caption &Mensaje Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub Form_Load() LstBoton.AddItem “Aceptar” LstBoton.AddItem “Aceptar y Cancelar” LstBoton.AddItem “Anular, Reintentar, Ignorar” LstBoton.AddItem “Sí, No y Cancelar” LstBoton.AddItem “Sí y No” LstBoton.AddItem “Reintentar y Cancelar” LstIcono.AddItem “Mensaje crítico” LstIcono.AddItem “Signo de interrogación” LstIcono.AddItem “Signo de exclamación” LstIcono.AddItem “Signo de información” End Sub Private Sub CmdMensaje_Click() Dim RESP As Integer, BOTON As Integer, ICONO As Integer BOTON = LstBoton.ListIndex ICONO = (LstIcono.ListIndex + 1) * 16 RESP = MsgBox(“Hola Mundo”, BOTON + ICONO, “Ejemplo”) End Sub Pág. 98 CAPÍTULO 5 EL FORMULARIO Un formulario es un objeto contenedor que sirve para diseñar la interfaz de usuario. En el formulario se colocan los controles para que el usuario pueda interactuar con la aplicación de una manera fácil e intuitiva. Los formularios tienen sus propias propiedades, eventos métodos con los que se puede controlar su apariencia y y comportamiento, muchos de los cuales ya han sido utilizados en las aplicaciones de los capítulos anteriores y continuación pasamos a describir. Pág. 99 que a Propiedad AutoRedraw Descripción Especifica si se activa el redibujado automático del formulario. BackColor Especifica el color de fondo del formulario. BorderStyle Especifica un estilo de borde para el formulario. Caption Especifica el texto que se muestra en la barra de título del formulario. ControlBox Especifica si aparece un icono de menú desplegable en el ángulo superior izquierdo del formulario. ForeColor Especifica el color de primer plano utilizado para mostrar texto sobre el formulario. Height Especifica el alto del formulario. Se mide en “twips”. Icon Especifica el icono que se muestra para un formulario. MaxButton Especifica si el formulario tiene un botón Maximizar. MinButton Especifica si el formulario tiene un botón Minimizar. Picture Especifica el archivo de imagen que se va ha mostrar como fondo para el formulario. StartUpPosition Especifica la posición del formulario la primera vez que se ejecuta. Visible Establece si el formulario es visible o está oculto. Width Especifica el ancho del formulario. Se mide en “twips”. WindowState Establece el estado del formulario (normal, minimizado o maximizado). Pág. 100 Nota Un twip es una unidad independiente de la pantalla utilizada para asegurar que la colocación y la proporción de los elementos de la pantalla de la aplicación son los mismos en todos los sistemas de pantallas. Un twip es igual a 1/20 de un punto de impresora. Existen aproximadamente 1440 twips en una pulgada o 567 twips en un centímetro. Los eventos a los que responde un formulario son los siguientes: Evento Activate Descripción Ocurre cuando el formulario se convierte en ventana activa. Deactivate Ocurre cuando el formulario deja de ser la ventana activa. Load Ocurre cuando el formulario se carga en la memoria. MouseDown Ocurre cuando el usuario pulsa el botón derecho del ratón sobre el formulario. QueryUnload Ocurre descarga antes del de iniciarse formulario el (antes proceso del de evento Unload). Resize Ocurre cuando se muestra primero el formulario o se cambian sus dimensiones. Unload Ocurre cuando el formulario se descarga de la memoria. Pág. 101 Los métodos que se pueden utilizar con un formulario son los siguientes: Método Descripción Hide Oculta un formulario. PopupMenu Presenta un menú popup en la posición actual del ratón. Print Imprime un valor sobre el formulario. Refresh Vuelve a pintar un formulario y actualiza todos los valores contenidos en él. Show Muestra un formulario y determina si es modal o carece de modo. Si el formulario a mostrar no está cargado Visual Basic lo carga automáticamente. Como ejemplo vamos a desarrollar una aplicación que utilice dos formularios. Desde el primer formulario el usuario podrá ir al segundo formulario y viceversa. Pág. 102 Para el desarrollo de la presente aplicación proceda a crear un nuevo proyecto. Seguidamente debe ubicar dos botones de comando en el formulario. Luego establezca las siguientes propiedades: Form1 Nombre Form1 Caption Primer formulario Command1 Nombre CmdIr Caption &Ir Command2 Nombre CmdSalir Caption &Salir Seguidamente procede a ingresar el código que se muestra a continuación: Private Sub CmdIr_Click() Form2.Show Form1.Hide End Sub Private Sub CmdSalir_Click() End End Sub Pág. 103 Luego debe añadir un formulario adicional al proyecto. Para tal fin, seleccione el menú Proyecto y elija la opción Agregar formulario. Del cuadro de diálogo que se presenta elija el icono Formulario y haga click en el botón “Abrir”, tal como se indica en la figura. En ese instante se añadirá un nuevo formulario al proyecto. Luego, proceda a ubicar un botón de comandos en el formulario que acaba de añadir y establezca las siguientes propiedades: Form2 Nombre Form2 Caption Segundo formulario ControlBox False Pág. 104 Command2 Nombre CmdVolver Caption &Volver En seguida proceda a ingresar el código que se indica a continuación: Private Sub CmdVolver_Click() Form1.Show Form2.Hide End Sub ESTILOS DE FORMULARIO Visual Basic cuenta con seis diferentes estilos de formulario, cuya descripción es la siguiente: Valor Estilo Descripción 0 None No presenta ningún borde. 1 Fixed Single Puede incluir un Menú de control, una Barra Maximizar Sólo de y un puede mediante título botón cambiar los botones , un botón Minimizar. de tamaño Maximizar y Minimizar. 2 Sizable (Predeterminado). Puede cambiar de tamaño mediante cualquiera de los elementos opcionales de indicados para Fixed Single. Pág. 105 borde Valor 3 Estilo Fixed Dialog Descripción Puede incluir un Menú de control y una Barra de título, pero no los botones Maximizar ni Minimizar. No puede cambiar de tamaño. 4 Fixed ToolWindow Sólo muestra el botón Cerrar y el texto de la barra de título aparece con un tamaño de fuente reducido. No puede cambiar su tamaño. 5 Sizable ToolWindow Sólo muestra el botón Cerrar y el texto de la barra de título aparece con un tamaño de fuente reducido. Puede cambiar de tamaño. Como ejemplo vamos a desarrollar una aplicación que permita representar los diferentes estilos de formulario de Visual Basic. Pág. 106 Para el desarrollo de la presente aplicación proceda a crear un nuevo proyecto y luego ubique los siguientes controles en el formulario: 1 cuadro de lista 2 botones de comando Luego debe establecer las propiedades que se indican a continuación: Form1 Nombre FrmPrincipal Caption Estilos de formulario BorderStyle 3-Fixed Dialog Nombre LstTipoForm List 0-None List1 1-Fixed Single 2-Sizable 3-Fixed Dialog 4-Fixed ToolWindow 5-Sizable ToolWindow Command1 Nombre CmdMostrar Caption &Mostrar Command2 Nombre CmdSalir Caption &Salir Pág. 107 Seguidamente procede a ingresar el código que se muestra a continuación: Private Sub Form_Load() Load FrmNone Load FrmFixedSingle Load FrmSizable Load FrmFixedDialog Load FrmFixedToolWindow Load FrmSizableToolWindow End Sub Private Sub CmdMostrar_Click() Dim OP As Integer OP = LstTipoForm.ListIndex Select Case OP Case 0 : FrmNone.Show vbModal Case 1 : FrmFixedSingle.Show vbModal Case 2 : FrmSizable.Show vbModal Case 3 : FrmFixedDialog.Show vbModal Case 4 : FrmFixedToolWindow.Show vbModal Case 5 : FrmSizableToolWindow.Show vbModal Case Else MsgBox “Debe seleccionar estilo de formulario” End Select End Sub Pág. 108 Private Sub LstTipoForm_DblClick() Call CmdMostrar_Click End Sub Private Sub CmdSalir_Click() End End Sub Seguidamente proceda a añadir los formularios para las diferentes opciones del cuadro de lista. Cambie los nombres de los formularios según se indica: Formulario Nombre Form2 FrmNone Form3 FrmFixedSingle Form4 FrmSizable Form5 FrmFixedDialog Form6 FrmFixedToolWindow Form7 FrmSizableToolWindow Luego debe activar el formulario FrmNone, ubicar un botón de comandos sobre el mismo y establecer las siguientes propiedades: Form2 Nombre FrmNone BorderStyle 0-None Caption None Pág. 109 Command1 Nombre CmdVolver Caption &Volver Una vez establecidas las propiedades, proceda a ingresar el código que se muestra a continuación: Private Sub CmdVolver_Click() Unload Me End Sub Para concluir con el diseño de la aplicación, simplemente repita el procedimiento anterior para los demás tipos de formularios. Como mediante habrá el podido método observar, Show podemos al mostrar hacerlo de un formulario forma modal (vbModal) o no modal (opción por defecto). Un formulario modal es aquel que necesita cerrarse antes de pasar el enfoque a otro formulario. Un formulario no modal no requiere cerrarse para pasar el enfoque a otro formulario. PASANDO VALORES ENTRE FORMULARIOS Muchas veces se requieren pasar valores de un formulario a otro, esto se puede realizar mediante el uso módulos estándar, los cuales son contenedores de procedimientos y declaraciones a los que tienen acceso otros módulos de la aplicación. Pág. 110 Como ejemplo vamos a construir la siguiente aplicación, la cual envía un mensaje de texto del primer formulario hacia el segundo formulario. Para el desarrollo de la presente aplicación proceda a crear un nuevo proyecto y añada un formulario adicional, de tal forma que tenga los formularios Form1 y Form2. Seguidamente ubicar los siguientes controles: Form1 Form2 Text1 TxtMensaje1 Text1 TxtMensaje2 Command1 CmdEnviar Command1 CmdRecibir Command2 CmdSalir Command2 CmdVolver A continuación proceda a ingresar el código que se indica para el primer formulario (Form1): Pág. 111 Private Sub CmdEnviar_Click() Mensaje = TxtMensaje1 Form1.Hide Form2.Show End Sub Private Sub CmdSalir_Click() End End Sub Para el segundo formulario (Form2) proceda a ingresar el código siguiente: Private Sub CmdRecibir_Click() TxtMensaje2 = Mensaje End Sub Private Sub CmdVolver_Click() Form2.Hide Form1.Show End Sub Seguidamente debe añadir un módulo estándar al proyecto, para ello, seleccione el Menú Proyecto y elija la opción Agregar módulo, se debe presentar un cuadro de diálogo similar a la figura mostrada, en el cual debe dar click en el botón “Abrir”. Pág. 112 Seguidamente proceda a declarar la variable Mensaje como “pública” en la sección de declaraciones del módulo que acaba de añadir: Una variable pública (Public) es una variable que se declara a nivel de módulo y se le puede acceder desde cualquier otro módulo. Pág. 113 FORMULARIOS MDI Un formulario MDI (Interfaz de Documentos Múltiples) es una ventana que actúa como fondo de una aplicación y es el contenedor (ventana padre) de otros formularios (ventanas hijas). En una aplicación MDI pueden haber varias ventanas hijas, pero sólo ventana una actúe ventana como padre hija debe por aplicación. tener su Para propiedad que una MDIChild establecida a True. Como ejemplo vamos a desarrollar una aplicación MDI que incluya tres ventanas hijas. Para tal fin proceda a crear un nuevo proyecto y seguidamente agregar dos formularios (simples) al mismo. Pág. 114 No olvide establecer la propiedad MDIChild de los formularios Form1, Form2 y Form3 a True. Luego, debemos agregar el formulario MDI, para ello acceder al Menú Proyecto y elegir la opción Agregar formulario MDI, del cuadro de diálogo que se presenta hacer click en el botón “Abrir”. A continuación dar doble click sobre el formulario MDI e ingresar el siguiente código: Private Sub MDIForm_Load() Form1.Show Form2.Show Form3.Show End Sub Pág. 115 Ahora sólo tiene que indicarle a Visual Basic que el formulario de arranque (inicial) será el formulario MDI. Para ello vaya al Menú Proyecto y elija la opción Propiedades de Proyecto. En el cuadro combinado “Objeto inicial” seleccionar MDIForm1, tal como se indica en la figura: Eso es todo, ahora simplemente tiene que ejecutar su aplicación. Cabe destacar que en los formularios MDI por lo general no se pueden incluir controles, debido a ello se suele trabajar con menús de opciones o barras de herramientas para indicar alguna acción a realizar. Pág. 116 CREACIÓN DE MENÚS Un menú es un conjunto de opciones que se presentan al usuario, entre las cuales debe elegir una de ellas. Dependiendo de la decisión se realizarán una serie de acciones. Para diseñar un menú cualquiera dar click derecho sobre el formulario y del menú emergente que se presenta elegir opción Editor de menús. Pág. 117 la En seguida se ha de presentar el Editor de menús de Visual Basic. Para crear un menú, tener en cuenta los siguiente procedimientos: • Ingresar el Editor de menús. • Introducir el título del menú en el cuadro de texto Caption, el cual aparecerá en la barra de menús. • Introducir un nombre para el menú en el cuadro de texto Name, el cual será utilizado en el código para referirse al menú. • Introducir los elementos que componen el menú, para ello escriba en los cuadros de texto Caption y Name el título y el nombre del correspondiente elemento del menú. Pág. 118 • Para diferenciar un elemento del menú del propio menú, hay que sangrar el título del elemento, para tal fin, selecciónelo y haga click en el botón flecha hacia la derecha ( ). • Un elemento de menú puede ser una orden (si el elemento siguiente aparece sangrado al mismo nivel) o un submenú (si el elemento siguiente aparece sangrado un nivel más). • Utilizando separadores puede agrupar las órdenes en función de lo que realizan. Para insertar un separador, escriba un único guión (-) en el cuadro Caption del Editor de menús. Tiene que especificar también un nombre para el separador. • Para añadir un acelerador (una tecla o combinación de teclas que permiten activar un menú), utilizar la propiedad Shortcut. • La propiedad Checked es útil para indicar si una orden está activa o no lo está. Cuando se especifica esta propiedad aparece una marca (3) a la izquierda del elemento de menú. • La propiedad Enabled es útil para desactivar una orden en un momento en el cual no tiene sentido que esté activa. • La propiedad Visible es útil cuando durante la ejecución se desea ocultar un elemento de menú. • Cerrar el Editor de menús, para ello una vez que finalizado su diseño pulse el botón “Aceptar”. Pág. 119 haya Como ejercicio intente construir el menú mostrado en la figura anterior. Caption Name ShortCut &Archivo MnuArchivo Ninguno . . . &Artículo MnuArchivoArticulo Ninguno . . . &Cliente MnuArchivoCliente Ninguno . . . &Vendedor MnuArchivoVendedor Ninguno . . . - MnuArchivoLinea Ninguno . . . &Salir MnuArchivoSalir Ctrl + X &Proceso MnuProceso Ninguno . . . &Pedido MnuProcesoPedido Ninguno . . . &Facturación MnuProcesoFacturacion Ninguno &Reporte MnuReporte Ninguno . . . &Registro de ventas MnuReporteRegVentas Ninguno Ninguno . . . Catálogo de &artículos . . . - MnuReporteLinea Ninguno . . . &Cliente del mes MnuReporteClienteMes Ninguno . . . &Vendedor del mes MnuReporteVendMes Ninguno Ay&uda MnuAyuda Ninguno . . . &Contenido MnuAyudaContenido Ninguno . . . &Indice MnuAyudaIndice Ninguno . . . &Búsqueda MnuAyudaBusqueda Ninguno . . . - MnuAyudaLinea Ninguno . . . &Acerca de MnuAyudaAbout Ninguno Pág. 120 Para probar el menú que acaba de crear, ingrese siguiente código: Private Sub MnuArchivoArticulo_Click() MsgBox “Seleccionó la opción Artículo” End Sub Private Sub MnuArchivoCliente_Click() MsgBox “Seleccionó la opción Cliente” End Sub Private Sub MnuArchivoVendedor_Click() MsgBox “Seleccionó la opción Vendedor” End Sub Private Sub MnuArchivoSalir_Click() Unload Me End Sub Private Sub MDIForm_Unload(Cancel As Integer) Dim RESP As Integer RESP = MsgBox(“¿Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Pregunta”) If RESP = vbYes Then End Else: Cancel = True End If End Sub Pág. 121 el Luego al ejecutar su aplicación y seleccionar el menú Archivo, opción Artículo, el resultado será similar a la figura mostrada: Hasta ahora hemos programado la salida de una aplicación, asociando el código al botón “Salir”. Sin embargo, cuando el usuario hace click en el botón “Cerrar” de la barra de título o en la opción “Salir” del Menú de control del formulario, el código escrito para el botón “Salir” es ignorado. Para remediar esta situación, en el ejemplo anterior cuando el usuario pulsa el botón “Salir”, se invoca al evento Unload. La referirse palabra al reservada formulario “Me” desde proporciona donde se está una forma de ejecutando el código. Recordar desencadena que cuando el el evento Unload usuario intenta del formulario cerrar el se formulario mediante cualquiera de las formas descritas anteriormente. Para utilice el determinar parámetro si ocurre Cancel. Si la descarga Cancel es del False formulario ocurre la descarga, si Cancel es True impide que el formulario se quite. CREACIÓN DE UNA BARRA DE HERRAMIENTAS Pág. 122 Una opciones barra más de herramientas utilizadas de un contiene menú, de botones tal manera con que las el usuario haciendo click en dicho control activaría la opción indicada de una manera más rápida. Para crear una barra de herramientas debemos utilizar dos controles que no están en la lista de controles estándar, por tanto debemos agregar dichos controles que se encuentran en el componente Microsoft Windows Common Controls 6.0, tal como se indica a continuación: Pág. 123 Como ejemplo, vamos a crear la barra de herramientas de la figura mostrada: Para ello, ubicar un control ImageList sobre el formulario, para establecer sus propiedades dar click derecho sobre el control y elija la opción Propiedades. Pág. 124 Se ha de presentar un cuadro de diálogo similar a la figura mostrada: Activar la ficha Imágenes y pulsar el botón “Insertar imagen” para seleccionar las imágenes que se incluirán en el control ImageList. Para el corresponden ejemplo, a cada uno debe de incluir los ocho botones de imágenes la barra que de herramientas. Concluido el proceso anterior, proceda a ubicar un control Toolbar sobre el formulario. Luego hacer click derecho sobre dicho control y del menú emergente que se presenta seleccionar la opción Propiedades. Del cuadro de diálogo que se presenta en la ficha General establecer las siguientes propiedades: Pág. 125 Luego, en la ficha Botones pulse el botón “Insertar botón”. En el cuadro de texto Image se debe indicar un número que corresponde al orden de imagen a mostrar. Pág. 126 El lector debe continuar con este proceso hasta completar los botones restantes, según: Index ToolTipText Image 1 Artículo 1 2 Cliente 2 3 Vendedor 3 4 Pedido 4 5 Facturación 5 6 Registro de ventas 6 7 Catálogo de artículos 7 8 Ayuda 8 Como el código a ejecutar tiene que ser el mismo cuando el usuario elija una opción del menú o de un click sobre un botón de la barra de herramientas se pueden programar procedimientos de usuario que realicen dichas tareas, luego se deben invocar a estos procedimientos tanto para las opciones del menú como para la barra de herramientas. Sin embargo, para el ejemplo el código es muy sencillo, ya que sólo muestra un mensaje con la opción seleccionada (esto por razones de simplicidad). Para probar la funcionalidad de la barra de herramientas que acaba de crear ingrese el siguiente código: Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Pág. 127 Select Case Button.Index Case 1: MsgBox “Seleccionó la opción Artículo” Case 2: MsgBox “Seleccionó la opción Cliente” Case 3: MsgBox “Seleccionó la opción Vendedor” Case 4: MsgBox “Seleccionó la opción Pedido” Case 5: MsgBox “Seleccionó la opción Facturación” Case 6: MsgBox “Seleccionó la opción Registro de ventas” Case 7: MsgBox “Seleccionó opción Catálogo de artículos” Case 8: MsgBox “Seleccionó la opción Ayuda” End Select End Sub El evento ButtonClick se dispara cuando el usuario hace click sobre un botón de la barra de herramientas. La propiedad Index permite identificar el número de botón pulsado. CREACIÓN DE UNA BARRA DE ESTADO Una barra de estado es un marco que se ubica en la parte inferior del formulario y puede contener varios paneles que informan al usuario acerca del estado de la aplicación. Para crear una barra de estado utilizar el control StatusBar, el cual forma de los controles personalizados que se encuentran en el componente Microsoft Windows Common Controls 6.0. Como ejemplo vamos a crear una barra de estado similar a la de la figura mostrada: Pág. 128 Para ello ubicar un control StatusBar sobre el formulario, dar click derecho sobre el mismo y en la ficha Paneles incluir una imagen para la hora del sistema. Pág. 129 El resto de propiedades se establecerán mediante código al momento de la carga del formulario. Private Sub MDIForm_Load() Dim I As Integer For I = 1 To 2 StatusBar1.Panels.Add ' Se agregan 2 paneles más Next With StatusBar1.Panels .Item(1).Style = sbrTime .Item(2).Style = sbrCaps .Item(3).Style = sbrIns End With End Sub La propiedad Style permite mostrar el estado de las teclas, la hora y la fecha del sistema con un mínimo de código. Constante Valor Descripción sbrText 0 (Predeterminado). Texto o mapa de bits. sbrCaps 1 Tecla BLOQ MAYÚS. sbrNum 2 Tecla BLOQ NÚM. sbrIns 3 Tecla INS. sbrScrl 4 Tecla BLOQ DESPL. sbrTime 5 Muestra la hora actual con el formato del sistema. sbrDate 6 Muestra la fecha actual con el formato del sistema. Pág. 130 CREACIÓN DE UN MENÚ CONTEXTUAL Un menú contextual es un menú emergente (flotante) que se muestra sobre un formulario, independiente de la barra de menús. Para mostrar un menú contextual el usuario debe pulsar el botón derecho del ratón sobre el formulario. A menudo querrá usar un menú contextual para tener acceso a opciones que no se encuentran disponibles en la barra de menús. Para crear un menú que no se presente en la barra de menús, haga invisible un elemento de menú de nivel superior en tiempo de diseño (asegúrese de que la casilla de verificación Visible del Editor de menús no esté activada). Cuando Visual Basic presenta un menú emergente, pasa por alto la propiedad Visible del menú de nivel superior especificado. Pág. 131 Para crear el menú contextual de la figura, debe ingresar al Editor de menús y añadir lo siguiente: Caption Name Visible &Herramientas MnuTools . . . Calculadora MnuToolsCalc 3 . . . Calendario MnuToolsCalen 3 . . . Solitario MnuToolsSol 3 Seguidamente proceda a ingresar el código que se indica a continuación: Private Sub MDIForm_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbRightButton Then PopupMenu MnuTools End If End Sub Private Sub MnuToolsCalc_Click() Dim I I = Shell(“C:\WINDOWS\CALC.EXE”, 1) End Sub Private Sub MnuToolsCalen_Click() FrmCalendario.Show End Sub Pág. 132 Private Sub MnuToolsSol_Click() Dim I I = Shell(“C:\WINDOWS\SOL.EXE”, 1) End Sub En el ejemplo anterior se asume que existe otro formulario de nombre FrmCalendario. Este puede ser construido usando el control MonthView. La función Shell ejecuta un programa ejecutable y devuelve un tipo Variant (Double) que representa la identificación de la tarea del programa si se ha ejecutado con éxito, en contrario devuelve cero. Pág. 133 caso CAPÍTULO 6 CONTROLES ACTIVEX Los controles ActiveX son objetos que no forman parte del conjunto de controles estándar de Visual Basic, sino más bien han sido desarrollados por terceras personas. Los controles ActiveX existen como archivos independientes con extensión .OCX y deben ser cargados antes de utilizarse. Para ello ingresar al Menú Proyecto y elija la Componentes. Pág. 134 opción CONTROL ANIMATION El control Animation permite reproducir archivos de extensión .AVI que no tengan sonido para crear animaciones. Para agregar este control debe seleccionar el componente Microsoft Windows Common Controls-2 6.0. Propiedad AutoPlay Descripción Especifica si el archivo AVI se reproducirá automáticamente al cargarse el control. Método Descripción Close Cierra el archivo AVI abierto actualmente. Open Permite abrir el archivo AVI. Play Reproduce el archivo AVI en el control Animation. Stop Termina la reproducción del archivo AVI. Como ejemplo vamos a desarrollar un formulario que permita reproducir un archivo AVI, tal como se muestra en la figura: Pág. 135 Para ello crear un nuevo formulario y agregar un control Animation (Animation1) y dos botones de comando (CmdIniciar y CmdTerminar, respectivamente). Luego ingrese el código que se muestra: Private Sub CmdIniciar_Click() Dim RUTA As String RUTA = “C:\Archivos de programa\Microsoft Visual Studio\” RUTA = RUTA & “Common\Graphics\Videos\Filenuke.avi” Animation1.Open (RUTA) Animation1.Play End Sub Private Sub CmdTerminar_Click() Animation1.Close End End Sub CONTROL COMMONDIALOG El control CommonDialog proporciona un conjunto de cuadros de diálogo estándar que permiten realizar las operaciones más comúnmente empleadas en el diseño de aplicaciones, como abrir y guardar archivos, seleccionar colores y fuentes, imprimir, etc. Para agregar este control seleccionar el componente Microsoft Common Dialog Control 6.0. Pág. 136 Propiedad Descripción Color Especifica el color seleccionado. FileName Especifica la ruta y nombre del archivo seleccionado. Filter Especifica el tipo de archivos que se han de mostrar en un cuadro de diálogo Abrir o Guardar como. FilterIndex Especifica el filtro predeterminado para un cuadro de diálogo Abrir o Guardar como, en caso se esté utilizando varios filtros. Método Descripción ShowColor Presenta la paleta de colores. ShowFont Presenta el cuadro de diálogo Fuentes. ShowHelp Presenta la ayuda de Windows. ShowOpen Presenta el cuadro de diálogo Abrir. ShowPrinter Presenta el cuadro de diálogo Imprimir. ShowSave Presenta el cuadro de diálogo Guardar como. Como ejemplo vamos a desarrollar una aplicación que permite cambiar el color de fondo de un formulario en tiempo de ejecución. Para ello el usuario debe dar click en el botón “Cambiar color” y en seguida se presentará la paleta de colores de donde debe elegir el color deseado, tal como se muestra en la figura siguiente: Pág. 137 Para ello crear un nuevo formulario, agregarle un botón de comando (CmdCambiarColor) y un control CommonDialog. Luego ingresar el siguiente código: Private Sub CmdCambiarColor_Click() CommonDialog1.ShowColor Form1.BackColor = CommonDialog1.Color End Sub Como siguiente ejemplo vamos a desarrollar una aplicación que permita mostrar el contenido de un archivo JPG. Este deberá ser seleccionado por el usuario de un cuadro de diálogo Abrir, tal como se indica en la figura: Pág. 138 Al hacer click en el botón “Abrir”, el archivo seleccionado debe ser mostrado en el formulario: Para el diseño de esta aplicación crear un nuevo formulario y ubicar un botón de comando (CmdAbrirArchivo), un control imagen y un control CommonDialog. Pág. 139 Seguidamente ingrese el código que se indica a continuación: Private Sub CmdAbrirArchivo_Click() Dim FILTRO As String, FILE As String FILTRO = “Imágenes JPEG (*.JPG)|*.JPG” CommonDialog1.Filter = FILTRO CommonDialog1.ShowOpen FILE = CommonDialog1.FileName Image1.Picture = LoadPicture(FILE) End Sub CONTROL MARCHOSO El control Marchoso tiene como función reproducir archivos GIF animados. Para agregar este control seleccionar el componente Marchoso ActiveX Control Module. Este control fue creado en Visual Basic y si no lo tiene en su disco duro lo puede bajar de Internet. Propiedad FileName Descripción Especifica la ruta y nombre del archivo GIF animado. A manera de ejemplo vamos a diseñar un formulario que permita mostrar archivos GIF animados. Pág. 140 Para ello proceda a crear un nuevo formulario y ubicar un botón de comando (CmdVerGIFAnimado), un control Marchoso y un control CommonDialog. Luego, ingresar el siguiente código: Private Sub CmdVerGIFAnimado_Click() Dim FILTRO As String, FILE As String FILTRO = “Archivos GIF Animados (*.GIF)|*.GIF” CommonDialog1.Filter = FILTRO CommonDialog1.ShowOpen FILE = CommonDialog1.FileName Marchoso1.FileName = FILE End Sub CONTROL HIERARCHICAL FLEXGRID El control Hierarchical FlexGrid presenta una cuadrícula la cual permite mostrar datos en forma de celdas. Una celda es la región formada por la intersección de una fila columna. Pág. 141 y una Para agregar este control debe seleccionar el componente Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB). Propiedad Col Descripción Especifica el número de columna de la celda actual. Cols Especifica el número total de columnas, fijas y no fijas. FixedCols Especifica el número de columnas fijas. El valor por defecto es 1. FixedRows Especifica el número de filas fijas. El valor por defecto es 1. Row Especifica el número de fila de la celda actual. Rows Especifica el número total de filas, fijas y no fijas. Text Especifica el contenido de la celda actual. TextArray Especifica el contenido de una celda elegida aleatoriamente, se debe especificar el índice de la celda a la cual se desea acceder. ScrollBars Especifica si la cuadrícula presenta barras de desplazamiento horizontales, verticales o ambas a la vez. Como ejemplo vamos a desarrollar una visualice un cuadrado mágico de orden impar aplicación que N . Un cuadrado mágico se compone de números enteros comprendidos entre 1 y N 2 . La suma de los números que figuran en cada fila, cada columna y cada diagonal son idénticos. Pág. 142 N = 5 tenemos el siguiente arreglo de Por ejemplo para números: Un método de construcción del cuadrado consiste en situar el número 1 en el centro de la primera fila, el número siguiente en la casilla situada encima y a la derecha, y así sucesivamente. Es preciso considerar que el cuadrado se cierra sobre sí mismo, la fila encima de la primera es de hecho la última y la columna a la derecha de la última es la primera. Sin embargo, cuando la posición del número caiga en una celda ocupada, se elige la casilla situada por debajo del número que acaba de ser situado. Para el desarrollo de la presente aplicación proceda a crear un nuevo formulario y ubicar una etiqueta (N?), un cuadro de texto (TxtN) y un control Hierarchical FlexGrid. Seguidamente debe ingresar el código que se indica: Private Sub TxtN_Change() Pág. 143 Dim N As Integer, I As Integer Dim FIL As Integer, COL As Integer N = Val(TxtN) FIL = 1 COL = (N \ 2) + 1 MSHFlexGrid1.Cols = N MSHFlexGrid1.Rows = N MSHFlexGrid1.FixedCols = 0 MSHFlexGrid1.FixedRows = 0 For I = 1 To N ^ 2 MSHFlexGrid1.COL = COL - 1 MSHFlexGrid1.Row = FIL - 1 MSHFlexGrid1.Text = Str(I) If I Mod N = 0 Then FIL = FIL + 1 If FIL = N + 1 Then FIL = 1 Else FIL = FIL - 1 If FIL = 0 Then FIL = N COL = COL + 1 If COL = N + 1 Then COL = 1 End If Next End Sub CONTROL UPDOWN Pág. 144 El control UpDown tiene dos botones con flechas en los que el usuario puede hacer clic para incrementar o disminuir un valor de un control asociado, denominado control auxiliar. A menudo, al usuario le parecerá que el control UpDown y su control auxiliar son un único control. Por lo general se usa un control UpDown con un cuadro de texto para solicitar al usuario una entrada numérica, una combinación que en ocasiones se seleccionar el denomina control Spinner. Para agregar un control UpDown debe componente Microsoft Windows Common Controls-2 6.0. Propiedad BuddyControl Descripción Especifica el control utilizado como la propiedad utilizada para auxiliar. BuddyProperty Especifica sincronizar el control UpDown con su auxiliar. Increment Especifica un valor que determina la cantidad en que varía la propiedad Value cuando se hace click en los botones del control UpDown. Max Especifica el valor máximo del intervalo de desplazamiento del control UpDown. Min Especifica el valor mínimo del intervalo de desplazamiento del control UpDown. SyncBuddy Especifica si el control UpDown sincroniza la propiedad Value con una propiedad del control auxiliar. Como ejemplo vamos a desarrollar una aplicación permita mostrar el código ANSI de un carácter especificado. Pág. 145 que Para tal fin crear un nuevo formulario y ubicar los siguientes controles: 2 etiquetas (Código ANSI, Carácter), 2 cuadros de texto (TxtANSI, TxtCaracter) y 1 control UpDown. Luego establezca las propiedades que se indican: UpDown1 Nombre UpDown1 BuddyControl TxtANSI BuddyProperty Text Increment 1 Max 255 Min 0 SyncBuddy True Seguidamente proceda a transcribir el siguiente código: Private Sub TxtANSI_Change() TxtCaracter = Chr(TxtANSI) End Sub CONTROL MONTHVIEW Pág. 146 El control MonthView permite al usuario la posibilidad de ver y establecer información de fechas mediante una interfaz similar a un calendario. Para agregar este control seleccionar el componente Microsoft Windows Common Controls-2 6.0. Propiedad Descripción Day Especifica el número de día mostrado. Month Especifica el número de mes mostrado. Year Especifica el número de año mostrado. Value Especifica la fecha mostrada. DayOfWeek Especifica el día de la semana correspondiente a la fecha mostrada. Week Especifica el número de la semana en que cae la fecha mostrada. MultiSelect Especifica si se puede seleccionar un intervalo contiguo de fechas. MaxSelCount Especifica pueden el número seleccionarse máximo de días que mediante la propiedad MultiSelect. SelStart SelEnd Especifica los respectivamente límite del inferior intervalo y superior de fechas seleccionado. MonthColumns MonthRows Permiten mostrar simultáneamente. más MonthColumns de un mes especifica el número de meses que se mostrarán en sentido horizontal. MonthRows especifica el número de meses que se mostrarán en sentido vertical. Evento Descripción Pág. 147 Click Ocurre cada vez que el usuario hace click sobre el control. DateClick Ocurre cada vez que el usuario hace click sobre una fecha mostrada en el control. Como ejemplo vamos a crear un sencillo calendario. Cuando el usuario haga click sobre alguna fecha, esta aparecerá en el cuadro de texto. Pamela Anderson representará la parte atractiva de nuestra aplicación. Para ello crear un nuevo formulario y agregar una etiqueta (La fecha selecciona es), un cuadro de texto (TxtFecha), un control imagen (ImgPamela) y un control MonthView. Luego ingresar el siguiente código: Private Sub MonthView1_DateClick(ByVal DateClicked As Date) Pág. 148 TxtFecha = WeekdayName(MonthView1.DayOfWeek) & “ , ” _ & Str(MonthView1.Day) & “ de ” _ & MonthName(MonthView1.Month) & “ de ” _ & Str(MonthView1.Year) End Sub Private Sub MonthView1_Click() Call MonthView1_DateClick(MonthView1.Value) End Sub Private Sub Form_Load() Call MonthView1_DateClick(MonthView1.Value) End Sub La función WeekdayName retorna una cadena con el nombre del día de la semana especificado. Requiere como argumento el número de día de la semana. La función MonthName retorna una cadena con el nombre del mes especificado. Requiere como argumento el número de mes. El evento DateClick tiene un parámetro DateClicked que especifica la fecha seleccionada. Puede utilizar este valor (DateClicked) para obtener la fecha en la que el usuario hizo click. CONTROL CALENDAR Pág. 149 El control Calendar es similar en funcionalidad al control MonthView, pues también presenta un calendario. Para agregar este control seleccionar el componente Control Calendar de Microsoft 9.0. Propiedad Descripción Day Especifica el número de día mostrado. Month Especifica el número de mes mostrado. Year Especifica el número de año mostrado. Value Especifica la fecha mostrada. Como ejemplo vamos a desarrollar la aplicación anterior, pero esta vez haciendo uso de un control Calendar. Pág. 150 Para ello crear un nuevo formulario y agregar una etiqueta (La fecha selecciona es), un cuadro de texto (TxtFecha), un control imagen (ImgPamela) y un control Calendar. Luego ingresar el siguiente código: Private Sub Calendar1_Click() TxtFecha = WeekdayName(Weekday(Calendar1.Value)) & “ , ” _ & Str(Calendar1.Day) & “ de ” _ & MonthName(Calendar1.Month) & “ de ” _ & Str(Calendar1.Year) End Sub La función Weekday retorna un número entero que representa el día de la semana de una fecha dada. Se utiliza para suplir a la propiedad DayOfWeek la cual no está permitida para control Calendar. Pág. 151 el CAPÍTULO 7 ARCHIVOS Un archivo (fichero) relacionada entre dispositivo de duro). Los permanente modo un conjunto almacenada almacenamiento datos de sí, es almacenados que pueden como una secundario en un ser de información unidad (disquete, archivo son manipulados en de en un disco manera cualquier momento. Cada archivo está referenciado por un identificador, su nombre. CONCEPTO DE ARCHIVO BAJO WINDOWS/VISUAL BASIC Un archivo tiene un nombre almacenado en una carpeta junto con otros archivos de disco. Los nombres de los archivos en Windows y Visual Basic requieren de 1 a 215 caracteres (incluidos espacios en blanco), y pueden incluir también una extensión de 1 a 3 letras, normalmente son significativas y relativas al contenido del mismo. Por ejemplo: LEAME.TXT Archivo de texto MISDATOS.DAT Archivo de datos PLANILLA.XLS Archivo de MS-Excel SHAKIRA.BMP Archivo de mapa de bits Pág. 152 El nombre de un archivo para ser referenciado correctamente consta de: • Unidad (Especificador de unidad, por ejemplo A, B, C) • Camino (Especificador de ruta, por ejemplo \DATA\) • Nombre (Especificador de archivo, por ejemplo DEMO.DAT) Como ejemplo, suponga que el archivo DEMO.DAT está en la carpeta DATA de la unidad C (disco duro); la descripción completa del nombre del archivo es: C:\DATA\DEMO.DAT Ahora, suponga que el archivo CONSTANTES.DAT se encuentra en la carpeta LIB, que a su vez está contenida en la carpeta DATA de la unidad C. La descripción completa del nombre de dicho archivo está dada por: C:\DATA\LIB\CONSTANTES.DAT Desde el punto de vista de Visual Basic un archivo almacena los datos como un conjunto de registros, conteniendo todos ellos, generalmente, los mismos campos. Cada campo almacena un dato de tipo predefinido o de un tipo definido por el usuario. El elemento de información más simple estaría formado por un carácter. OPERACIONES SOBRE EL SISTEMA DE ARCHIVOS Pág. 153 Para manipular el sistema de archivos de un disco, Visual Basic proporciona las sentencias que a continuación se describen. Sentencia Kill Permite eliminar un archivo almacenado en un disco. Su sintaxis es de la forma: Kill NOMBRE_ARCHIVO Donde identifica NOMBRE_ARCHIVO al archivo es que una se cadena desea de caracteres borrar. Se que permiten caracteres comodín (* y ?). Si el archivo no existe se produce un error. Por ejemplo: Kill “C:\TEMP\TEMPO.DAT” La instrucción anterior elimina el archivo TEMPO.DAT ubicado en la carpeta C:\TEMP. Sentencia Name Permite cambiar el nombre (renombrar) de un archivo del disco y moverlo a otro directorio si fuera preciso. Su sintaxis es la siguiente: Name NOMBRE_ACTUAL As NOMBRE_NUEVO Donde NOMBRE_ACTUAL es una cadena de caracteres que especifica el nombre actual del archivo y NOMBRE_NUEVO es otra Pág. 154 cadena de caracteres que indica el nuevo nombre que se desea dar al archivo. Este nombre no debe existir, de lo contrario se obtendrá un error. Por ejemplo: Name “C:\TEMP\TEMPO.DAT” As “C:\DATA\CURSO.DAT” La instrucción anterior cambia el nombre del archivo TEMPO.DAT por el nombre CURSO.DAT. El contenido del archivo permanece inalterado y su localización física se cambia de la carpeta C:\TEMP a C:\DATA. Sentencia MkDir Permite crear una nueva carpeta. Su sintaxis es: MkDir NUEVA_CARPETA Donde NUEVA_CARPETA es una cadena de caracteres que identifica la carpeta que se va ha crear. Por ejemplo: MkDir “C:\DATA\TEMP” Sentencia RmDir Elimina una carpeta vacía existente en el disco. Su sintaxis es de la forma: RmDir NOMBRE_CARPETA Donde NOMBRE_CARPETA es una cadena de caracteres identifica la carpeta que se desea eliminar. Por ejemplo: Pág. 155 que RmDir “C:\DATA\TEMP” Sentencia ChDir Permite cambiar la carpeta actual. Su sintaxis es: ChDir NOMBRE_CARPETA Donde NOMBRE_CARPETA es una cadena de caracteres que identifica la nueva ruta de acceso predeterminada. Por ejemplo: ChDir “C:\DATA\GRAFICOS” MsgBox App.Path La propiedad Path del objeto App especifica la ruta de acceso actual. Sentencia ChDrive Permite cambiar la unidad de disco actual. Su sintaxis es: ChDrive UNIDAD Donde UNIDAD es un carácter que especifica la nueva unidad de disco. Si el parámetro UNIDAD es una cadena de múltiples caracteres sólo se lee la primera letra. Por ejemplo: ChDrive “A” OPERACIONES CON ARCHIVOS Pág. 156 Para realizar referenciarlo alguna mediante su operación nombre sobre completo. un archivo Las hay operaciones básicas que se pueden realizar con los archivos son: • Abrir, preparar un archivo para hacer referencia a él. • Escribir, introducir un elemento de información a un archivo. • Leer, obtener un elemento de información de un archivo. • Modificar, alterar un elemento de información ya existente en un archivo. • Cerrar, evitar cualquier otra referencia al archivo en tanto no se le abra otra vez. TIPOS DE ARCHIVOS Los tipos de archivos dependen del modo como están organizados los registros y de la forma de accesar a la los datos contenidos en ellos. En Visual Basic existen tres tipos de archivos de datos, estos son: • Archivos secuenciales (acceso secuencial). • Archivos aleatorios (acceso aleatorio). • Archivos binarios (acceso binario). A continuación pasamos a describir cada uno de ellos en forma detallada. ARCHIVOS DE ACCESO SECUENCIAL Pág. 157 En un archivo de acceso secuencial los registros se almacenan siguiendo una a otro, según el orden en que son ingresados. Cuando se lee la información, se empieza por el primer registro y se continua al siguiente hasta alcanzar el final. Las sentencias y funciones necesarias para manipular archivos de tipo secuencial se presentan a continuación. Sentencia Open Permite abrir un archivo. La sintaxis para esta sentencia es la siguiente: Open NOMBRE_ARCHIVO For MODO As # NÚMERO_ARCHIVO Donde NOMBRE_ARCHIVO es una cadena que especifica el nombre del archivo que se debe ser abierto en MODO Output, Append o Input. Modo Output Descripción Escritura de datos. Si el archivo existe, su contenido actual se destruye. Si el archivo no existe, se crea. Append Añadir datos. Los datos son añadidos a partir de los últimos existentes. Si el archivo no existe, se crea. Input Lectura de datos. La lectura empieza desde el principio del archivo. Si el archivo no existe, se produce un error. El parámetro NÚMERO_ARCHIVO es un entero cuyo valor debe estar comprendido entre 1 y 511. Este número será asociado al Pág. 158 nombre del archivo mientras éste permanezca abierto. Para obtener el número del siguiente archivo disponible se utiliza la función FreeFile(). Como ejemplo suponga que se requiere abrir el archivo DEMO.DAT ubicado en la carpeta C:\DATA, la instrucción sería la siguiente: Dim N1 As Integer N1 = FreeFile() Open “C:\DATA\DEMO.DAT” For Output As # N1 Sentencia Print Permite escribir datos secuencialmente en un archivo. Su sintaxis es: Print # NÚMERO_ARCHIVO, LISTA_DE_EXPRESIONES Donde NÚMERO_ARCHIVO es el número utilizado cuando el archivo fue abierto. LISTA_DE_EXPRESIONES es un conjunto de expresiones (numéricas, de cadena, de fecha, etc.) separadas por punto y coma (;) que serán escritas en el archivo. La sentencia Print escribe en el archivo una imagen de los datos tal y como se habrían visualizado sobre el formulario con la sentencia Print. Por ejemplo: Dim N1 As Integer N1 = FreeFile() Pág. 159 Open “C:\DATA\DEMO.DAT” For Output As # N1 Print # N1, “Visual Basic es fácil”; “, ”; Date() Al ejecutarse el código anterior se escribiría en el archivo la siguiente información: Visual Basic es fácil, 24/04/2001 Como se observa, al utilizar la sentencia Print se deben delimitar los datos para que se impriman correctamente. Sentencia Write Permite escribir datos secuencialmente en un archivo. Su sintaxis es: Write # NÚMERO_ARCHIVO, LISTA_DE_EXPRESIONES Donde NÚMERO_ARCHIVO es el número utilizado cuando el archivo fue abierto. LISTA_DE_EXPRESIONES es un conjunto de expresiones (numéricas, de cadena, de fecha, etc.) separadas por punto y coma (;) que serán escritas en el archivo. La sentencia Write inserta comas (,) entre las expresiones de la LISTA_DE_EXPRESIONES, por tanto no es necesario poner delimitadores explícitamente como en el caso de la sentencia Print. Cuando se utiliza la sentencia Write para escribir información en un archivo, se siguen distintas convenciones Pág. 160 universales, de modo que los datos siempre se pueden leer e interpretar correctamente, independientemente de la configuración regional, estas convenciones son: • Los datos numéricos siempre se escriben utilizando la coma (,) como separador decimal. • Para datos de tipo Boolean se imprime # TRUE # o # FALSE #. • Los datos de tipo Date se escriben en el archivo usando el formato de fecha universal (fechas como # aaaa-mm-dd # y horas como # hh:mm:ss #). A manera de ejemplo considere el siguiente segmento de código: Dim N1 As Integer N1 = FreeFile() Open “C:\DATA\DEMO.DAT” For Output As # N1 Write # N1, “Visual Basic es fácil”; Date() La ejecución de este código escribiría en el archivo la siguiente información: Visual Basic es fácil", # 2002-04-11 # Sentencia Close Pág. 161 Cierra uno archivo abierto mediante la sentencia Open. Su sintaxis es la siguiente: Close # NÚMERO_ARCHIVO [, # NÚMERO_ARCHIVO, . . .] Donde NÚMERO_ARCHIVO es el número con el cual se abrió el archivo. Por ejemplo: Close # 1, # 2 La instrucción anterior cierra los archivos asociados con los números 1 y 2. La siguiente sentencia cierra todos los archivos abiertos. Close Sentencia Input Permite leer datos de un archivo secuencial y los asigna a las variables especificadas. Su sintaxis es: Input # NÚMERO_ARCHIVO, VARIABLE1 [, VARIABLE2, . . .] Donde NÚMERO_ARCHIVO archivo fue nombres de abierto. las es el VARIABLE1, variables número utilizado VARIABLE2, que han . de . cuando . son recibir correspondientes datos del archivo. Pág. 162 el los los Los datos del archivo deben aparecer en el mismo orden que tienen las variables en la sentencia Input y deben coincidir con variables del mismo tipo de datos. Por ejemplo: Dim N1 As Integer N1 = FreeFile() Open “C:\DATA\DEMO.DAT” For Input As # N1 Dim A As Integer Dim B As Double Dim S As String Dim F As Date Input # N1, A, B, S, F El segmento de código anterior espera encontrar en el archivo un entero, un real, una cadena y una fecha, en ese orden (separados por comas o un retorno de carro). Sentencia Line Input Permite leer una línea de un archivo secuencial ignorando los delimitadores (comas) y la asigna a una variable tipo cadena. Su sintaxis es: Line Input # NÚMERO_ARCHIVO, VARIABLE Donde NÚMERO_ARCHIVO es el número utilizado cuando el archivo fue abierto. VARIABLE es el nombre de una variable tipo cadena de caracteres. Pág. 163 La sentencia Line Input se utiliza especialmente para leer un archivo de texto línea a línea, ya que esta sentencia lee todos los caracteres del archivo hasta que encuentra un retorno de carro, entonces continua en la siguiente línea y así sucesivamente. Por ejemplo: Dim N1 As Integer, LINE1 As String, LINE2 As String N1 = FreeFile() Open “C:\DATA\DEMO.TXT” For Output As # N1 Print # N1, “Línea de prueba 1” Print # N1, “Línea de prueba 2” Close # N1 Open “C:\DATA\DEMO.TXT” For Input As # N1 Line Input # N1, LINE1 MsgBox LINE1 Line Input # N1, LINE2 MsgBox LINE2 La ejecución del código anterior produce la siguiente salida: Pág. 164 Función Input Retorna los siguientes N caracteres de un archivo secuencial y los asigna a una variable de cadena. Su sintaxis es de la forma: VARIABLE = Input( N , # NÚMERO_ARCHIVO) A diferencia de la sentencia Input, la función Input() retorna todos los caracteres que lee, incluyendo comas, retornos de carro, continuaciones de línea, etc. Por ejemplo: Dim N1 As Integer, S As String N1 = FreeFile() Open “C:\DATA\DEMO.TXT” For Output As # N1 Print # N1, “Línea de prueba 1” Print # N1, “Línea de prueba 2” Close # N1 Open “C:\DATA\DEMO.TXT” For Input As # N1 S = Input(24, # N1) MsgBox S La ejecución del código anterior produce la siguiente salida: Función EOF Pág. 165 Especifica si se ha llegado al final de un archivo. Su sintaxis es de la forma: VARIABLE = EOF(NÚMERO_ARCHIVO) Se utiliza EOF() para evitar producir un error al intentar obtener información más allá del final del archivo. EOF() retorna un valor True si se ha alcanzado el final del archivo y False en caso contrario. Por ejemplo: Dim N1 As Integer Dim CADENA As String N1 = FreeFile() Open “C:\DATA\DEMO.TXT” For Input As # N1 While Not EOF(N1) Line Input # N1, CADENA Print CADENA Wend Close # N1 Este segmento de código lee y visualiza cada línea del archivo de texto DEMO.TXT. El bucle finaliza cuando se detecta el final del archivo. Para que el código anterior funcione correctamente, no olvide poner la propiedad AutoRedraw del formulario a True. Como ejemplo final del uso de archivos secuenciales vamos a desarrollar un sencillo editor de texto. Este editor aunque Pág. 166 sus prestaciones son bastante limitadas va ha servir para poner en práctica lo aprendido recientemente. El menú que se muestra en la figura obedece a la siguiente descripción: Caption Name ShortCut &Archivo MnuArchivo Ninguno . . . &Nuevo MnuArchivoNuevo Ninguno . . . &Abrir MnuArchivoAbrir Ninguno . . . &Guardar MnuArchivoGuardar Ninguno . . . - MnuArchivoLinea Ninguno . . . &Salir MnuArchivoSalir Ctrl + X Luego proceda a ubicar los siguientes controles sobre el formulario: Pág. 167 1 cuadro de texto 1 control CommonDialog Seguidamente debe establecer las propiedades que se indican: Form1 Nombre FrmEditor Caption Editor Nombre TxtEditor MultiLine True ScrollBars 3-Both Text1 Text CommonDialog1 Nombre CommonDialog1 CancelError True Una vez establecidas las propiedades de la interfaz ingresar el código que se muestra: Private Sub Form_Resize() TxtEditor.Move 0, 0, ScaleWidth, ScaleHeight End Sub Private Sub MnuArchivoNuevo_Click() TxtEditor = “” End Sub Pág. 168 Private Sub MnuArchivoAbrir_Click() Dim FILTRO As String, FILE As String Dim N1 As Integer, CADENA As String On Error GoTo ERROR_ABRIR FILTRO = “Archivos de texto (*.TXT)|*.TXT” CommonDialog1.Filter = FILTRO CommonDialog1.ShowOpen FILE = CommonDialog1.FileName N1 = FreeFile() CADENA = “” TxtEditor = “” Open FILE For Input As # N1 While Not EOF(N1) Input # N1, CADENA TxtEditor = TxtEditor & CADENA & vbCrLf Wend Close # N1 FrmEditor.Caption = “Editor - ” & FILE SALIR_ABRIR: Exit Sub ERROR_ABRIR: MsgBox Err.Description Resume SALIR_ABRIR End Sub Private Sub MnuArchivoGuardar_Click() Dim FILTRO As String, FILE As String Dim N1 As Integer Pág. 169 On Error GoTo ERROR_GUARDAR FILTRO = “Archivos de texto (*.TXT)|*.TXT” CommonDialog1.Filter = FILTRO CommonDialog1.ShowSave FILE = CommonDialog1.FileName N1 = FreeFile() Open FILE For Output As # N1 Print # N1, TxtEditor Close # N1 FrmEditor.Caption = “Editor - ” & FILE SALIR_GUARDAR: Exit Sub ERROR_GUARDAR: MsgBox Err.Description Resume SALIR_GUARDAR End Sub La contiene sentencia la Err.Description descripción asociada retorna a un una error cadena en que tiempo de ejecución. La sentencia Resume continua la ejecución en la etiqueta especificada cuando termina una rutina de gestión de errores. ARCHIVOS DE ACCESO ALEATORIO En los archivo de acceso aleatorio el almacenamiento de los datos se hace mediante registros (todos de la Pág. 170 misma longitud), lo cuales son identificados mediante un único número denominado índice. El primer registro de un archivo tiene como índice 1, el segundo tiene índice 2 y así sucesivamente. La información contenida en un archivo de este tipo puede ser accedida en individual cualquier se asocia secuencia, con su ya que respectivo cada índice y registro puede ser leído, escrito o actualizado. Las sentencias y funciones necesarias para manipular archivos de tipo aleatorio se presentan a continuación. Sentencia Open Permite abrir un archivo. La sintaxis para acceder aleatoriamente a un archivo es: Open NOMBRE_ARCHIVO For Random As # NÚMERO_ARCHIVO Len = LON_REG Donde NOMBRE_ARCHIVO es una cadena que especifica el nombre del archivo que se debe ser abierto en modo Random. El parámetro NÚMERO_ARCHIVO es un entero cuyo valor está comprendido entre 1 y 511. Este número será asociado con el nombre del archivo mientras permanezca abierto. LON_REG es un entero que establece la longitud del registro para archivos aleatorios. Sentencia Put Permite grabar un registro en un archivo abierto acceso aleatorio. Su sintaxis es: Pág. 171 para Put # NÚMERO_ARCHIVO, NÚMERO_REG, VARIABLE Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el archivo, NÚMERO_REG es el número correspondiente al registro que se va ha grabar y VARIABLE contiene los datos a escribir en el archivo. Por ejemplo: Dim N1 As Integer, REG As DISTRITO REG.ID_DISTRITO = “L09” REG.NOMBRE = “Chorrillos” N1 = FreeFile() Open “C:\DATA\RAND1.DAT” For Random As # N1 Len = Len(REG) Put # N1, 1, REG Close # N1 El segmento de código anterior utiliza una variable REG de tipo DISTRITO, cuya definición es la siguiente: Private Type DISTRITO ID_DISTRITO As String * 3 NOMBRE As String * 30 End Type Sentencia Get Permite acceso leer aleatorio, un registro almacenando procedente los datos de en un archivo una de variable específica. Su sintaxis es de la forma: Pág. 172 Get # NÚMERO_ARCHIVO, NÚMERO_REG, VARIABLE Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el archivo, NÚMERO_REG es el número correspondiente al registro que se va ha leer y VARIABLE almacena los datos del registro leído. Por ejemplo: Dim N1 As Integer, I As Integer, REG As DISTRITO N1 = FreeFile() Open “C:\DATA\RAND1.DAT” For Random As # N1 Len = Len(REG) I = 1 While Not EOF(# N1) Get # N1, I, REG MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE I = I + 1 Wend Close # N1 Cuando EOF() se utiliza con un archivo aleatorio, retorna un valor True si una sentencia Get intenta leer y no puede porque ha alcanzado el final del archivo. Función LOF Retorna determinado el número archivo de abierto bytes (caracteres) mediante la que ocupa un sentencia Open. Su sintaxis es: Pág. 173 VARIABLE = LOF(# NÚMERO_ARCHIVO) Donde NÚMERO_ARCHIVO es el número con el que se abrió el archivo. Esta función es de utilidad, porque aplicada a un archivo de acceso aleatorio, permite conocer el número de registros almacenados en el archivo. Para ello debe dividir el valor retornado entre la longitud del registro. Como ejemplo, considere lo siguiente: Dim N1 As Integer, REG As DISTRITO Dim NUM_REGS As Integer, I As Integer N1 = FreeFile() Open “C:\DATA\RAND1.DAT” For Random As # N1 Len = Len(REG) NUM_REGS = LOF(N1) / Len(REG) For I = 1 To NUM_REGS Get # N1, I, REG MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE Next Close # N1 Función Loc Esta función retorna la posición actual dentro fichero. Su sintaxis es: VARIABLE = Loc(# NÚMERO_ARCHIVO) Pág. 174 de un La función Loc() aplicada a un archivo de acceso aleatorio retorna el número del último registro leído o grabado en el archivo especificado. Por ejemplo: Dim N1 As Integer, REG As DISTRITO Dim NUM_REGS As Integer, I As Integer N1 = FreeFile() Open “C:\DATA\RAND1.DAT” For Random As # N1 Len = Len(REG) NUM_REGS = LOF(N1) / Len(REG) I = 1 Do While True Get # N1, I, REG MsgBox REG.ID_DISTRITO & “ ” & REG.NOMBRE I = I + 1 If Loc(N1) = NUM_REGS Then Exit Do Loop Close # N1 La sentencia If finaliza el bucle si se ha alcanzado el último registro. Como ejemplo final vamos a desarrollar una aplicación que permita realizar el mantenimiento de los datos almacenados en el archivo C:\DATA\CURSO.DAT. Pág. 175 Los botones ubicados en el marco Navegador (Primero, Anterior, Siguiente y Ultimo, de izquierda a derecha) permiten desplazarse a través de los registros del archivo. Los botones ubicados en el marco Mantenimiento (Nuevo, Editar, Guardar y Eliminar, de izquierda a derecha) permiten realizar las operaciones básicas de mantenimiento de los registros. Para el desarrollo de la presente aplicación ubicar los siguientes controles al formulario: 3 marcos 4 etiquetas 4 cuadros de texto 9 botones de comando Seguidamente proceda a establecer las propiedades que se indican: Form1 Pág. 176 Nombre FrmCurso Caption Mantenimiento de cursos BorderStyle 3-Fixed Dialog StarUpPosition 2-CenterScreen Frame1 Nombre FraIngreso Caption Frame2 Nombre FraNavegador Caption Navegador Frame3 Nombre FraMantenimiento Caption Mantenimiento Label1 Nombre LblCodigo Caption Código: Label2 Nombre LblNombre Caption Nombre: Label3 Nombre LblVacantes Caption Vacantes: Label4 Nombre LblProfesor Caption Profesor: Pág. 177 Text1 Nombre TxtCodigo Locked True Text Text2 Nombre TxtNombre Locked True Text Text3 Nombre TxtVacantes Locked True Text Text4 Nombre TxtProfesor Locked True Text Command1 Nombre CmdPrimero Caption Picture C:\FundVB\Bitmaps\First.bmp Style 1-Graphical Command2 Nombre CmdAnterior Caption Picture C:\FundVB\Bitmaps\Previous.bmp Pág. 178 Style 1-Graphical Command3 Nombre CmdSiguiente Caption Picture C:\FundVB\Bitmaps\Next.bmp Style 1-Graphical Command4 Nombre CmdUltimo Caption Picture C:\FundVB\Bitmaps\Last.bmp Style 1-Graphical Command5 Nombre CmdNuevo Caption Picture C:\FundVB\Bitmaps\New.bmp Style 1-Graphical Command6 Nombre CmdEditar Caption Picture C:\FundVB\Bitmaps\Edit.bmp Style 1-Graphical Command7 Nombre CmdGuardar Caption Picture C:\FundVB\Bitmaps\Save.bmp Pág. 179 Style 1-Graphical Command8 Nombre CmdEliminar Caption Picture C:\FundVB\Bitmaps\Delete.bmp Style 1-Graphical Command9 Nombre CmdSalir Caption &Salir Picture C:\FundVB\Bitmaps\Exit.bmp Style 1-Graphical Luego, proceda a transcribir el código mostrado a continuación: Private Type CURSO ID_CURSO As String * 3 NOMBRE As String * 30 VACANTES As Integer PROFESOR As String * 25 ESTADO As Boolean End Type Dim N1 As Integer, POSICION As Integer Dim REG As CURSO Private Sub MODO_EDITAR(ByVal Ok As Boolean) TxtCodigo.Locked = Not Ok TxtNombre.Locked = Not Ok Pág. 180 TxtVacantes.Locked = Not Ok TxtProfesor.Locked = Not Ok CmdNuevo.Enabled = Not Ok CmdEditar.Enabled = Not Ok CmdGuardar.Enabled = Ok CmdEliminar.Enabled = Not Ok CmdPrimero.SetFocus If Ok Then TxtCodigo.SetFocus End Sub Private Sub ABRIR_ARCHIVO() On Error GoTo ERROR_ABRIR: N1 = FreeFile() Open “C:\DATA\CURSO.DAT” For Random As # N1 Len = Len(REG) SALIR_ABRIR: Exit Sub ERROR_ABRIR: MsgBox Err.Description Resume SALIR_ABRIR: End Sub Private Sub Form_Load() Call ABRIR_ARCHIVO End Sub Private Sub Form_Activate() MODO_EDITAR False Call CmdPrimero_Click Pág. 181 End Sub Private Sub CmdPrimero_Click() POSICION = 1 Get # N1, POSICION, REG TxtCodigo = REG.ID_CURSO TxtNombre = REG.NOMBRE TxtVacantes = Str(REG.VACANTES) TxtProfesor = REG.PROFESOR End Sub Private Sub CmdAnterior_Click() POSICION = Loc(N1) - 1 If POSICION = 0 Then Get # N1, 1, REG MsgBox “Estamos en el primer registro” Else Get # N1, POSICION, REG End If TxtCodigo = REG.ID_CURSO TxtNombre = REG.NOMBRE TxtVacantes = Str(REG.VACANTES) TxtProfesor = REG.PROFESOR End Sub Private Sub CmdSiguiente_Click() Dim ULTIMO As Integer ULTIMO = LOF(N1) / Len(REG) Pág. 182 POSICION = Loc(N1) + 1 If POSICION = ULTIMO + 1 Then Get # N1, ULTIMO, REG MsgBox “Estamos en el último registro” Else Get # N1, POSICION, REG End If TxtCodigo = REG.ID_CURSO TxtNombre = REG.NOMBRE TxtVacantes = Str(REG.VACANTES) TxtProfesor = REG.PROFESOR End Sub Private Sub CmdUltimo_Click() POSICION = LOF(N1) / Len(REG) If POSICION <> 0 Then Get #N1, POSICION, REG TxtCodigo = REG.ID_CURSO TxtNombre = REG.NOMBRE TxtVacantes = Str(REG.VACANTES) TxtProfesor = REG.PROFESOR End If End Sub Private Sub CmdNuevo_Click() POSICION = LOF(N1) / Len(REG) + 1 MODO_EDITAR True Pág. 183 TxtCodigo = “” TxtNombre = “” TxtVacantes = “” TxtProfesor = “” TxtCodigo.SetFocus End Sub Private Sub CmdEditar_Click() MODO_EDITAR True End Sub Private Sub CmdGuardar_Click() REG.ID_CURSO = Trim(TxtCodigo) REG.NOMBRE = Trim(TxtNombre) REG.VACANTES = TxtVacantes REG.PROFESOR = Trim(TxtProfesor) REG.ESTADO = True Put # N1, POSICION, REG MODO_EDITAR False End Sub Private Sub CmdEliminar_Click() Dim N2 As Integer Dim I As Integer, J As Integer REG.ESTADO = False Put # N1, POSICION, REG N2 = FreeFile() Pág. 184 Open “C:\DATA\TEMPO.DAT” For Random As # N2 Len = Len(REG) I = 1 J = 1 While Not EOF(N1) Get # N1, I, REG If REG.ESTADO Then Put # N2, J, REG J = J + 1 End If I = I + 1 Wend Close # N1, # N2 Kill “C:\DATA\CURSO.DAT” Name “C:\DATA\TEMPO.DAT” As “C:\DATA\CURSO.DAT” Call ABRIR_ARCHIVO Call CmdPrimero_Click End Sub Private Sub CmdSalir_Click() Close # N1 End End Sub ARCHIVOS DE ACCESO BINARIO Pág. 185 Un archivo binario contiene más que simplemente texto. Puede contener imágenes, sonido, hojas de cálculo, o documentos concebidos para el procesamiento de texto. El acceso cualquier binario archivo como permite una la posibilidad secuencia numerada de tratar de bytes, independientemente de la estructura del mismo. Los bytes ocupan las posiciones 1, 2, 3, etc. Por ejemplo, si se requiere recuperar un dato de tipo entero (Integer, 2 bytes) de la posición 3 del archivo, serían recuperados los bytes 3 y 4 para poder formar el valor del entero. Por tanto, antes de trabajar con archivos binarios es necesario conocer cómo fueron escritos los datos que contiene para poder recuperarlos correctamente. Sentencia Open Permite abrir un archivo para acceso binario. Su sintaxis es de la forma: Open NOMBRE_ARCHIVO For Binary As # NÚMERO_ARCHIVO Donde NOMBRE_ARCHIVO es una cadena que especifica el nombre del archivo que se debe ser abierto en modo Binary. El parámetro NÚMERO_ARCHIVO es un entero cuyo valor está comprendido entre 1 y 511. Este número será asociado con el nombre del archivo mientras permanezca abierto. Sentencia Put Pág. 186 Permite grabar en un archivo binario tantos bytes como haya en una variable. Su sintaxis es: Put # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el archivo. POSICIÓN es el número de byte a partir del cual se han de grabar los datos contenidos en VARIABLE. Sentencia Get Permite leer de un archivo binario tantos bytes como quepan en una variable. Su sintaxis es de la forma: Get # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE Donde NÚMERO_ARCHIVO es el número bajo el cual se abrió el archivo. POSICIÓN es el número de byte a partir del cual se han de leer los datos almacenados en VARIABLE. Sentencia Seek Permite situar la posición de lectura o de escritura en una posición determinada dentro del archivo. Su sintaxis es: Get # NÚMERO_ARCHIVO, POSICIÓN, VARIABLE Donde POSICIÓN es el número de byte a partir del cual queremos leer o escribir dentro del archivo. Pág. 187 Como ejemplo vamos a desarrollar una aplicación que permite guardar “cifrados” los textos ingresados en un cuadro de texto. Para ello crear un nuevo proyecto y ubicar en el formulario un cuadro de texto (TxtMensaje) y un botón de comando (CmdCifrar). Luego, ingrese el siguiente código: Const CLAVE As Integer = 3 Private Sub CmdCifrar_Click() Dim N1 As Integer, I As Integer Dim CAR As String * 1 N1 = FreeFile() Open “C:\DATA\DEMO.BIN” For Binary As # N1 For I = 1 To Len(TxtMensaje) CAR = Chr((Asc(Mid(TxtMensaje, I, 1)) + CLAVE) Mod 256) Put # N1, , CAR Next Close # N1 End Sub En el código la función Mid() obtiene el carácter “I” de la caja de texto, la función Asc() obtiene su código ANSI, al que sumamos el valor de CLAVE, para después obtener el resto de la división entre 256, con el fin de mantenernos en el rango de 0 a 255 (rango de valores de la tabla de caracteres ANSI). Por último, la función Chr() retorna el carácter correspondiente al valor obtenido, el cual es almacenado en el archivo binario. Pág. 188 Por ejemplo si ingresa el mensaje “HOLA” se almacena en el archivo como “KROD” (lo puede comprobar mediante el Bloc de notas), ya que el valor ANSI de la “H” es 72, este carácter al sumarle el valor de CLAVE sería el 75 (72 + 3), que es la “K”, y así sucesivamente (ver la tabla de caracteres ANSI). El descifrado sería el proceso inverso, para ello crear un nuevo formulario y ubicar un botón de comando (CmdDescifrar), luego ingresar el código siguiente: Const CLAVE As Integer = 3 Private Sub CmdDescifrar_Click() Dim N1 As Integer, I As Integer Dim CAR As String * 1, CADENA As String N1 = FreeFile() Open “C:\DATA\DEMO.BIN” For Binary As # N1 Get # N1, , CAR While Not EOF(N1) CAR = Chr((Asc(CAR) + (256 - Val(CLAVE))) Mod 256) CADENA = CADENA & CAR Get # N1, , CAR Wend MsgBox CADENA End Sub Pág. 189 CAPÍTULO 8 GRÁFICOS Un gráfico tiene por finalidad facilitar la legibilidad de la información que se presenta: “un gráfico vale más que mil palabras”. LOS COLORES En Visual Basic se pueden manipular los colores mediante tres formas diferentes: código hexadecimal, la función RGB() y la función QBColor(). Código Hexadecimal Un código de color se compone de seis dígitos hexadecimales, cuyos valores van desde &H000000& (cero) hasta &HFFFFFF& (16 777 215). De forma práctica podemos guiarnos mediante: &HAAVVRR& Donde AA representa al color azul, VV al color verde y RR al color rojo. Todos los demás colores se obtienen mezclando estos tres colores. Pág. 190 Como ejemplo considere los siguientes códigos de colores que se presentan a continuación: = &HFF0000& AZUL VERDE = &H00FF00& = &H0000FF& ROJO NEGRO = &H000000& La función RGB() La función RGB() retorna un número de tipo entero largo (Long) que representa el valor de un color. Su sintaxis es: COLOR = RGB(nROJO, nVERDE, nAZUL) Donde nROJO, nVERDE, nAZUL son enteros comprendidos entre 0 y 255. La siguiente tabla muestra algunos colores estándar y sus valores de nROJO, nVERDE y nAZUL: Color nROJO nVERDE nAZUL Negro 0 0 0 Azul 0 0 255 Verde 0 255 0 Cián 0 255 255 Rojo 255 0 0 Magenta 255 0 255 Amarillo 255 255 0 Blanco 255 255 255 Pág. 191 El ejemplo anterior (código hexadecimal) utilizando la función RGB() será similar a: AZUL = RGB(0, 0, 255) VERDE = RGB(0, 255, 0) ROJO = RGB(255, 0, 0) NEGRO = RGB(0, 0, 0) La función QBColor() La función QBColor() retorna un número de tipo entero largo (Long) que representa el código de color RGB correspondiente al número de color especificado. Su sintaxis es: COLOR = QBColor(nCOLOR) Donde el argumento nCOLOR es un entero entre 0 y 15; los valores que puede tomar se presentan en la siguiente tabla: Número Color Número Color 0 Negro 8 Gris 1 Azul 9 Azul claro 2 Verde 10 Verde claro 3 Cián 11 Cián claro 4 Rojo 12 Rojo claro 5 Magenta 13 Magenta claro 6 Amarillo 14 Amarillo claro 7 Blanco 15 Blanco brillante Pág. 192 El ejemplo inicial (código hexadecimal) utilizando la función QBColor() se soluciona como se muestra a continuación: AZUL = QBColor(1) VERDE = QBColor(2) ROJO = QBColor(4) NEGRO = QBColor(0) EL SISTEMA DE COORDENADAS Todas las operaciones gráficas descritas en este capítulo utilizan el sistema de coordenadas del área de dibujo (que puede ser la pantalla, un formulario, un cuadro de imagen, o cualquier otro contenedor). El sistema de coordenadas es una cuadrícula bidimensional que define ubicaciones del área de dibujo. Las ubicaciones de esta cuadrícula se definen mediante las coordenadas del área de dibujo: ( X ,Y ) Donde el valor de X es la ubicación del punto sobre el “eje X”, con la ubicación predeterminada (cero) en el extremo izquierdo. El valor de Y es la ubicación del punto sobre el eje Y , con la ubicación predeterminada (cero) en el extremo superior. Este sistema de coordenadas se ilustra siguiente figura: Pág. 193 en la El sistema de coordenadas de Visual Basic tiene las siguientes reglas: • El sistema de coordenadas predeterminado de cualquier contenedor empieza por la coordenada (0, 0) en la esquina superior izquierda del contenedor. • Las unidades ubicaciones de a colectivamente medida lo utilizadas largo “escala”. de En para los Visual ejes Basic, definir se las denominan cada eje del sistema de coordenadas puede tener su propia escala. • Todos los métodos gráficos utilizan el sistema de coordenadas del contenedor. Por ejemplo, las instrucciones que dibujan dentro de un cuadro de imagen utilizan el sistema de coordenadas de dicho control. Establecer las coordenadas de dibujo Para establecer las coordenadas de dibujo del contenedor se utilizan las propiedades CurrentX y CurrentY de contenedor. Pág. 194 dicho Por ejemplo, las instrucciones siguientes establecen las coordenadas de dibujo a la esquina superior izquierda de un cuadro de imagen: Picture1.CurrentX = 0 Picture1.CurrentY = 0 De forma predeterminada, los formularios y los cuadros de imagen utilizan un sistema de coordenadas en el que cada unidad corresponde a un “twip” (1 440 twips equivalen a una pulgada y 567 twips son aproximadamente un centímetro). Cambiar la unidad de medida del sistema de coordenadas Para cambiar la unidad de medida del sistema de coordenadas su establece la propiedad ScaleMode a uno de los valores enumerados en la tabla siguiente: Valor de Descripción ScaleMode 1 Twips 2 Puntos 3 Pixeles 4 Caracteres 5 Pulgadas 6 Milímetros 7 Centímetros Pág. 195 Por ejemplo la siguiente orden establece la escala a pulgadas de un cuadro de imagen: Picture1.ScaleMode = 5 Crear una escala personalizada Para crear una escala personalizada se pueden utilizar las propiedades ScaleLeft, ScaleTop, ScaleWidth y ScaleHeight de un determinado objeto. Las propiedades ScaleLeft y ScaleTop asignan valores numéricos a la esquina superior izquierda de un objeto. Por ejemplo, las instrucciones siguientes establecen el valor de la esquina superior izquierda de un cuadro de imagen: Picture1.ScaleLeft = 100 Picture1.ScaleTop = 100 Las propiedades ScaleWidth y ScaleHeight definen las unidades según el ancho y el alto real del área de dibujo (si el objeto cambia de tamaño posteriormente, las unidades siguen siendo las mismas). Por ejemplo las instrucciones siguientes definen la unidad horizontal como 1/1 000 del ancho interno actual del cuadro de imagen y la unidad vertical como 1/500 del alto interno actual del cuadro de imagen: Picture1.ScaleWidth = 1000 Picture1.ScaleHeight = 500 Pág. 196 A manera de ejemplo considere la escala mostrada en la siguiente figura, la cual tiene ScaleLeft, ScaleTop, ScaleWidth y ScaleHeight establecidas todas a 100. Una forma más eficiente de personalizar la escala de un sistema de coordenadas es utilizando el método Scale. Su sintaxis es: OBJETO.Scale (X1, Y1) – (X2, Y2) Donde los valores de (X1, Y1) determinan las coordenadas de la esquina superior izquierda, los valores de (X2, Y2) determinan los valores de la esquina inferior derecha. Para obtener el mismo sistema de coordenadas de ejemplo anterior (donde se utilizó las propiedades ScaleLeft, ScaleTop, ScaleWidth y ScaleHeight) la orden sería la siguiente: Scale (100, 100)-(200, 200) Pág. 197 Donde es coordenadas evidente “X” y las que las diferencias dos coordenadas “Y” entre las dos determinan los valores de ScaleWidth y ScaleHeight, respectivamente. MÉTODOS GRÁFICOS Visual Basic proporciona varios métodos para la creación de gráficos. Los métodos gráficos, resumidos en la tabla siguiente, son aplicables a los formularios y a los cuadros de imagen. Método Descripción Cls Borra todos los gráficos y el resultado del método Print. Pset Dibuja un punto individual. Point Devuelve el color de un punto especificado. Line Dibuja una línea, un rectángulo o un cuadro relleno. Circle Dibuja una círculo, una elipse o un arco. PaintPicture Dibuja gráficos en ubicaciones arbitrarias. Print Imprime texto en formularios y cuadros de imagen. Para que la mayoría de los métodos gráficos funcionen correctamente la propiedad AutoRedraw del formulario debe está activada, caso contrario el dibujo no se visualizará. Puntos Pág. 198 Para el dibujo de puntos se usará el método Pset, cuya sintaxis es: OBJETO.Pset (X, Y), COLOR Donde X, Y son valores de tipo Single que indican las coordenadas horizontal (eje X) y vertical (eje Y) del punto que se va a dibujar. COLOR es un entero largo (Long) que indica el color RGB especificado para el punto, si se omite se usará el valor actual de la propiedad ForeColor de OBJETO. Como ejemplo vamos a crear una sencilla aplicación que permita dibujar puntos en la posición especificada mediante el ratón, con la posibilidad de poder seleccionar colores (tipo “Paint”). Pág. 199 Para el desarrollo de la presente aplicación proceda a crear un nuevo proyecto y agregar al formulario 34 cuadros de imagen. Luego ingresar el código mostrado. Objeto Nombre Picture1 . . . Picture32 PicColor Descripción Opciones de color Picture33 PicMuestra Color actual utilizado Picture34 PicLienzo Area de dibujo Dim COLOR As Single Private Sub Form_Load() PicLienzo.ScaleMode = 3 PicLienzo.DrawWidth = 5 COLOR = RGB(0, 0, 0) End Sub Private Sub PicColor_Click(Index As Integer) COLOR = PicColor(Index).BackColor PicMuestra.BackColor = COLOR End Sub Private Sub PicLienzo_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then PicLienzo.PSet (X, Y), COLOR End If End Sub Pág. 200 En el ejemplo anterior se utiliza la propiedad DrawWidth, la cual sirve para fijar el tamaño del punto dibujado. Para que el método Pset funcione correctamente la propiedad ScaleMode debe estar establecida a pixeles. Líneas, rectángulos y cuadros rellenos Para dibujar líneas, rectángulos o cuadros rellenos utilice el método Line, cuya sintaxis es: OBJETO.Line (X1, Y1) - (X2, Y2), COLOR, B/BF Donde X1, Y1 son valores de tipo Single que indican las coordenadas del punto inicial para la línea o el rectángulo. X2, Y2 son valores de tipo Single que indican las coordenadas del punto final para la línea o el rectángulo que se está dibujando. COLOR es un entero largo (Long) que indica el color RGB especificado para dibujar la línea, si se omite se usará el valor actual de la propiedad ForeColor de OBJETO. Los parámetros B y BF son opcionales: B hace que se dibuje un rectángulo usando las coordenadas para especificar las esquinas opuestas del mismo. BF especifica que el cuadro se rellena con el mismo color especificado mediante el parámetro COLOR. A manera de ejemplo vamos a mejorar nuestro sencillo “Editor gráfico”, de tal forma que además de dibujar puntos permita también dibujar líneas cuando se mantenga pulsado el botón izquierdo del ratón. Pág. 201 Para lograr nuestro cometido añadir el siguiente código a la aplicación anterior: Private Sub PicLienzo_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then PicLienzo.Line -(X, Y), COLOR End If End Sub Otro ejemplo sencillo para ilustrar como se usa el método Line para dibujar rectángulos y cuadros rellenos se presenta a continuación, consiste en dibujar una bandera directamente sobre el formulario, en este caso será la bandera de mi país: Perú. Pág. 202 Para este ejemplo crear una nueva aplicación e ingresar el código mostrado: Private Sub Form_Click() Height = 3 * 1440 Width = 5 * 1440 BackColor = QBColor(12) ForeColor = QBColor(15) Line (Width / 3, 0) - ((Width / 3) * 2, Height), , BF End Sub Círculos, elipses y arcos Para dibujar círculos, elipses o arcos se utiliza método Circle, cuya sintaxis es: OBJETO.Circle (X, Y), RADIO, COLOR, INICIO, FIN, ASPECTO Pág. 203 el Donde X, Y son valores de tipo Single que indican las coordenadas para el punto central del círculo, elipse o arco. RADIO es un valor de tipo Single que indica el radio del círculo, elipse o arco. COLOR es un valor entero de tipo Long que indica el color RGB del contorno del círculo, elipse o arco (es opcional). INICIO y FIN son valores de tipo Single, que especifican (en radianes) las posiciones de inicio y de fin del arco (son opcionales). ASPECTO es un valor de tipo Single que indica la relación de aspecto del círculo, el valor predeterminado es 1.0, lo que produce un círculo perfecto (no elíptico) en cualquier pantalla (opcional). A manera de ejemplo vamos a mejor aún más nuestro “Editor gráfico” de tal manera que se podrá dibujar puntos, líneas, rectángulos, círculos y elipses. Pág. 204 Para el desarrollo de la presente aplicación se debe añadir al ejemplo anterior 5 botones de comandos y formar una matriz de controles (CmdForma). Luego ingresar el siguiente código: Dim COLOR As Single Dim FORMA As Integer Dim X1 As Single, Y1 As Single, X2 As Single, Y2 As Single Private Sub CmdForma_Click(Index As Integer) FORMA = Index + 1 End Sub Private Sub Form_Load() COLOR = RGB(0, 0, 0) FORMA = 1 PicLienzo.ScaleMode = 3 PicLienzo.DrawWidth = 3 End Sub Private Sub PicColor_Click(Index As Integer) COLOR = PicColor(Index).BackColor PicMuestra.BackColor = COLOR End Sub Private Sub PicLienzo_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If Button = vbLeftButton Then X1 = X Y1 = Y End If End Sub Pág. 205 Private Sub PicLienzo_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If Button = vbLeftButton Then X2 = X Y2 = Y RADIO = Sqr((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2)) / 2 Select Case FORMA Case 1 PicLienzo.PSet (X, Y), COLOR Case 2 PicLienzo.Line -(X, Y), COLOR Case 3 PicLienzo.Line (X1, Y1)-(X2, Y2), COLOR, B Case 4 PicLienzo.Circle (X, Y), RADIO, COLOR Case 5 PicLienzo.Circle (X, Y), RADIO, COLOR, , , 0.5 End Select End If End Sub CONTROLES GRÁFICOS Visual Basic proporciona tres controles gráficos diseñados para crear efectos gráficos en las aplicaciones: • Control Image (estudiado en el Capítulo 4) • Control Line • Control Shape Pág. 206 Control Line Line es un control gráfico que se muestra como una línea horizontal, vertical o diagonal. El control Line tiene una funcionalidad limitada y está pensado para usos sencillos. Para usos más avanzados debe usar el método Line. Propiedad Descripción BorderColor Devuelve o establece el color de la línea. BorderStyle Devuelve o establece el estilo de la línea. BorderWidth Devuelve o establece el ancho de la línea. X1, Y1, X2, Y2 Devuelven o establecen las coordenadas del punto inicial (X1, Y1) y del punto final (X2, Y2) de la línea. Control Shape Shape es un control gráfico que se muestra como un rectángulo, un cuadrado, una elipse, un círculo, un rectángulo redondeado o un cuadrado redondeado. El control Shape presenta propiedades similares al control Line (BorderColor, BorderStyle, BorderWidth). Adicionalmente, la propiedad Shape del control Shape proporciona seis formas predefinidas. En la tabla siguiente se enumeran todas las formas predefinidas, sus valores y las constantes de Visual Basic equivalentes: Pág. 207 Forma Estilo Constante Rectángulo 0 vbShapeRectangle Cuadrado 1 vbShapeSquare Elipse 2 vbShapeOval Círculo 3 vbShapeCircle Rectángulo redondeado 4 vbShapeRoundedRectangle Cuadrado redondeado 5 vbShapeRoundedSquare Las seis formas predefinidas que presenta el control Shape se muestran en el siguiente formulario: GRAFICACIÓN MATEMÁTICA Como la mayor parte de las ecuaciones matemáticas expresa relaciones complicadas en una, dos tres o más dimensiones, tratar de entenderlas sin gráficas es casi lo mismo que tratar de caminar con los ojos vendados. Funciones algebraicas Pág. 208 Como ejemplo de este tipo de gráficas vamos a dibujar una parábola, cuya ecuación matemática (ecuación general de segundo grado) es de la forma: f ( x) = Ax 2 + Bx + C Para realizar la presente aplicación crear un nuevo proyecto y añadir al formulario un cuadro de imagen (PicPlano), tres cuadros de texto (TxtA, TxtB, TxtC) y un botón de comandos (CmdVisualizar). Los aspectos decorativos (etiquetas, marcos, etc.) quedan a criterio del lector. Luego ingresar el siguiente código: Dim A As Double, B As Double, C As Double Pág. 209 Function F(ByVal X As Single) As Single F = A * (X * X) + B * X + C End Function Private Sub CmdVisualizar_Click() Dim X As Single A = TxtA B = TxtB C = TxtC PicPlano.Cls PicPlano.Scale (-100, 100)-(100, -100) PicPlano.Line (-100, 0)-(100, 0) PicPlano.Line (0, -100)-(0, 100) PicPlano.CurrentX = -10 PicPlano.CurrentY = F(-10) For X = -10 To 10 PicPlano.Line -(X, F(X)) Next End Sub Funciones trigonométricas Graficar tangente, funciones cotangente, trigonométricas secante, cosecante) (seno, no coseno, es complicado, sino analice el siguiente ejemplo. Pág. 210 nada Para realizar nuestra aplicación de ejemplo crear un nuevo proyecto y añadir al formulario un cuadro de imagen (PicPlano) y 6 botones de comandos (CmdFuncion, es decir se trata de una matriz de controles). Luego ingresar el código siguiente: Private Sub CmdFuncion_Click(Index As Integer) PicPlano.Cls Dibuja (Index) End Sub Private Sub Dibuja(OP As Integer) PicPlano.Scale (-5, 5)-(5, -5) PicPlano.Line (-5, 0)-(5, 0) PicPlano.Line (0, -5)-(0, 5) DosPi = 8 * Atn(1) Pág. 211 Dim X As Single For X = -DosPi To DosPi Step 0.025 Select Case OP Case 0 Y = Sin(X) Case 1 Y = Cos(X) Case 2 Y = Sin(X) / Cos(X) Case 3 If X < -0.001 Or X > 0.001 Then Y = Cos(X) / Sin(X) End If Case 4 Y = 1 / Cos(X) Case 5 If X < -0.001 Or X > 0.001 Then Y = 1 / Sin(X) End If End Select PicPlano.PSet (X, Y) Next End Sub Gráficas en coordenadas polares Pág. 212 Para el caso de las gráficas de ecuaciones polares tampoco es complicado, sólo hay que tener presente las siguientes consideraciones. Dado un punto P( x, y ) del plano, tal punto se encuentra a una distancia r del origen, y a un ángulo θ respecto del semieje horizontal positivo. De la gráfica se tiene que el punto P tiene coordenadas rectangulares ( x, y ) y coordenadas polares (r , θ ) entonces cumplen las siguientes relaciones de transformación: x = r cos θ y = r senθ De donde: r 2 = x 2 + y 2 ; tan θ = y x Pág. 213 se A continuación presentamos algunas ecuaciones polares características: Nombre Ecuación r= n Circunferencia de radio n Trébol de cuatro hojas r = 2 cos 2θ Cardioide r = 1 + cos θ r = 1 + 2 cos θ Limazón r 2 = cos 2θ Lemniscata r = sen 4θ Pétalo de rosa Espiral r= Espiral logarítmica θ 2n r = enθ Astroide r = (cos 2θ )3 Nefroide r = 3 cos 2θ − cos 6θ Concoide r= Estrofoide Para ecuaciones r= realizar una polares crear 1 + 1 cos 2θ 1 cos 2θ + tan 2θ aplicación un nuevo que permita proyecto y dibujar añadir al formulario 1 cuadro de imagen (PicPlano), un cuadro de lista (LstEcuacion) y un botón de comandos (CmdVisualizar). La apariencia de la interfaz debe ser similar a la de la figura mostrada: Pág. 214 Luego proceda a ingresar el código que se presenta continuación: Dim OP As Integer Function F(ByVal THETA As Single) As Single Select Case OP Case 0 : F = 2 Case 1 : F = 2 * Cos(2 * THETA) Case 2 : F = 1 + Cos(THETA) Case 3 : F = 1 + 2 * Cos(THETA) Case 4 : If Cos(2 * THETA) >= 0 Then F = Sqr(Cos(2 * THETA)) Case 5 : F = Sin(4 * THETA) Case 6 : F = THETA / 2 Case 7 : F = Exp(THETA / 8) Case 8 : F = Cos(2 * THETA) * Cos(2 * THETA) * Cos(2 * THETA) Pág. 215 a Case 9 : F = 3 * Cos(2 * THETA) - Cos(6 * THETA) Case 10: F = 1 / Cos(2 * THETA) + 1 Case 11: If Int(THETA / 45) <> THETA / 45 Or THETA <> 0 _ Then F = 1 / (Cos(2 * THETA) + Tan(2 * THETA)) End Select End Function Private Sub LstEcuacion_Click() OP = LstEcuacion.ListIndex End Sub Private Sub CmdVisualizar_Click() Dim X As Single, Y As Single Dim I As Single, R As Single DosPi = 8 * Atn(1) PicPlano.Cls PicPlano.ScaleMode = 3 PicPlano.Scale (-3.25, 3.25)-(3.25, -3.25) PicPlano.Line (-3.25, 0)-(3.25, 0) PicPlano.Line (0, -3.25)-(0, 3.25) For I = 0 To DosPi Step 0.01 R = F(I) X = R * Cos(I) Y = R * Sin(I) PicPlano.PSet (X, Y), QBColor(1) Next End Sub Fractales Pág. 216 La matemática fractal es producto de la interacción de un matemático genial (Benoit B. Mandelbrot) y la computadora. El ahora ubicuo término fractal se debe al hecho de que la matemática generadas fractal no tienen trabaja con fracciones, una relación de las enteros figuras entre sus componentes, de modo que ninguna dimensión es producto de otra multiplicada por un entero. Es decir, al dividir una dimensión entre otra nunca se obtiene un resultado exacto. Los fractales generan figuras y estas figuras resultan tener una extraña similitud con algunas formas que genera la naturaleza. Entre las ecuaciones para generar fractales Mandelbrot ha producido una en particular que ha recibido el nombre de “Conjunto de Mandelbrot”. Esta ecuación se resuelve en el campo de los números comprendidos entre las longitudes -2.0 a +0.5 y las latitudes -1.25 a +1.25, está dominado por un gran mar fractal con bahías y entrantes. La expresión matemática del Conjunto de Mandelbrot es: Z n +1 = Z n2 + C Donde C es un número complejo constante y Z es un número complejo variable que permite obtener las respectivas iteraciones (los valores de cada punto del paisaje fractal, latitud y longitud). Pág. 217 Como ejemplo iteraciones. Para vamos ello a obtener asignamos las valores a tres C de primeras cualquier posición arbitraria dentro del conjunto, digamos C = 1 + i y para arrancar las iteraciones podemos comenzar con Z 0 = 0 , luego: Z1 = (0) 2 + (1 + i ) = 1 + i Z 2 = (1 + i ) 2 + (1 + i ) = 1 + 3i Z 3 = (1 + 3i )2 + (1 + i ) = − 7 + 7i Cuando se continua desarrollando el Conjunto de Mandelbrot se obtiene una figura similar a la mostrada: Pág. 218 Para el desarrollo de la presente aplicación crear un nuevo proyecto y añadir sobre el formulario un cuadro de imagen (PicPlano) y un botón de comandos (CmdVisualizar), luego ingresar el código siguiente: Function Hipotenusa(ByVal A As Double, ByVal B As Double) As Double Hipotenusa = Sqr(A * A + B * B) End Function Private Sub CmdVisualizar_Click() Dim MaxX As Integer, MaxY As Integer Dim Limite As Integer, Pasos As Integer Dim I As Integer, J As Integer Dim PasoX As Double, PasoY As Double Dim PosX As Double, PosY As Double Dim OrigX As Double, OrigY As Double Dim DimX As Double, DimY As Double Dim IterX As Double, IterY As Double, TempX As Double Dim Terminar As Boolean PicPlano.ScaleMode = 3 MaxX = PicPlano.ScaleWidth MaxY = PicPlano.ScaleHeight Limite = 16 OrigX = -2 OrigY = -1.25 DimX = 0.5 DimY = 1.25 PasoX = (DimX - OrigX) / MaxX Pág. 219 PasoY = (DimY - OrigY) / MaxY For I = 0 To MaxX For J = 0 To MaxY PosX = OrigX + I * PasoX PosY = OrigY + J * PasoY IterX = 0 : IterY = 0 Terminar = False Pasos = 0 While (Not Terminar) TempX = (IterX * IterX) - (IterY * IterY) + PosX IterY = 2 * (IterX * IterY) + PosY IterX = TempX Pasos = Pasos + 1 If Hipotenusa(Abs(IterX), Abs(IterY)) >= 2 Then Terminar = True End If If (Pasos >= Limite) Then Terminar = True End If Wend If (Pasos < Limite) Then PicPlano.PSet (I, J), QBColor(Pasos) End If Next Next End Sub Pág. 220 En este capítulo, debido a las limitaciones de espacio y materia, tan sólo se ofrece el camino de acceso a unos pocos de los diversos temas que abarca el fascinante mundo de la programación de gráficos por computadora. Muchos de estos temas siguen siendo materia de investigación (como el caso de los fractales), por lo que si Ud. desea profundizar en este laberinto de fascinación, no hay la garantía de un retorno sano y salvo a nuestro universo mundano. Pág. 221 GUÍA DE LABORATORIO Parte I ELABORADO POR CARLOS CASTILLO PERALTA [email protected] INTRODUCCIÓN Pág. 222 La presente Guía de Laboratorio de Microsoft Visual Basic, se elaboró con la finalidad de complementar la parte teórica con la parte práctica del curso. Los problemas presentan un grado de dificultad gradual, es decir, en cada práctica primero se comienzan con problemas muy sencillos con la finalidad de que el estudiante esclarezca dudas y quede claro en los conceptos asimilados en la teoría, y luego en los problemas posteriores se va incrementando el nivel de dificultad. Esta guía explora una gran variedad de materias y contiene muchos problemas experiencia. recopilados Espero que a lo largo satisfaga las de varios necesidades años de de los estudiantes y colegas, ya que ha sido elaborada teniendo en cuenta los objetivos de aprendizaje del curso. Si desean compartirla con otros colegas, me agradaría mucho que lo hicieran, con la única condición de que siempre se respete el derecho del autor. Desde ya les deseo la mejor de las suertes en el aprendizaje de Microsoft Visual Basic. Lima, Diciembre del 2000 Carlos Castillo Peralta Microsoft Visual Basic Pág. 223 GUÍA DE LABORATORIO Nº 1 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Identificar los elementos del entorno integrado de desarrollo de Microsoft Visual Basic 6.0. • Añadir controles a un formulario. • Establecer las propiedades de los controles. • Trabajar con procedimientos de eventos. • Crear una aplicación simple con Microsoft Visual Basic. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab1, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Elaborar una aplicación que permita calcular el salario neto de un trabajador en función del número de horas trabajadas, pago por hora de trabajo y un descuento fijo al sueldo bruto del 20 por 100. Los cálculos a efectuar para obtener el salario neto de un trabajador se muestran a continuación: SalarioBruto = HorasTrabajadas * PagoPorHora Descuento = 0.2 * SalarioBruto SalarioNeto = SalarioBruto - Descuento El diseño de la interfaz debe ser similar a la figura mostrada: Pág. 224 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 2 marcos 6 etiquetas 6 cajas de texto 3 botones de comando Una vez ubicados los controles, establezca las propiedades según se indica: Form1 Nombre FrmSalarioNeto BorderStyle 3-Fixed Dialog Caption Cálculo del salario neto Moveable False StartUpPosition 2-CenterScreen Frame1 Nombre FraIngreso Pág. 225 Caption Ingreso de datos: Frame2 Nombre FraSalida Caption Salida de datos: Label1 Nombre LblApellidosNombres AutoSize True Caption Apellidos y nombres: Label2 Nombre LblHorasTrabajadas AutoSize True Caption Horas trabajadas: Label3 Nombre LblPagoPorHora AutoSize True Caption Pago por hora S/. Label4 Nombre LblSalarioBruto AutoSize True Caption Salario bruto S/. Label5 Nombre LblDescuento AutoSize True Caption Descuento S/. Label6 Nombre LblSalarioNeto Pág. 226 AutoSize True Caption Salario neto S/. Nombre TxtApellidosNombres Text1 Text Text2 Nombre TxtHorasTrabajadas Text Text3 Nombre TxtPagoPorHora Text Text4 Nombre TxtSalarioBruto Text Text5 Nombre TxtDescuento Text Text6 Nombre TxtSalarioNeto Text Command1 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdLimpiar Pág. 227 Caption &Limpiar Command3 Nombre CmdSalir Caption &Salir Luego de establecer las propiedades para los controles, debe añadir código a la aplicación. Para ello haga doble click sobre el botón Aceptar e ingrese el siguiente código: Private Sub CmdAceptar_Click() Dim HorasTrabajadas As Integer, PagoPorHora As Double Dim SalarioBruto As Double Dim Descuento As Double Dim SalarioNeto As Double HorasTrabajadas = Val(TxtHorasTrabajadas) PagoPorHora = Val(TxtPagoPorHora) SalarioBruto = HorasTrabajadas * PagoPorHora Descuento = 0.2 * SalarioBruto SalarioNeto = SalarioBruto - Descuento TxtSalarioBruto = Str(SalarioBruto) TxtDescuento = Str(Descuento) TxtSalarioNeto = Str(SalarioNeto) End Sub A continuación haga doble click sobre el botón Salir y añada el siguiente código: Private Sub CmdSalir_Click() End End Sub Guarde y luego ejecute la aplicación que acaba de crear. Pruebe ingresando diferentes valores. Pág. 228 Luego, haga doble click sobre el botón Limpiar y añada el siguiente código: Private Sub CmdLimpiar_Click() TxtApellidosNombres = “” TxtHorasTrabajadas = “” TxtPagoPorHora = “” TxtSalarioBruto = “” TxtDescuento = “” TxtSalarioNeto = “” TxtApellidosNombres.SetFocus End Sub Guarde y ejecute su aplicación. ¿Cómo afecta el código añadido en el botón Limpiar a la aplicación?. Anote sus observaciones. Aplicación Nº 2 El menú de un restaurante rápido se muestra a continuación: MENÚ Se desea construir una PRECIO (S/.) Hamburguesa 2.50 aplicación que calcule las Cerveza 4.00 ventas totales al final del Gaseosa 3.00 día, así como los impuestos Ensalada 1.50 Salchichas 2.00 La interfaz de entrada Refresco 1.00 y salida deberá ser similar Sopa 1.50 a Postre 1.50 continuación: a pagar (18 por 100). la figura mostrada Pág. 229 a Para el diseño del cuadro de menú utilizaremos el control Microsoft Hierarchical FlexGrid. Para tal fin, seleccione el Menú Proyecto y elija la opción Componentes: Pág. 230 A continuación active la casilla de verificación Microsoft Hierarchical FlexGrid Control 6.0 OLEDB y haga click sobre el botón Aceptar. En seguida este control se añadirá al Cuadro de Herramientas. Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 10 etiquetas 10 cajas de texto 1 control MSHFlexGrid 3 botones de comando En seguida, elabore el diseño de entrada y salida. Para ello proceda a establecer las propiedades según se indica a continuación: Form1 Nombre FrmRestaurante BorderStyle 3-Fixed Dialog Caption Restaurante Moveable False StartUpPosition 2-CenterScreen Label1 Nombre LblHamburguesa AutoSize True Caption Hamburguesa: Label2 Nombre LblCerveza AutoSize True Caption Cerveza: Pág. 231 Label3 Nombre LblGaseosa AutoSize True Caption Gaseosa: Label4 Nombre LblEnsalada AutoSize True Caption Ensalada: Label5 Nombre LblSalchichas AutoSize True Caption Salchichas: Label6 Nombre LblRefresco AutoSize True Caption Refresco: Label7 Nombre LblSopa AutoSize True Caption Sopa: Label8 Nombre LblPostre AutoSize True Caption Postre: Label9 Nombre LblVentaTotal Caption Venta total S/. Pág. 232 Label10 Nombre LblImpuesto Caption Impuesto S/. MSHFlexGrid1 Nombre GrdMenu Font Arial (Negrita 10) FontFixed Arial (Negrita 10) Nombre TxtHamburguesa Text1 Text Text2 Nombre TxtCerveza Text Text3 Nombre TxtGaseosa Text Text4 Nombre TxtEnsalada Text Text5 Nombre TxtSalchichas Text Text6 Nombre TxtRefresco Text Pág. 233 Text7 Nombre TxtSopa Text Text8 Nombre TxtPostre Text Text9 Nombre TxtVentaTotal Locked True Text Text10 Nombre TxtImpuesto Locked True Text Command1 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Caption &Salir Picture C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Icons\Arrows\Point04.ico Style 1-Graphical Pág. 234 En primer lugar debemos cargar los datos a la cuadrícula. Esto lo vamos a realizar en tiempo de ejecución al momento de cargarse en memoria el formulario. Para ello, haga doble click sobre el formulario y añada el siguiente código: Private Sub Form_Load() GrdMenu.Cols = 2 GrdMenu.Rows = 9 GrdMenu.FixedCols = 0 GrdMenu.FixedRows = 1 GrdMenu.TextArray(0) = “Menú” GrdMenu.TextArray(1) = “Precio” GrdMenu.TextArray(2) = “Hamburguesa” GrdMenu.TextArray(3) = “2.50” GrdMenu.TextArray(4) = “Cerveza” GrdMenu.TextArray(5) = “4.00” GrdMenu.TextArray(6) = “Gaseosa” GrdMenu.TextArray(7) = “3.00” GrdMenu.TextArray(8) = “Ensalada” GrdMenu.TextArray(9) = “1.50” GrdMenu.TextArray(10) = “Salchichas” GrdMenu.TextArray(11) = “2.00” GrdMenu.TextArray(12) = “Refresco” GrdMenu.TextArray(13) = “1.00” GrdMenu.TextArray(14) = “Sopa” GrdMenu.TextArray(15) = “1.50” GrdMenu.TextArray(16) = “Postre” GrdMenu.TextArray(17) = “1.50” End Sub Luego debemos añadir el código que se encargará de realizar los cálculos. Para tal fin haga doble click sobre el botón Aceptar y proceda a ingresar lo siguiente: Pág. 235 Private Sub CmdAceptar_Click() Dim Hamburguesa As Integer, Cerveza As Integer Dim Gaseosa As Integer, Ensalada As Integer Dim Salchichas As Integer, Refresco As Integer Dim Sopa As Integer, Postre As Integer Dim VentaTotal As Double, Impuesto As Double Hamburguesa = Val(TxtHamburguesa) Cerveza = Val(TxtCerveza) Gaseosa = Val(TxtGaseosa) Ensalada = Val(TxtEnsalada) Salchichas = Val(TxtSalchichas) Refresco = Val(TxtRefresco) Sopa = Val(TxtSopa) Postre = Val(TxtPostre) VentaTotal = Hamburguesa * 2.5 + Cerveza * 4.0 _ + Gaseosa * 3.0 + Ensalada * 1.5 + Salchichas * 2.0 _ + Refresco * 1.0 + Sopa * 1.5 + Postre * 1.5 Impuesto = 0.18 * VentaTotal TxtVentaTotal = Str(VentaTotal) TxtImpuesto = Str(Impuesto) End Sub Luego, haga doble click sobre el botón Limpiar y añada el siguiente código: Private Sub CmdLimpiar_Click() TxtHamburguesa = “” : TxtCerveza = “” TxtGaseosa = “” : TxtEnsalada = “” TxtSalchichas = “” : TxtRefresco = “” TxtSopa = “” : TxtPostre = “” TxtVentaTotal = “” : TxtImpuesto = “” TxtHamburguesa.SetFocus End Sub Pág. 236 A continuación haga doble click sobre el botón Salir y añada el siguiente código: Private Sub CmdSalir_Click() End End Sub Aplicación Nº 3 Elaborar una aplicación que permita calcular la edad de una persona a partir de su fecha de nacimiento. El diseño de la interfaz debe ser similar a la figura mostrada: Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 2 etiquetas 2 cajas de texto 3 botones de comando Luego, proceda a establecer las propiedades según indica a continuación: Form1 Nombre FrmEdad BorderStyle 3-Fixed Dialog Caption Calcula la edad de una persona Pág. 237 se Label1 Nombre LblFecNac AutoSize True Caption Fecha de nacimiento: Label2 Nombre LblEdad AutoSize True Caption Su edad es: Nombre TxtFecNac Text1 Text Text2 Nombre TxtEdad Locked True Text Command1 Nombre CmdAceptar Caption &Aceptar Default True Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Cancel True Caption &Salir En seguida proceda a ingresar el siguiente código: Pág. 238 Private Sub CmdAceptar_Click() Dim FecNac As Date, Edad As Integer FecNac = CDate(TxtFecNac) Edad = CInt((Date - FecNac) / 365) TxtEdad = Str(Edad) & “ años” End Sub Se deja como ejercicio para el estudiante el código asociado con los botones Limpiar y Salir, respectivamente. Aplicación Nº 4 Se tiene un cajero automático el cual permite manipular cierta cantidad siguientes de billetes: dinero para S/. 10.00, lo cual S/. dispone 20.00, de S/. los 50.00, S/. 100.00 y S/. 200.00. Elaborar una aplicación que permita la lectura de la cantidad a retirar e indique el menor número de billetes a utilizar. Creo que a estas alturas Ud. ya entendió como funciona esto. Por ello, esta aplicación se deja como ejercicio para el estudiante. Pág. 239 Microsoft Visual Basic GUÍA DE LABORATORIO Nº 2 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Implementar aplicaciones utilizando estructuras de control selectivas. • Usar casillas de verificación y botones de opción para alternar entre uno o más valores. • Utilizar cajas de diálogo predefinidas para visualizar mensajes. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab2, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Se desea elaborar la boleta de pago de los trabajadores de una fábrica. Para ello se cuenta con los siguientes datos de entrada: Apellidos y nombres del trabajador Sueldo básico Horas extras trabajadas Además, se sabe que los trabajadores laboran en dos turnos: diurno y nocturno. Y que la tarifa por las horas extras diurnas es de 10 soles y por las horas extras nocturnas es de 15 soles. Pág. 240 Los descuentos a aplicar son sobre el sueldo básico y se obtienen de la siguiente manera: Renta = SueldoBasico * 0.1 Fonavi = SueldoBasico * 0.07 AFP = SueldoBasico * 0.03 Finalmente el sueldo neto del trabajador se calcula mediante las siguientes expresiones: Ingresos = SueldoBasico + HorasExtras * PagoHoraExtra Egresos = Renta + Fonavi + AFP SueldoNeto = Ingresos - Egresos El diseño de la interfaz deberá ser similar a la figura mostrada: Pág. 241 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 2 marcos 5 etiquetas 8 cajas de texto 2 botones de opción 3 casillas de verificación 3 botones de comando Luego, proceda a establecer las propiedades según indica a continuación: Form1 Nombre FrmBoletaDePago BorderStyle 3-Fixed Dialog Caption Boleta de pago Moveable False Label1 Nombre LblTrabajador AutoSize True Caption Trabajador: Label2 Nombre LblSueldoBasico AutoSize True Caption Sueldo Bruto S/. Label3 Nombre LblHorasExtras AutoSize True Caption Horas extras: Pág. 242 se Label4 Nombre LblPagoHoraExtra AutoSize True Caption Pago hora extra S/. Label5 Nombre LblSueldoNeto AutoSize True Caption Sueldo neto S/. Nombre TxtTrabajador Text1 Text Text2 Nombre TxtSueldoBasico Text Text3 Nombre TxtHorasExtras Text Text4 Nombre TxtPagoHoraExtra BackColor &H80000004& Text Text5 Nombre TxtRenta BackColor &H80000004& Locked True Text Pág. 243 Text6 Nombre TxtFonavi BackColor &H80000004& Locked True Text Text7 Nombre TxtAFP BackColor &H80000004& Locked True Text Text8 Nombre TxtSueldoNeto BackColor &H80000004& Locked True Text Option1 Nombre OptDiurno Caption Diurno Value True Option2 Nombre OptNocturno Caption Nocturno Value False Check1 Nombre ChkRenta Caption Renta Check2 Pág. 244 Nombre ChkFonavi Caption Fonavi Check3 Nombre ChkAFP Caption AFP Command1 Nombre CmdAceptar Caption &Aceptar Default True Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Cancel True Caption &Salir Una vez establecidas las propiedades, proceda a ingresar el código que se indica a continuación: Private Sub CmdAceptar_Click() Dim SueldoBasico As Double Dim HorasExtras As Integer, PagoHoraExtra As Double Dim Renta As Double, Fonavi As Double, AFP As Double Dim Ingresos As Double, Egresos As Double Dim SueldoNeto As Double SueldoBasico = Val(TxtSueldoBasico) HorasExtras = Val(TxtHorasExtras) If OptDiurno Then Pág. 245 PagoHoraExtra = 10 End If If OptNocturno Then PagoHoraExtra = 15 End If If ChkRenta.Value Then Renta = SueldoBasico * 0.1 Else Renta = 0 End If If ChkFonavi.Value Then Fonavi = SueldoBasico * 0.07 Else Fonavi = 0 End If If ChkAFP.Value Then AFP = SueldoBasico * 0.03 Else AFP = 0 End If Ingresos = SueldoBasico + HorasExtras * PagoHoraExtra Egresos = Renta + Fonavi + AFP SueldoNeto = Ingresos - Egresos TxtPagoHoraExtra = Str(PagoHoraExtra) TxtRenta = Str(Renta) TxtFonavi = Str(Fonavi) : TxtAFP = Str(AFP) TxtSueldoNeto = Str(SueldoNeto) End Sub Private Sub CmdSalir_Click() End End Sub Aplicación Nº 2 Pág. 246 Cuatro notas entre 0 y 20 representan las calificaciones de un estudiante de un curso de programación. Elaborar una aplicación para obtener el promedio de esas calificaciones y visualizar su puntuación de acuerdo al siguiente cuadro: Promedio Puntuación 19-20 A 16-18 B 11-15 C 6-10 D 0-5 E El diseño de la interfaz deberá ser similar a la figura mostrada: Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 7 etiquetas 7 cajas de texto 3 botones de comando Pág. 247 Luego, proceda a establecer las propiedades según indica a continuación: Form1 Nombre FrmNotas BorderStyle 3-Fixed Dialog Caption Puntuación de un estudiante Label1 Nombre LblAlumno AutoSize True Caption Alumno: Label2 Nombre LblN1 AutoSize True Caption Nota 1: Label3 Nombre LblN2 AutoSize True Caption Nota 2: Label4 Nombre LblN3 AutoSize True Caption Nota 3: Label5 Nombre LblN4 AutoSize True Caption Nota 4: Pág. 248 se Label6 Nombre LblPromedio AutoSize True Caption Promedio: Label7 Nombre LblPuntuacion AutoSize True Caption Puntuación: Nombre TxtAlumno Text1 Text Text2 Nombre TxtN1 Text Text3 Nombre TxtN2 Text Text4 Nombre TxtN3 Text Text5 Nombre TxtN4 Text Pág. 249 Text6 Nombre TxtPromedio BackColor &H80000004& Locked True Text Text7 Nombre TxtPuntuacion BackColor &H80000004& Locked True Text Command1 Nombre CmdAceptar Caption &Aceptar Default True Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Cancel True Caption &Salir Una vez establecidas las propiedades, proceda a ingresar el código que se indica: Private Sub CmdAceptar_Click() Dim N1 As Double, N2 As Double, N3 As Double, N4 As Double Dim Promedio As Integer N1 = Val(TxtN1) : N2 = Val(TxtN2) Pág. 250 N3 = Val(TxtN3) : N4 = Val(TxtN4) Promedio = CInt((N1 + N2 + N3 + N4) / 4) TxtPromedio = Str(Promedio) If Promedio >= 19 And Promedio <= 20 Then TxtPuntuacion = “A” ElseIf Promedio >= 16 And Promedio <= 18 Then TxtPuntuacion = “B” ElseIf Promedio >= 11 And Promedio <= 15 Then TxtPuntuacion = “C” ElseIf Promedio >= 6 And Promedio <= 10 Then TxtPuntuacion = “D” ElseIf Promedio >= 0 And Promedio <= 5 Then TxtPuntuacion = “B” Else: MsgBox “Error de datos”, vbCritical, “Mensaje” End If End Sub Aplicación Nº 3 Escribir un aplicación que acepte fechas como tres números (dd, mm, aaaa) y las visualice del modo usual. A manera de ejemplo considere lo siguiente: Pág. 251 En caso de que el usuario ingrese algún dato incorrecto (por ejemplo 13 como un número de mes), se debe visualizar el siguiente mensaje: Cuando el usuario haga click en el botón Salir, se debe observar el siguiente mensaje: En caso de que el usuario elija la opción Si, la aplicación debe terminar. En caso contrario, es decir si el usuario elige la opción No, se debe proseguir con la aplicación. Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 4 etiquetas 3 cajas de texto 1 marco 3 botones de comando En seguida proceda a establecer las propiedades según se indica: Pág. 252 Form1 Nombre FrmFecha BorderStyle 3-Fixed Dialog Caption Fecha en letras Label1 Nombre LblDia AutoSize True Caption Día: Label2 Nombre LblMes AutoSize True Caption Mes: Label3 Nombre LblAnno AutoSize True Caption Año: Label4 Nombre LblFecha AutoSize True Caption Text1 Nombre TxtDia Text Text2 Nombre TxtMes Text Pág. 253 Text3 Nombre TxtAnno Text Command1 Nombre CmdAceptar Caption &Aceptar Default True Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Caption &Salir Una vez establecidas las propiedades de la interfaz proceda a ingresar el siguiente código: Private Sub CmdAceptar_Click() Dim CadMes As String, Mes As Integer Mes = Val(TxtMes) Select Case Mes Case 1: CadMes = “Enero” Case 2: CadMes = “Febrero” Case 3: CadMes = “Marzo” Case 4: CadMes = “Abril” Case 5: CadMes = “Mayo” Case 6: CadMes = “Junio” Case 7: CadMes = “Julio” Case 8: CadMes = “Agosto” Case 9: CadMes = “Setiembre” Pág. 254 Case 10: CadMes = “Octubre” Case 11: CadMes = “Noviembre” Case 12: CadMes = “Diciembre” Case Else MsgBox “Error de datos...”, vbCritical, “Mensaje” Call CmdLimpiar_Click Exit Sub End Select LblFecha = TxtDia & “ de ” & CadMes & “ de ” & TxtAnno End Sub Private Sub CmdLimpiar_Click() TxtDia = “” : TxtMes = “” : TxtAnno = “” TxtDia.SetFocus End Sub Private Sub CmdSalir_Click() If MsgBox(“¿Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Pregunta”) = vbYes Then End Else: Call CmdLimpiar_Click End If End Sub Aplicación Nº 4 Un restaurante ofrece un descuento del 10% para consumos entre S/. 30.00 y S/. 50.00; un descuento del 20% para consumos mayores a S/. 50.00 nuevos soles; para todos los demás casos no se aplica ningún tipo de descuento. Elaborar una aplicación que permita determinar el importe a pagar por el consumidor. El diseño de la interfaz y otras consideraciones se dejan a su criterio. Pág. 255 Microsoft Visual Basic GUÍA DE LABORATORIO Nº 3 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Implementar aplicaciones utilizando estructuras de control repetitivas. • Cambiar las propiedades de los controles en tiempo de ejecución. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab3, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Escribir una aplicación que lea un número entero y muestre la tabla de multiplicar de dicho número. El diseño de entrada y salida debe ser similar al siguiente: Pág. 256 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 1 etiqueta 2 cajas de texto 1 botón de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmTabla BorderStyle 3-Fixed Dialog Caption Tabla de multiplicar Label1 Nombre LblNumero Caption Ingrese un número: Nombre TxtNumero Text1 Text Text2 Nombre TxtTabla MultiLine True Locked True ScrollBars 2-Vertical Text Command1 Nombre CmdLimpiar Caption &Limpiar Pág. 257 Una vez diseñada la interfaz, proceda a ingresar el código que se indica a continuación: Private Sub TxtNumero_Change() If IsNumeric(TxtNumero) Then Dim N As Integer, P As Integer, I As Integer Dim S As String N = Val(TxtNumero) S = “” For I = 0 To 12 P = N * I S = S & N & “ * ” & I & “ = ” & P & vbCrLf Next I TxtTabla = S ElseIf TxtNumero = “” Then Exit Sub Else: MsgBox “Ingrese un número”, vbCritical, “Mensaje” TxtTabla = “” End If End Sub Private Sub CmdLimpiar_Click() TxtNumero = “” : TxtTabla = “” TxtNumero.SetFocus End Sub Aplicación Nº 2 Un número perfecto es un entero positivo, que es igual a la suma de todos los enteros positivos (excluido el mismo) que son divisores del número. El primer número perfecto es 6, ya que los divisores de 6 son 1, 2, 3 y 1 + 2 + 3 = 6. Escribir una aplicación que encuentre los tres primeros números perfectos. Pág. 258 El diseño de la interfaz debe ser similar a la figura mostrada: Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 1 marco 1 caja de texto En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmNumeroPerfecto BorderStyle 3-Fixed Dialog Caption Los 3 primeros números perfectos Frame1 Nombre FraPerfecto Caption Número perfecto Nombre TxtPerfecto MultiLine True Text1 Text Pág. 259 Una vez establecidas las propiedades proceda a ingresar el código que se indica a continuación: Private Sub Form_Load() Dim N As Long, I As Long, S As Long Dim K As Integer, Cad As String N = 1 : K = 0 : Cad = “” While True S = 0 For I = 1 To (N - 1) If N Mod I = 0 Then S = S + I Next I If N = S Then Cad = Cad & N & vbCrLf K = K + 1 End If If K = 3 Then TxtPerfecto = Cad Exit Sub End If N = N + 1 Wend End Sub Aplicación Nº 3 Construya una aplicación que permita el ingreso de un número entero y muestre en pantalla la siguiente información: 1) Cantidad de cifras, 2) Suma de cifras impares, 3) Suma de cifras pares, 4) Suma total de cifras, 5) Cifra mayor, 6) Cifra menor y 7) Divisores de dicho número. El diseño de la interfaz debe ser similar a la figura siguiente: Pág. 260 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 4 marcos 7 etiquetas 8 cajas de texto 1 botón de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmNumeroPerfecto BorderStyle 3-Fixed Dialog Caption Los 3 primeros números perfectos Moveable False StartUpPosition 2-CenterScreen Pág. 261 Frame1 Nombre FraEntrada Caption Frame2 Nombre FraSalida Caption Frame3 Nombre FraDivisores Caption Divisores Frame4 Nombre FraSalir Caption Label1 Nombre LblNumero AutoSize True Caption Ingrese un número: Label2 Nombre LblCantCifras AutoSize True Caption Cantidad de cifras: Label3 Nombre LblSumImpares AutoSize True Caption Suma de cifras impares: Label4 Pág. 262 Nombre LblSumPares AutoSize True Caption Suma de cifras pares: Label5 Nombre LblSumTotal AutoSize True Caption Suma total de cifras: Label6 Nombre LblCifraMayor AutoSize True Caption Cifra mayor: Label7 Nombre LblCifraMenor AutoSize True Caption Cifra menor: Nombre TxtNumero Text1 Text Text2 Nombre TxtCantCifras Locked True Text Text3 Nombre TxtSumImpares Locked True Text Text4 Pág. 263 Nombre TxtSumPares Locked True Text Text5 Nombre TxtSumTotal Locked True Text Text6 Nombre TxtCifraMayor Locked True Text Text7 Nombre TxtCifraMenor Locked True Text Text8 Nombre TxtDivisores MultiLine True Locked True ScrollBars 2-Vertical Text Command3 Nombre CmdSalir Caption &Salir Picture C:\FundVB\Bitmaps\Exit.bmp Style 1-Graphical Pág. 264 Una vez establecidas las propiedades proceda ha ingresar el código que se indica a continuación: Private Sub CmdAceptar_Click() If IsNumeric(TxtNumero) Then Dim S As Integer, SI As Integer, SP As Integer Dim May As Integer, Min As Integer Dim Cad As String Dim I As Integer, J As Integer N = CLng(TxtNumero) M = CLng(TxtNumero) Cad = “” I = 0 J = 1 S = SP = SI = 0 For J = 1 To N If (N Mod J = 0) Then Cad = Cad & J & vbCrLf End If Next J While (N > 0) If ((N Mod 10) Mod 2) = 0 Then SP = SP + (N Mod 10) Else SI = SI + (N Mod 10) End If S = S + (N Mod 10) N = N \ 10 I = I + 1 Wend May = Mid(TxtNumero, 1, 1) Men = May While (M > 0) Pág. 265 If May < (M Mod 10) Then May = M Mod 10 End If If Men > (M Mod 10) Then Men = M Mod 10 End If M = M \ 10 Wend TxtCantCifras = Str(I) TxtSumImpares = Str(SI) TxtSumPares = Str(SP) TxtSumTotal = Str(S) TxtCifraMayor = Str(May) TxtCifraMenor = Str(Men) TxtDivisores = Cad Else MsgBox “Debe ingresar un número”, vbCritical, “Mensaje” TxtNumero.SetFocus End If End Sub Private Sub CmdSalir_Click() If MsgBox(“¿Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, "Pregunta") = vbYes Then End Else Cancel = True TxtNumero.SetFocus End If End Sub Aplicación Nº 4 Pág. 266 Un centro numérico es un número que separa una lista de números enteros (comenzando en 1) en dos grupos de números, cuyas sumas son iguales. El primer centro numérico es el 6, el cual separa la lista (1 a 8) en los grupos: (1; 2; 3; 4; 5) y (7; 8) cuyas sumas son ambas iguales a 15. El segundo centro numérico es el 35, el cual separa la lista (1 a 49) en los grupos: (1 a 34) y (36 a 49) cuyas sumas son ambas iguales a 595. Se pide elaborar una aplicación que calcule los centros numéricos entre 1 y N. El diseño de la interfaz y otras consideraciones se dejan a su criterio. Pág. 267 Microsoft Visual Basic GUÍA DE LABORATORIO Nº 4 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Manipular y realizar operaciones con arreglos. • Crear una estructura y realizar operaciones con los campos de la misma. • Implementar arreglos de estructuras. • Trabajar con listas desplegables y cuadros combinados. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab4 para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Elabore una aplicación que permita leer N números de tipo entero, y a continuación los visualice ordenados en ascendente o descendente. Pág. 268 forma Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 3 marcos 1 caja de texto 1 control lista 2 botones de opción 3 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmBurbuja BorderStyle 3-Fixed Dialog Caption Ordenación por burbuja Moveable False Frame1 Nombre FraNumero Caption Ingrese un nuevo número: Frame2 Nombre FraLista Caption Lista de números: Frame3 Nombre FraOrden Caption Orden: Nombre TxtNumero Text1 Text Pág. 269 List1 Nombre LstNumero List Option1 Nombre OptAscendente Caption Ascendente Value True Option2 Nombre OptDescendente Caption Descendente Value False Command1 Nombre CmdAnnadir Caption &Añadir Default True Command2 Nombre CmdOrdenar Caption &Ordenar Command3 Nombre CmdSalir Caption &Salir Picture C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Icons\Arrows\ Point04.ico Style 1-Graphical Una vez establecidas las propiedades proceda a ingresar el código que se indica a continuación: Pág. 270 Private Sub CmdAceptar_Click() If IsNumeric(TxtNumero.Text) Then LstNumero.AddItem TxtNumero.Text TxtNumero.Text = “” TxtNumero.SetFocus Else MsgBox “Ingrese un número”, vbCritical, “Mensaje” TxtNumero.SelStart = 0 TxtNumero.SelLength = Len(TxtNumero.Text) TxtNumero.SetFocus End If End Sub Private Sub CmdOrdenar_Click() Dim I As Integer, J As Integer, T As Integer, N As Integer Dim A() As Integer N = LstNumero.ListCount ReDim A(N) For I = 0 To N - 1 A(I) = LstNumero.List(I) Next I If OptAscendente.Value Then For I = 0 To N - 2 For J = I + 1 To N - 1 If A(I) > A(J) Then T = A(I) A(I) = A(J) A(J) = T End If Next J Next I End If Pág. 271 If OptDescendente.Value Then For I = 0 To N - 2 For J = I + 1 To N - 1 If A(I) < A(J) Then T = A(I) A(I) = A(J) A(J) = T End If Next J Next I End If LstNumero.Clear For I = 0 To N - 1 LstNumero.List(I) = A(I) Next I End Sub Private Sub Form_Unload(Cancel As Integer) If MsgBox(“Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Pregunta”) = vbYes Then End Else: Cancel = True : TxtNumero.SetFocus End If End Sub Private Sub CmdSalir_Click() Unload Me End Sub Aplicación Nº 2 Elaborar artículo de una un aplicación cuadro que combinado permita (Combo). seleccionar Apenas el un usuario seleccione un artículo se debe mostrar el precio del mismo, el interés es fijo para esta ocasión. Pág. 272 El diseño de la interfaz debe ser similar a la siguiente figura: La venta ha realizarse es a plazos, ello condiciona la cuota mensual a pagarse. Cuando se haga click sobre el botón Cuota mensual debe mostrarse un cuadro de diálogo con los datos propuestos: De manera similar al hacer click sobre el botón Total nos debe mostrar la cantidad total a pagar. Pág. 273 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 1 marco 3 etiquetas 1 cuadro combinado 2 cajas de texto 3 botones de opción 2 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmCotizacion BorderStyle 3-Fixed Dialog Caption Pedido de cotizaciones Frame1 Nombre FraPlazo Caption Plazo: Label1 Nombre LblArticulo Caption Artículo: Label2 Nombre LblPrecio Caption Precio US$ Label3 Nombre LblInteres Caption Interés: Pág. 274 Combo1 Nombre CboArticulo Text Text1 Nombre TxtPrecio Locked True Text Text2 Nombre TxtInteres Locked True Text Option1 Nombre OptPlazo Caption 6 meses Value True Option2 Nombre OptPlazo Caption 12 meses Value False Option3 Nombre OptPlazo Caption 24 meses Value False Command1 Nombre CmdCuotaMensual Caption &Cuota mensual Pág. 275 Command2 Nombre CmdTotal Caption &Total Una vez establecidas las propiedades de la interfaz, haga doble click sobre el formulario e ingrese las siguientes declaraciones en la sección General del módulo de formulario: Private Type Articulo Nombre As String * 30 Precio As Double End Type Dim A(4) As Articulo, Plazo As Integer Const Interes = 0.12 Recuerde que un dato declarado en la sección General de un módulo puede ser accedido por todos los procedimientos de dicho módulo. Luego, continúe ingresando el código que se muestra a continuación: Private Sub Form_Load() A(0).Nombre = “Monitor SAMSUNG SyncMaster 3” A(1).Nombre = “Impresora Hewlett Packard DeskJet 930C” A(2).Nombre = “Impresora Epson Stylus Color 740” A(3).Nombre = “Microprocesador Pentium I 233 MHZ” A(0).Precio = 150 : A(1).Precio = 275 A(2).Precio = 145 : A(3).Precio = 80 Dim I As Integer For I = 1 To 4 CboArticulo.AddItem A(I - 1).Nombre Next I TxtInteres = Interes : Plazo = 6 End Sub Pág. 276 Private Sub CboArticulo_Click() Dim I As Integer I = CboArticulo.ListIndex TxtPrecio = A(I).Precio End Sub Private Sub OptPlazo_Click(Index As Integer) Select Case Index Case 0: Plazo = 6 Case 1: Plazo = 12 Case 2: Plazo = 24 End Select End Sub Private Sub CmdCuotaMensual_Click() Dim Total As Double, CuotaMensual As Double, I As Integer I = CboArticulo.ListIndex Total = A(I).Precio * (1 + Interes) CuotaMensual = Total / Plazo MsgBox “Cuota Mensual US$” & Str(CuotaMensual) End Sub Private Sub CmdTotal_Click() Dim Total As Double, I As Integer I = CboArticulo.ListIndex Total = A(I).Precio * (1 + Interes) MsgBox “Total US$” & Str(Total) End Sub Aplicación Nº 3 Se desea elaborar una aplicación que permita controlar el proceso de matrícula en un curso de computación. Para ello se deben recabar los siguientes datos: 1) Curso en que Pág. 277 se matricula el alumno, 2) Fecha de matrícula, 3) Apellidos y nombres, 4) Sexo, 5) Dirección, y 6) Distrito de residencia. Para el desarrollo de esta aplicación proceda a ubicar los siguientes controles en el formulario: 4 marcos 6 etiquetas 5 cajas de texto 1 cuadro combinado 2 controles de lista 4 botones de comando En seguida proceda a establecer las propiedades según se indica: Pág. 278 Form1 Nombre FrmFichaMatricula BorderStyle 3-Fixed Dialog Caption Ficha de matrícula Frame1 Nombre FraIngreso Caption Ingreso de datos: Frame2 Nombre FraOpciones Caption Opciones: Frame3 Nombre FraCursos Caption Cursos: Frame4 Nombre FraDistritos Caption Distritos: Label1 Nombre LblCurso Caption Curso: Label2 Nombre LblFechaMat Caption Fecha de matrícula: Label3 Nombre LblAlumno Caption Alumno: Pág. 279 Label4 Nombre LblSexo Caption Sexo: Label5 Nombre LblDirección Caption Dirección: Label6 Nombre LblDistrito Caption Distrito: Combo1 Nombre CboSexo Text List1 Nombre LstCursos Text List2 Nombre LstDistrito Text Text1 Nombre TxtCurso Text Text2 Nombre TxtFechaMat Text Pág. 280 Text3 Nombre TxtAlumno Text Text4 Nombre TxtDireccion Text Text5 Nombre TxtDistrito Text Command1 Nombre CmdGuardar Caption &Guardar Command2 Nombre CmdCancelar Caption &Cancelar Command3 Nombre CmdLimpiar Caption &Limpiar Command4 Nombre CmdSalir Caption &Salir Picture C:\FundVB\Bitmaps\Exit.bmp Style 1-Graphical Una vez establecidas las propiedades de la interfaz, proceda a ingresar el código que se indica a continuación: Pág. 281 Private Sub Form_Load() LstCursos.AddItem “Borland C++ Nivel I” LstCursos.AddItem “Borland C++ Nivel II” LstCursos.AddItem “Microsoft Visual Basic Nivel I” LstCursos.AddItem “Microsoft Visual Basic Nivel II” LstCursos.AddItem “Microsoft Visual FoxPro Nivel I” LstCursos.AddItem “Microsoft Visual FoxPro Nivel II” LstCursos.AddItem “Microsoft Visual C++ Nivel I” LstCursos.AddItem “Microsoft Visual C++ Nivel II” LstCursos.AddItem “Microsoft Visual J++ Nivel I” LstCursos.AddItem “Microsoft Visual J++ Nivel II” LstCursos.AddItem “Microsoft SQL Server Nivel I” LstCursos.AddItem “Microsoft SQL Server Nivel II” LstCursos.AddItem “Microsoft Power Builder Nivel I” LstCursos.AddItem “Microsoft Power Builder Nivel II” LstDistrito.AddItem “Callao” LstDistrito.AddItem “Bellavista” LstDistrito.AddItem “Carmen de la Legua” LstDistrito.AddItem “La Perla” LstDistrito.AddItem “La Punta” LstDistrito.AddItem “Ventanilla” LstDistrito.AddItem “Cercado de Lima” LstDistrito.AddItem “Ancón” LstDistrito.AddItem “Ate” LstDistrito.AddItem “Barranco” LstDistrito.AddItem “Breña” LstDistrito.AddItem “Carabayllo” LstDistrito.AddItem “Comas” LstDistrito.AddItem “Chaclacayo” LstDistrito.AddItem “Chorrillos” LstDistrito.AddItem “El Agustino” LstDistrito.AddItem “Jesús María” LstDistrito.AddItem “La Molina” Pág. 282 LstDistrito.AddItem “La Victoria” LstDistrito.AddItem “Lince” LstDistrito.AddItem “Lurigancho” LstDistrito.AddItem “Lurín” LstDistrito.AddItem “Magdalena del Mar” LstDistrito.AddItem “Miraflores” LstDistrito.AddItem “Pachacamac” LstDistrito.AddItem “Pucusana” LstDistrito.AddItem “Pueblo Libre” LstDistrito.AddItem “Puente Piedra” LstDistrito.AddItem “Punta Negra” LstDistrito.AddItem “Rimac” LstDistrito.AddItem “San Bartolo” LstDistrito.AddItem “San Isidro” LstDistrito.AddItem “Independencia” LstDistrito.AddItem “San Juan de Miraflores” LstDistrito.AddItem “San Luis” LstDistrito.AddItem “San Martín de Porres” LstDistrito.AddItem “San Miguel” LstDistrito.AddItem “Santiago de Surco” LstDistrito.AddItem “Villa María del Triunfo” LstDistrito.AddItem “San Juan de Lurigancho” LstDistrito.AddItem “Santa María del Mar” LstDistrito.AddItem “Santa Rosa” LstDistrito.AddItem “Los Olivos” LstDistrito.AddItem “Cieneguilla” LstDistrito.AddItem “San Borja” LstDistrito.AddItem “Villa el Salvador” LstDistrito.AddItem “Santa Anita” CboSexo.AddItem “Masculino” : CboSexo.AddItem “Femenino” End Sub Private Sub Form_Unload(Cancel As Integer) If MsgBox(“¿Desea terminar la aplicación?”, _ Pág. 283 vbQuestion + vbYesNo, “Pregunta”) = vbYes Then End Else Cancel = True Call CmdLimpiar_Click End If End Sub Private Sub LstCursos_Click() TxtCursos = LstCursos End Sub Private Sub LstDistrito_Click() TxtDistrito = LstDistrito End Sub Private Sub CmdGuardar_Click() LstCursos.Enabled = False LstDistrito.Enabled = False TxtCursos.Locked = True TxtFechaMat.Locked = True TxtAlumno.Locked = True CboSexo.Locked = True TxtDireccion.Locked = True TxtDistrito.Locked = True MsgBox “Alumno matriculado”, vbInformation, “Mensaje” End Sub Private Sub CmdLimpiar_Click() LstCursos.Enabled = True LstDistrito.Enabled = True TxtCursos.Locked = False TxtFechaMat.Locked = False TxtAlumno.Locked = False Pág. 284 CboSexo.Locked = False TxtDireccion.Locked = False TxtDistrito.Locked = False TxtCursos = “” TxtFechaMat = “” TxtAlumno = “” CboSexo = “” TxtDireccion = “” TxtDistrito = “” TxtCursos.SetFocus End Sub Private Sub CmdCancelar_Click() If MsgBox(“¿Desea modificar algún dato?”, _ vbQuestion + vbYesNo, “Mensaje”) = vbYes Then LstCursos.Enabled = True LstDistrito.Enabled = True TxtCursos.Locked = False TxtFechaMat.Locked = False TxtAlumno.Locked = False CboSexo.Locked = False TxtDireccion.Locked = False TxtDistrito.Locked = False End If End Sub Private Sub CmdSalir_Click() Unload Me End Sub Aplicación Nº 4 Pág. 285 Desarrollar una aplicación que permita realizar consultas acerca de un determinado curso, los cuales se mostraran en una lista. El usuario debe seleccionar un curso y en seguida se debe presentar el nombre del profesor encargado del curso (teoría), el nombre del jefe de práctica (laboratorio), así como los horarios de teoría y de laboratorio. El diseño de la interfaz deberá ser similar al siguiente: Pág. 286 Microsoft Visual Basic GUÍA DE LABORATORIO Nº 5 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Crear procedimientos y funciones definidos por el usuario. • Añadir formularios creados anteriormente a un proyecto. • Cambiar el formulario de arranque de un proyecto. • Utilizar formularios MDI. • Manejar diferentes métodos y propiedades de los formularios. • Crear y utilizar menús en una aplicación. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab5, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Escriba una función que reciba como argumento una cadena de caracteres y la devuelva en forma inversa, por ejemplo si se ingresa la cadena CORAZON deberá retornar NOZAROC. Pág. 287 Para el desarrollo de esta aplicación, proceda a ubicar los siguientes controles en el formulario: 2 etiquetas 2 cajas de texto 3 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmCadInvertida Caption Cadena invertida BorderStyle 3-Fixed Dialog Label1 Nombre LblCadena Autosize True Caption Ingresa una cadena: Label2 Nombre LblInvertida Autosize True Caption Cadena invertida: Nombre TxtCadena Text1 Text Text2 Nombre TxtInvertida Locked True Text Pág. 288 Command1 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdLimpiar Caption &Limpiar Command3 Nombre CmdSalir Caption &Salir Una vez establecidas las propiedades de la interfaz, proceda a ingresar el siguiente código: Function CadInvertida(Cadena As String) As String Dim Invertida() As String * 1 Dim I As Integer Dim J As Integer N = Len(Cadena) ReDim Invertida(N) For I = 1 To N Invertida(I - 1) = Mid(Cadena, I, 1) Next I For J = (N - 1) To 0 Step -1 CadInvertida = CadInvertida & Invertida(J) Next J End Function Private Sub CmdInvertir_Click() TxtInvertida = CadInvertida(TxtCadena) End Sub Pág. 289 Private Sub CmdLimpiar_Click() TxtCadena = “” TxtInvertida = “” TxtCadena.SetFocus End Sub Private Sub CmdSalir_Click() End End Sub Aplicación Nº 2 Se desea elaborar una aplicación que permita controlar el proceso de matrícula en un curso de computación. Para ello se deben recabar los siguientes datos: 1) Curso en que se matricula el alumno, 2) Fecha de matrícula, 3) Apellidos y nombres, 4) Sexo, 5) Dirección, y 6) Distrito de residencia. El diseño de la interfaz debe ser similar a la figura mostrada: Para seleccionar un curso el usuario deberá hacer click en el botón punteado que se encuentra al lado de la caja de texto. En seguida se presentará un menú de selección por realce en el cual se presenta la relación de todos los cursos disponibles. Pág. 290 El curso quedará seleccionado al hacer click en el botón Aceptar. El mismo tipo de selección deberá realizarse al momento de ingresar el nombre del distrito. Para el desarrollo de esta aplicación necesitamos tres formularios y un módulo. En primer lugar proceda a añadir un módulo de código al proyecto. Seleccione el Menú Proyecto y Pág. 291 elija la opción Agregar módulo, se debe presentar un cuadro de diálogo similar a la siguiente figura: Del cuadro de diálogo Agregar módulo, en la ficha Nuevo, haga click en el botón Abrir. Luego ingrese el siguiente código en la sección de Declaraciones del módulo que acabamos de añadir: Public Curso As String Public Distrito As String En seguida proceda a cambiar el nombre formulario principal por FrmFichaMatricula. Luego debe añadir los demás formularios necesarios para construir la aplicación. Para tal fin, seleccione el menú Proyecto y elija la opción Agregar formulario. Del cuadro de diálogo Agregar formulario, en la ficha Nuevo, elija la opción Formulario y haga click en el botón Abrir. Se debe presentar un cuadro de diálogo similar a la siguiente figura: Pág. 292 En ese instante se añadirá un nuevo formulario al proyecto. Cambie el nombre del nuevo formulario por FrmCurso. Repita el procedimiento anterior para añadir el formulario FrmDistrito. A continuación copie los pasos de la pág. 55 a la pág. 62 de la Guía de Laboratorio Nº 4 (Aplicación Nº 3) con los siguientes cambios: En la pág. 55, añadir sólo 2 marcos. No añadir ningún control de lista. En vez de 4 botones de comando, añadir 6 botones de comando. Luego, establecer las siguientes propiedades para los dos nuevos botones: Command5 Nombre CmdCurso Caption . . . Command6 Pág. 293 Nombre CmdDistrito Caption . . . En la pág. 59, reemplazar el código del evento Load del formulario por el siguiente: Private Sub Form_Load() CboSexo.AddItem "Masculino" CboSexo.AddItem "Femenino" End Sub En la pág. 61, suprimir el código asociado al evento Click de los controles de lista LstCursos y LstDistrito. En su lugar añadir lo siguiente: Private Sub CmdCurso_Click() Load FrmCurso FrmCurso.Show vbModal TxtCurso = Curso End Sub Private Sub CmdDistrito_Click() Load FrmDistrito FrmDistrito.Show vbModal TxtDistrito = Distrito End Sub A continuación active el formulario FrmCurso, para ello haga click sobre el mismo. En seguida proceda a ubicar los siguientes controles en el formulario: 1 control de lista 1 botones de comando Pág. 294 Luego proceda a establecer las propiedades según se indica: Form2 Nombre FrmCurso BorderStyle 3-Fixed Dialog Caption Cursos Nombre LstCursos List1 Text Command1 Nombre CmdAceptar Caption &Aceptar Una vez establecidas las propiedades proceda a ingresar el código que se indica a continuación: Private Sub Form_Load() LstCursos.AddItem “Borland C++ Nivel I” LstCursos.AddItem “Borland C++ Nivel II” LstCursos.AddItem “Microsoft Visual Basic Nivel I” LstCursos.AddItem “Microsoft Visual Basic Nivel II” LstCursos.AddItem “Microsoft Visual FoxPro Nivel I” LstCursos.AddItem “Microsoft Visual FoxPro Nivel II” LstCursos.AddItem “Microsoft Visual C++ Nivel I” LstCursos.AddItem “Microsoft Visual C++ Nivel II” LstCursos.AddItem “Microsoft SQL Server Nivel I” LstCursos.AddItem “Microsoft SQL Server Nivel II” LstCursos.AddItem “Microsoft Power Builder Nivel I” LstCursos.AddItem “Microsoft Power Builder Nivel II” End Sub Pág. 295 Private Sub CmdAceptar_Click() Curso = LstCursos.Text FrmCurso.Hide End Sub Por último, proceda Ud. a desarrollar el código respectivo para el formulario FrmDistrito. Aplicación Nº 3 Elaborar una aplicación que permita presentar los diferentes tipos de formularios de Visual Basic. Utilice como contenedor principal un formulario MDI, tal como se muestra en la figura: Para el desarrollo de esta aplicación necesitamos utilizar un formulario MDI (interfaz de múltiples documentos). Para ello seleccione el Menú Proyecto y elija la opción Agregar formulario MDI, se debe presentar un cuadro de diálogo similar a la siguiente figura: Pág. 296 Del cuadro de diálogo Agregar formulario MDI, en la ficha Nuevo, haga click en el botón Abrir. En seguida cambie el nombre del formulario MDI por MDIPrincipal. A continuación proceda a añadir los formularios para las diferentes opciones del menú. Cambie los nombres de formularios según se indica: Formulario Nombre Form1 FrmNone Form2 FrmFixedSingle Form3 FrmSizable Form4 FrmFixedDialog Form5 FrmFixedToolWindow Form6 FrmSizableToolWindow Form7 FrmAcercaDe Pág. 297 los Luego proceda a diseñar el menú de opciones. Para ello haga click derecho sobre el formulario MDI y elija la opción Editor de menús. Establezca las propiedades según: Caption Name ShortCut &Menú Principal MnuPrincipal Ninguno &0-None MnuNone Ninguno &1-Fixed Single MnuFixedSingle Ninguno &2-Sizable MnuSizable Ninguno &3-Fixed Dialog MnuFixedDialog Ninguno &4-Fixed ToolWindow MnuFixedToolWindow Ninguno &5-Sizable ToolWindow MnuSizableToolWindow Ninguno - MnuLinea Ninguno &Acerca del autor MnuAcercaDe Ninguno &Salir MnuSalir Ctrl + X A continuación haga click en el botón Aceptar del Editor de menús. Luego proceda a ingresar el siguiente código para el formulario MDI: Private Sub MDIForm_Unload(Cancel As Integer) If MsgBox(“¿Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Mensaje”) = vbYes Then End Else: Cancel = True End If End Sub Private Sub MnuNone_Click() Load FrmNone FrmNone.Show End Sub Pág. 298 Private Sub MnuFixedSingle_Click() Load FrmFixedSingle FrmFixedSingle.Show End Sub Private Sub MnuSizable_Click() Load FrmSizable FrmSizable.Show End Sub Private Sub MnuFixedDialog_Click() Load FrmFixedDialog FrmFixedDialog.Show End Sub Private Sub MnuFixedToolWindow_Click() Load FrmFixedToolWindow FrmFixedToolWindow.Show End Sub Private Sub MnuSizableToolWindow_Click() Load FrmSizableToolWindow FrmSizableToolWindow.Show End Sub Private Sub MnuAcercaDe_Click() Load FrmAcercaDe FrmAcercaDe.Show End Sub Private Sub MnuSalir_Click() Unload Me End Sub Pág. 299 A continuación proceda a activar el formulario FrmNone y ubique un botón de comandos sobre el mismo. En seguida establezca las propiedades según se indica a continuación: Form1 Nombre FrmNone BorderStyle 0-None Caption None MDIChild True Command1 Nombre CmdVolver Caption &Volver Una vez establecidas las propiedades, proceda a ingresar el código que se muestra a continuación: Private Sub CmdVolver_Click() Unload Me End Sub Repita el procedimiento anterior para los demás tipos de formularios. Aplicación Nº 4 Elaborar una aplicación que acepte como entrada la reserva de agua de un depósito y los litros que se consumen a la semana. Utilizando una función definida por el usuario determinar como resultado las cantidades de agua que quedan al final de cada semana. El proceso finalizará cuando no quede agua suficiente para una semana. Utilizar otro formulario para mostrar la salida. FIN PARTE I Pág. 300 GUÍA DE LABORATORIO Parte II ELABORADO POR CARLOS CASTILLO PERALTA [email protected] INTRODUCCIÓN Pág. 301 La presente Guía de Laboratorio de Microsoft Visual Basic, se elaboró con la finalidad de complementar la parte teórica con la parte práctica del curso. Los problemas presentan un grado de dificultad gradual, es decir, en cada práctica primero se comienzan con problemas muy sencillos con la finalidad de que el estudiante esclarezca dudas y quede claro en los conceptos asimilados en la teoría, y luego en los problemas posteriores se va incrementando el nivel de dificultad. Esta guía explora una gran variedad de materias y contiene muchos problemas experiencia. recopilados Espero que a lo largo satisfaga las de varios necesidades años de de los estudiantes y colegas, ya que ha sido elaborada teniendo en cuenta los objetivos de aprendizaje del curso. Si desean compartirla con otros colegas, me agradaría mucho que lo hicieran, con la única condición de que siempre se respete el derecho del autor. Desde ya les deseo la mejor de las suertes en el aprendizaje de Microsoft Visual Basic. Lima, Diciembre del 2000 Carlos Castillo Peralta Microsoft Visual Basic Pág. 302 GUÍA DE LABORATORIO Nº 6 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Crear y manipular bases de datos utilizando Microsoft Access. • Adicionar un entorno de datos a un proyecto. • Conectar un origen de datos a un objeto Connection. • Utilizar un objeto Command para recuperar registros de un origen de datos. • Crear formularios con datos enlazados. • Realizar consultas utilizando sentencias SQL. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab6, para guardar sus trabajos correspondientes a este laboratorio. Creación de la base de datos con Microsoft Access 2000 Para desarrollar nuestras prácticas de laboratorio debemos crear una base de datos cuyo nombre es CursosLibres.MDB, la cual contendrá las tablas Curso y Laboratorio. La tarea de crear una base de datos con Microsoft Access 2000 es muy sencilla. Para tal fin debe realizar lo siguiente: • Arrancar Microsoft Access 2000. • Seleccionar la orden Nueva. . . del Menú Archivo. • Dentro del cuadro de diálogo Nueva, en la ficha General, seleccionar Base de datos y hacer click en el botón Aceptar. • Ingresar un nombre para la base de datos, para nuestro caso ingrese CursosLibres. En seguida se mostrará una ventana similar a la siguiente: Pág. 303 • Proceda a crear una nueva tabla. Para ello seleccionar la opción Tablas y haga doble click en Crear una tabla en vista Diseño. • Introducir el nombre, el tipo y las propiedades para cada uno de los campos. Para nuestro caso ingrese lo siguiente: Tabla Curso Nombre del Tipo Ancho Descripción CurCodigo T 03 Código del curso CurNombre T 30 Nombre del curso CurVacantes N 03 Número de vacantes disponibles CurProfe T 50 Nombre del profesor de teoría CurSilabo M 50 Sílabo de cada curso Campo • Luego, debe asignar un nombre a la tabla al momento de cerrarla. Para nuestro caso asígnele el nombre de Curso. • Por último, proceda a abrir la tabla e introducir datos. Para nuestro caso, ingrese la siguiente información: Pág. 304 CurCodigo CurNombre CurProfe BC1 Borland C++ Nivel I Linares Alarcon, Adams BC2 Borland C++ Nivel II Córdoba Saavedra, Javier BC3 Borland C++ Nivel III Castillo Peralta, Carlos VB1 MS Visual Basic Nivel I Linares Alarcon, Adams VB2 MS Visual Basic Nivel II Linares Alarcon, Adams VB3 MS Visual Basic Nivel III Castillo Peralta, Carlos VC1 MS Visual C++ Nivel I Córdoba Saavedra, Javier VC2 MS Visual C++ Nivel II Castillo Peralta, Carlos VJ1 MS Visual J++ Nivel I Castillo Peralta, Carlos VJ2 MS Visual J++ Nivel II Castillo Peralta, Carlos VF1 MS Visual FoxPro Nivel I Linares Alarcon, Adams VF2 MS Visual FoxPro Nivel II Castillo Peralta, Carlos VF3 MS Visual FoxPro Nivel III Castillo Peralta, Carlos PB1 Power Builder Nivel I Córdoba Saavedra, Javier PB2 Power Builder Nivel II Córdoba Saavedra, Javier SQ1 MS SQL Server Nivel I Córdoba Saavedra, Javier SQ2 MS SQL Server Nivel II Córdoba Saavedra, Javier WIN MS Windows 98 Montes Tejada, Estela A menudo, el proceso de diseño de la base de datos es bastante complejo. Para nosotros ha sido fácil, pues se nos brinda la estructura de las tablas. De manera análoga, proceda a crear la siguiente según se indica a continuación: Tabla Laboratorio Nombre del Tipo Ancho Descripción Campo LabCodigo T 03 Código del curso Pág. 305 tabla LabHora T 08 Horario de laboratorio LabProfe T 50 Nombre del profesor de laboratorio Al momento de cerrar la tabla que acaba de crear, asígnele el nombre de Laboratorio. Luego, proceda a ingresar la siguiente información: LabCodigo LabHora LabProfe BC1 SA 08-10 Castillo Peralta, Carlos BC2 SA 10-12 Linares Alarcon, Adams BC3 DO 10-12 Castillo Peralta, Carlos VB1 SA 08-10 Montes Tejada, Estela VB2 DO 10-12 Linares Alarcon, Adams VB3 DO 08-10 Castillo Peralta, Carlos VC1 DO 08-10 Linares Alarcon, Adams VC2 DO 10-12 Córdoba Saavedra, Javier VJ1 SA 16-18 Castillo Peralta, Carlos VJ2 SA 18-20 Castillo Peralta, Carlos VF1 SA 08-10 Linares Alarcon, Adams VF2 DO 08-10 Córdoba Saavedra, Javier VF3 DO 14-16 Linares Alarcon, Adams PB1 VI 16-18 Córdoba Saavedra, Javier PB2 VI 14-16 Córdoba Saavedra, Javier SQ1 SA 16-18 Córdoba Saavedra, Javier SQ2 SA 18-20 Córdoba Saavedra, Javier WIN SA 10-12 Montes Tejada, Estela Aplicación Nº 1 Elaborar una aplicación que permita realizar el mantenimiento de la información almacenada en la tabla Curso de Pág. 306 la base de datos CursosLibres.MDB. El diseño de la interfaz debe ser similar a la figura mostrada: Los botones ubicados en el marco Navegador (Primero, Anterior, Siguiente y Ultimo, de izquierda a derecha) permiten desplazarse a través de la tabla. Los botones ubicados en el marco Mantenimiento (Nuevo, Editar, Guardar y Eliminar, de izquierda a derecha) permiten realizar las operaciones básicas de mantenimiento de la tabla. Para debemos desarrollar hacer es nuestra aplicación, conectarnos a la lo primero base de que datos CursosLibres.MDB. Para ello ingrese a Visual Basic de manera habitual, a continuación en el menú Proyecto seleccione la opción Agregar Data Environment y se creará una nueva conexión para la que debe establecer propiedades de vínculo de datos. En la ventana Data Environment DataEnvironment por CnCursosLibres. El cambie DeCursosLibres aspecto de la y el el nombre de ventana la del objeto conexión Data por Environment deberá ser similar a la siguiente figura: Pág. 307 Luego haga CnCursosLibres click y con seleccione el la botón derecho opción del ratón Propiedades. en Deberá presentarse un cuadro de diálogo similar al siguiente: En la ficha Proveedor del cuadro de diálogo anterior, seleccione Microsoft Jet 4.0 OLE DB Provider y haga click en el Pág. 308 botón Siguiente. En seguida aparecerá un cuadro de diálogo similar al mostrado: En la ficha Conexión del cuadro de diálogo Propiedades de Data Link escriba CursosLibres.MDB y el haga nombre click en de el la botón base Probar de datos conexión. Luego si la conexión es satisfactoria haga click en el botón Aceptar. En seguida en la barra de herramientas de la ventana Data Environment haga click en el botón Agregar Comando y denomine al comando CmCurso. Luego haga click derecho sobre el comando y seleccione Propiedades: Pág. 309 Compruebe CnCursosLibres, que este luego comando establezca el utiliza nombre la de conexión la tabla a utilizar, en este caso Curso y haga click en el botón Aceptar. A continuación seleccione el comando CmCurso y arrástrelo hacia el formulario. Finalmente agregue los siguientes controles al formulario: 3 marcos 9 botones de comandos En seguida proceda a establecer las propiedades requeridas: Form1 Nombre FrmMantenCurso Caption Mantenimiento de cursos BorderStyle 3-Fixed Dialog Frame1 Pág. 310 Nombre FraIngreso Caption Frame2 Nombre FraNavegador Caption Navegador Frame3 Nombre FraMantenimiento Caption Mantenimiento LblFieldLabel(0) Nombre LblFieldLabel Caption Código: LblFieldLabel(1) Nombre LblFieldLabel Caption Nombre: LblFieldLabel(2) Nombre LblFieldLabel Caption Vacantes: LblFieldLabel(3) Nombre LblFieldLabel Caption Profesor: TxtCurCodigo Nombre TxtCurCodigo Locked True Text TxtCurNombre Pág. 311 Nombre TxtCurNombre Locked True Text TxtCurVacantes Nombre TxtCurVacantes Locked True Text TxtCurProfe Nombre TxtCurProfe Locked True Text Command1 Nombre CmdPrimero Caption Picture C:\FundVB\Bitmaps\First.bmp Style 1-Graphical Command2 Nombre CmdAnterior Caption Picture C:\FundVB\Bitmaps\Previous.bmp Style 1-Graphical Command3 Nombre CmdSiguiente Caption Picture C:\FundVB\Bitmaps\Next.bmp Style 1-Graphical Command4 Pág. 312 Nombre CmdUltimo Caption Picture C:\FundVB\Bitmaps\Last.bmp Style 1-Graphical Command5 Nombre CmdNuevo Caption Picture C:\FundVB\Bitmaps\New.bmp Style 1-Graphical Command6 Nombre CmdEditar Caption Picture C:\FundVB\Bitmaps\Edit.bmp Style 1-Graphical Command7 Nombre CmdGuardar Caption Picture C:\FundVB\Bitmaps\Save.bmp Style 1-Graphical Command8 Nombre CmdEliminar Caption Picture C:\FundVB\Bitmaps\Delete.bmp Style 1-Graphical Command9 Nombre CmdSalir Pág. 313 Caption &Salir Picture C:\FundVB\Bitmaps\Exit.bmp Style 1-Graphical El código asociado a la aplicación se muestra continuación: Private Sub CmdPrimero_Click() DeCursosLibres.rsCmCurso.MoveFirst End Sub Private Sub CmdUltimo_Click() DeCursosLibres.rsCmCurso.MoveLast End Sub Private Sub CmdAnterior_Click() DeCursosLibres.rsCmCurso.MovePrevious If DeCursosLibres.rsCmCurso.BOF Then DeCursosLibres.rsCmCurso.MoveFirst MsgBox “Estamos en el primer registro” End If End Sub Private Sub CmdSiguiente_Click() DeCursosLibres.rsCmCurso.MoveNext If DeCursosLibres.rsCmCurso.EOF Then DeCursosLibres.rsCmCurso.MoveLast MsgBox “Estamos en el último registro” End If End Sub Private Sub CmdNuevo_Click() DeCursosLibres.rsCmCurso.AddNew Pág. 314 a ModoEditar True End Sub Private Sub CmdEditar_Click() ModoEditar True End Sub Private Sub CmdGuardar_Click() DeCursosLibres.rsCmCurso.Update ModoEditar False End Sub Private Sub CmdEliminar_Click() DeCursosLibres.rsCmCurso.Delete DeCursosLibres.rsCmCurso.MoveNext If DeCursosLibres.rsCmCurso.EOF Then DeCursosLibres.rsCmCurso.MoveLast End If End Sub Private Sub CmdSalir_Click() Unload Me End Private Sub Form_Unload(Cancel As Integer) If MsgBox(“¿Desea terminar la aplicación?”, _ vbQuestion + vbYesNo, “Pregunta”) = vbYes Then End Else Cancel = True End If End Sub Private Sub Form_Activate() ModoEditar False Pág. 315 End Sub Private Sub ModoEditar(ByVal Ok As Boolean) TxtCurCodigo.Locked = Not Ok: TxtCurNombre.Locked = Not Ok TxtCurVacantes.Locked = Not Ok: TxtCurProfe.Locked = Not Ok CmdNuevo.Enabled = Not Ok: CmdEditar.Enabled = Not Ok CmdGuardar.Enabled = Ok: CmdEliminar.Enabled = Not Ok CmdPrimero.SetFocus: If Ok Then TxtCurCodigo.SetFocus End Sub Finalmente antes de ejecutar la aplicación debemos asegurarnos de elegir el tipo de bloqueo adecuado. Para ello haga click derecho sobre el comando CmCurso y elija la opción Propiedades y en la ficha Avanzadas selecciones el tipo de bloqueo 3-Optimistic, tal como se muestra en la siguiente: Aplicación Nº 2 Pág. 316 figura Desarrollar una aplicación que permita mostrar en una grilla el contenido de la tabla Curso. El diseño de la interfaz se muestra a continuación: Para desarrollar la aplicación, lo primero que debemos hacer Luego, es conectarnos añada un a Comando la y base de datos denomínelo CursosLibres.MDB. CmConsultaCurso. Haga click derecho sobre el comando y seleccione Propiedades: Compruebe CnCursosLibres. que Luego este comando seleccione la utiliza opción la conexión Instrucción Pág. 317 SQL (Structured Query Language, Lenguaje de Estructuras de Consultas) e ingrese el siguiente código: Select CurCodigo As Código, CurNombre As Nombre, CurVacantes As Vacantes, CurProfe As Profesor From Curso Luego, haga click en el botón Aceptar. La ventana DataEnvironment debe presentar el siguiente aspecto: A continuación seleccione el comando CmConsultaCurso y arrástrelo con el botón derecho del ratón hacia el formulario. Del menú desplegable que se presenta, seleccione la opción Cuadrícula de datos. Luego, cambie las dimensiones de la grilla de tal forma que ocupe la totalidad del formulario. Finalmente guarde pruebe su aplicación. Aplicación Nº 3 Pág. 318 y Desarrollar una aplicación que permita seleccionar de un control DataCombo el nombre de un profesor y visualizar los cursos que dicta dicho profesor. Lo primero que debe hacer es conectarse a la base de datos CursosLibres.MDB. En seguida añada un comando y denomínelo CmConsultaProfe. Luego haga click derecho sobre el comando y seleccione Propiedades. Compruebe que este comando utiliza la conexión CnCursosLibres. Luego seleccione la opción Instrucción SQL e ingrese el siguiente código: Select CurCodigo As Código, CurNombre As Nombre, CurProfe As Profesor From Curso Where (CurProfe = ?) A continuación proceda a añadir otro comando y denomínelo CmProfe. Compruebe que este comando utiliza la conexión CnCursosLibres. Seleccione la opción Instrucción SQL e ingrese el siguiente código: Select Distinct CurProfe From Curso Luego proceda ha ubicar los siguientes controles en el formulario: 1 control DataCombo 1 control DataGrid Pág. 319 1 botón de comandos En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmConsultaProfe Caption Consulta de profesores BorderStyle 3-Fixed Dialog DataCombo1 Nombre DbcProfe ListField CurProfe RowMember CmProfe RowSource DeCursosLibres DataGrid1 Nombre DbgrdCursos Font Arial (Negrita 10) HeadFont Arial (Negrita 10) Command1 Nombre CmdBuscar Caption &Buscar A continuación ingrese el siguiente código: Private Sub CmdBuscar_Click() If DeCursosLibres.rsCmConsultaProfe.State = adStateOpen Then DeCursosLibres.rsCmConsultaProfe.Close End If DeCursosLibres.CmConsultaProfe (DbcProfe.Text) Set DbgrdCursos.DataSource = DeCursosLibres.rsCmConsultaProfe End Sub Pág. 320 Aplicación Nº 4 Desarrollar una aplicación que permita mostrar el contenido de la tabla Laboratorio, relacionada con la tabla Curso, tal como se muestra a continuación: Observar que la tabla Laboratorio sólo cuenta con tres campos. El campo que contiene el nombre del curso pertenece a la tabla Curso. La sentencia SQL que permite obtener consultas a partir de múltiples tablas (para nuestro caso Curso y Laboratorio), se indica a continuación: Select Laboratorio.LabCodigo As Código, Curso.CurNombre As Nombre, Laboratorio.LabHora As Horario, Laboratorio.LabProfe As [Jefe de práctica] From Laboratorio, Curso Where Laboratorio.LabCodigo = Curso.CurCodigo Microsoft Visual Basic GUÍA DE LABORATORIO Nº 7 Pág. 321 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Utilizar el objeto ADO Connection para crear una conexión a una base de datos. • Crear un objeto ADO Recordset para recuperar información de una base de datos. • Utilizar el método Execute de una conexión para actualizar la información de una base de datos. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab7, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Elaborar una aplicación que permita realizar el mantenimiento de la información contenida en la tabla Curso. En esta aplicación Ud. debe diseñar la interfaz y luego escribir código para conectarse y recuperar información de la base de datos. Pág. 322 Para el diseño de la interfaz, proceda a ubicar los siguientes controles en el formulario: 3 marcos 4 etiquetas 4 cajas de texto 8 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmMantenCursos Caption Mantenimiento de cursos BorderStyle 3-Fixed Dialog Moveable False StartUpPosition 2-CenterScreen Frame1 Nombre FraIngreso Caption Frame2 Nombre FraNavegador Caption Navegador Frame3 Nombre FraMantenimiento Caption Mantenimiento Label1 Nombre LblCodigo Caption Código: Pág. 323 Label2 Nombre LblNombre Caption Nombre: Label3 Nombre LblVacantes Caption Vacantes: Label4 Nombre LblProfesor Caption Profesor: Nombre TxtCurCodigo Locked True Text1 Text Text2 Nombre TxtCurNombre Locked True Text Text3 Nombre TxtCurVacantes Locked True Text Text4 Nombre TxtCurProfe Locked True Pág. 324 Text Para establecer las propiedades de los botones de comando Command1, Command2, . . ., Command8, copiar los pasos de la pág. 87 a la pág. 88 de la Guía de Laboratorio Nº 6 (Aplicación Nº 1). Antes de ingresar código a la aplicación, debemos tener en cuenta que aplicación para Visual poder utilizar Basic es los objetos necesario ADO cargar la es una librería correspondiente. Para ello selecciones el menú Proyecto y elija la opción seleccione Referencias. la opción En el cuadro Microsoft de ActiveX diálogo Data Referencias Objects 2.1 Library, tal como se indica en la figura siguiente: Luego de hacer click en el botón Aceptar estará condiciones de utilizar los objetos ADO en su aplicación. Pág. 325 en El código necesario para realizar la conexión y efectuar el mantenimiento de la tabla se muestra a continuación. Observar la analogía cuando se utiliza Data Environment. Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Private Sub ModoEditar(ByVal Ok As Boolean) TxtCurCodigo.Locked = Not Ok TxtCurNombre.Locked = Not Ok TxtCurVacantes.Locked = Not Ok TxtCurProfe.Locked = Not Ok CmdNuevo.Enabled = Not Ok CmdEditar.Enabled = Not Ok CmdGuardar.Enabled = Ok CmdEliminar.Enabled = Not Ok If Ok Then TxtCurCodigo.SetFocus End Sub Private Sub Form_Load() ModoEditar False Set Cn = New ADODB.Connection Set Rs = New ADODB.Recordset Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=C:\FundVB\Data\CursosLibres.MDB;” & _ “Persist Security Info=False” Rs.ActiveConnection = Cn Rs.CursorType = adOpenKeyset Rs.LockType = adLockOptimistic Rs.Open “Select * From Curso” Set TxtCurCodigo.DataSource = Rs TxtCurCodigo.DataField = “CurCodigo” Set TxtCurNombre.DataSource = Rs Pág. 326 TxtCurNombre.DataField = “CurNombre” Set TxtCurVacantes.DataSource = Rs TxtCurVacantes.DataField = “CurVacantes” Set TxtCurProfe.DataSource = Rs TxtCurProfe.DataField = “CurProfe” End Sub Private Sub CmdPrimero_Click() Rs.MoveFirst End Sub Private Sub CmdAnterior_Click() Rs.MovePrevious If Rs.BOF Then Rs.MoveFirst MsgBox “Estamos en el primer registro” End If End Sub Private Sub CmdSiguiente_Click() Rs.MoveNext If Rs.EOF Then Rs.MoveLast MsgBox “Estamos en el último registro” End If End Sub Private Sub CmdUltimo_Click() Rs.MoveLast End Sub Private Sub CmdNuevo_Click() Rs.AddNew ModoEditar True Pág. 327 End Sub Private Sub CmdEditar_Click() ModoEditar True End Sub Private Sub CmdGuardar_Click() Rs.Update ModoEditar False End Sub Private Sub CmdEliminar_Click() Rs.Delete Rs.MoveNext If Rs.EOF Then Rs.MoveLast End If End Sub Private Sub Form_Unload(Cancel As Integer) Cn.Close Set Cn = Nothing End Sub Aplicación Nº 2 Desarrollar consulta a la una tabla aplicación Curso. que Para permita ello el realizar usuario una debe seleccionar de un cuadro combinado (combo) el nombre de un profesor y a continuación se deben visualizar los cursos a su cargo. El diseño de la interfaz debe ser similar a la figura mostrada: Pág. 328 Para el desarrollo de esta aplicación, proceda ha ubicar los siguientes controles en el formulario: 1 control ComboBox 1 control DataGrid 1 botón de comandos En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmConsultaProfe Caption Consulta de profesores BorderStyle 3-Fixed Dialog Combo1 Nombre CboProfe Text DataGrid1 Nombre DbgrdCursos Font Arial (Negrita 10) HeadFont Arial (Negrita 10) Pág. 329 Command1 Nombre CmdBuscar Caption &Buscar Default True A continuación debe ingresar el código que se muestra en seguida: Dim Cn As ADODB.Connection Dim RsCurso As ADODB.Recordset Dim RsProfe As ADODB.Recordset Private Sub Form_Load() Set Cn = New ADODB.Connection Set RsProfe = New ADODB.Recordset Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=C:\FundVB\Data\CursosLibres.MDB;” & _ “Persist Security Info=False” RsProfe.ActiveConnection = Cn RsProfe.CursorType = adOpenStatic RsProfe.LockType = adLockOptimistic RsProfe.CursorLocation = adUseClient RsProfe.Open “Select Distinct CurProfe From Curso” Do While Not RsProfe.EOF() CboProfe.AddItem RsProfe(“CurProfe”) RsProfe.MoveNext Loop End Sub Private Sub CmdBuscar_Click() Set RsCurso = New ADODB.Recordset RsCurso.ActiveConnection = Cn RsCurso.CursorType = adOpenStatic Pág. 330 RsCurso.LockType = adLockReadOnly RsCurso.CursorLocation = adUseClient RsCurso.Open “Select CurCodigo As Código, ” & _ Nombre, CurProfe As Profesor ” & _ “CurNombre As “From Curso Where CurProfe = '” & CboProfe.Text & “'” Set DbgrdCursos.DataSource = RsCurso End Sub Private Sub Form_Unload(Cancel As Integer) Cn.Close Set Cn = Nothing End Sub Aplicación Nº 3 Desarrollar mantenimiento CursosLibres.MDB una de aplicación las (estas tablas tablas le que permita de la serán realizar base de el datos proporcionadas con datos suficientes, por el Jefe de Práctica). El diseño de la interfaz debe ser similar a la siguiente figura: Pág. 331 Por ejemplo para realizar el mantenimiento de la tabla Curso debemos preparar los siguientes formularios: Pág. 332 Para desarrollar nuestra aplicación debe agregar un módulo de código al proyecto. Luego ingrese lo siguiente: Public Cn As ADODB.Connection También será necesario agregar un formulario MDI. Luego, cambie el nombre del formulario por el de MDICursosLibres. En seguida, diseñe el menú para la aplicación según se indica: Caption Name &Mantenimiento MnuManten ShortCut Ninguno &Alumnos MnuMantenAlumno Ninguno &Nuevo MnuMantenAlumnoNuevo Ninguno &Editar MnuMantenAlumnoEditar Ninguno &Eliminar MnuMantenAlumnoEliminar Ninguno &Cursos MnuMantenCurso Ninguno &Nuevo MnuMantenCursoNuevo Ninguno &Editar MnuMantenCursoEditar Ninguno &Eliminar MnuMantenCursoEliminar Ninguno &Laboratorio MnuMantenLaboratorio Ninguno &Nuevo MnuMantenLaboratorioNuevo Ninguno &Editar MnuMantenLaboratorioEditar Ninguno &Eliminar MnuMantenLaboratorioEliminar Ninguno &Distrito MnuMantenDistrito Ninguno &Nuevo MnuMantenDistritoNuevo Ninguno &Editar MnuMantenDistritoEditar Ninguno &Eliminar MnuMantenDistritoEliminar Ninguno - MnuMantLinea Ninguno &Salir MnuMantSalir Ctrl + X Pág. 333 Luego, haga doble click sobre el formulario e ingrese el siguiente código: Private Sub MDIForm_Load() Set Cn = New ADODB.Connection Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=C:\FundVB\Data\CursosLibres.MDB;” & _ “Persist Security Info=False” End Sub Private Sub MnuMantenCursosNuevo_Click() Load FrmNuevoCurso FrmNuevoCurso.Show End Sub Private Sub MnuMantenCursosEditar_Click() Load FrmEditarCurso FrmEditarCurso.Show End Sub Private Sub MnuMantenCursosEliminar_Click() Load FrmEliminarCurso FrmEliminarCurso.Show End Sub Para desarrollar la opción Nuevo de la tabla Curso, añada un nuevo formulario al proyecto. Luego, ubique los siguientes controles en el formulario: 4 etiquetas 4 cajas de texto 3 botones de comando Luego proceda a establecer las propiedades según indica: Pág. 334 se Form1 Nombre FrmMantenCursos Caption Nuevo curso BorderStyle 3-Fixed Dialog MDIChild True Label1 Nombre LblCodigo Caption Código: Label2 Nombre LblNombre Caption Nombre: Label3 Nombre LblVacantes Caption Vacantes: Label4 Nombre LblProfesor Caption Profesor: Nombre TxtCurCodigo Text1 Text Text2 Nombre TxtCurNombre Text Text3 Nombre TxtCurVacantes Text Pág. 335 Text4 Nombre TxtCurProfe Text Command1 Nombre CmdGrabar Caption &Grabar Command2 Nombre CmdNuevo Caption &Nuevo Command3 Nombre CmdCerrar Caption &Cerrar Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Private Sub Form_Load() CmdGrabar.Enabled = True CmdNuevo.Enabled = False End Sub Private Sub CmdGrabar_Click() Cn.Execute “Insert Into Curso(CurCodigo, CurNombre, ” & _ “CurVacantes, CurProfe) Values ('” & TxtCurCodigo & _ “',” & “'” & TxtCurNombre & “',” & _ Val(TxtCurVacantes) & “,” & “'” & TxtCurProfe & “')” CmdGrabar.Enabled = False CmdNuevo.Enabled = True End Sub Pág. 336 Private Sub CmdNuevo_Click() TxtCurCodigo = “” TxtCurNombre = “” TxtCurVacantes = “” TxtCurProfe = “” CmdGrabar.Enabled = True: CmdNuevo.Enabled = False TxtCurCodigo.SetFocus End Sub Private Sub CmdCerrar_Click() Unload Me End Sub Para desarrollar la opción Editar de la tabla Curso, añada un nuevo formulario al proyecto. Luego, ubique los siguientes controles en el formulario: 1 marco 4 etiquetas 4 cajas de texto 4 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmMantenCursos Caption Editar curso BorderStyle 3-Fixed Dialog MDIChild True Frame1 Nombre FraCodigo Caption Pág. 337 Label1 Nombre LblCodigo Caption Código: Label2 Nombre LblNombre Caption Nombre: Label3 Nombre LblVacantes Caption Vacantes: Label4 Nombre LblProfesor Caption Profesor: Nombre TxtCurCodigo Text1 Text Text2 Nombre TxtCurNombre Text Text3 Nombre TxtCurVacantes Text Text4 Nombre TxtCurProfe Text Pág. 338 Command1 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdGrabar Caption &Grabar Command3 Nombre CmdNuevo Caption &Nuevo Command4 Nombre CmdCerrar Caption &Cerrar Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Private Sub Form_Load() CmdAceptar.Enabled = True CmdGrabar.Enabled = False CmdNuevo.Enabled = False End Sub Private Sub CmdAceptar_Click() Dim Rs As New ADODB.Recordset Set Rs = Cn.Execute(“Select CurNombre, ” & _ “CurVacantes, CurProfe From Curso ” & _ “Where CurCodigo = '” & TxtCurCodigo & “'”) If (Rs.EOF And Rs.BOF) Then MsgBox “No existe ningún curso con este código” TxtCurCodigo.SetFocus Pág. 339 TxtCurCodigo.SelStart = 0 TxtCurCodigo.SelLength = Len(TxtCurCodigo) Exit Sub End If TxtCurNombre = Rs!CurNombre TxtCurVacantes = Rs!CurVacantes TxtCurProfe = Rs!CurProfe Rs.Close Set Rs = Nothing TxtCurCodigo.Enabled = False CmdAceptar.Enabled = False CmdGrabar.Enabled = True CmdNuevo.Enabled = True End Sub Private Sub CmdGrabar_Click() Cn.Execute “Update Curso Set CurNombre = '” & _ TxtCurNombre & “',” & “CurVacantes = ” & _ Val(TxtCurVacantes) & “,” & “CurProfe = '” & _ TxtCurProfe & “'” & “ Where CurCodigo = '” & _ TxtCurCodigo & “'” End Sub Private Sub CmdNuevo_Click() TxtCurCodigo = “” TxtCurNombre = “” TxtCurVacantes = “” TxtCurProfe = “” CmdAceptar.Enabled = True CmdGrabar.Enabled = False CmdNuevo.Enabled = False TxtCurCodigo.Enabled = True TxtCurCodigo.SetFocus Pág. 340 End Sub Private Sub CmdCerrar_Click() Unload Me End Sub Para desarrollar la opción Eliminar de la tabla Cursos, añada un nuevo formulario al proyecto. Luego, ubique los siguientes controles en el formulario: 1 marco 4 etiquetas 4 cajas de texto 4 botones de comando En seguida proceda a establecer las propiedades según se indica: Form1 Nombre FrmMantenCursos Caption Eliminar curso BorderStyle 3-Fixed Dialog MDIChild True Frame1 Nombre FraCodigo Caption Label1 Nombre LblCodigo Caption Código: Label2 Nombre LblNombre Pág. 341 Caption Nombre: Label3 Nombre LblVacantes Caption Vacantes: Label4 Nombre LblProfesor Caption Profesor: Nombre TxtCurCodigo Text1 Text Text2 Nombre TxtCurNombre Text Text3 Nombre TxtCurVacantes Text Text4 Nombre TxtCurProfe Text Command1 Nombre CmdAceptar Caption &Aceptar Command2 Nombre CmdEliminar Pág. 342 Caption &Eliminar Command3 Nombre CmdNuevo Caption &Nuevo Command4 Nombre CmdCerrar Caption &Cerrar Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Private Sub Form_Load() CmdAceptar.Enabled = True CmdEliminar.Enabled = False CmdNuevo.Enabled = False End Sub Private Sub CmdEliminar_Click() Cn.Execute “Delete From Curso ” & _ “Where CurCodigo = '” & TxtCurCodigo & “'” Call CmdNuevo_Click End Sub Private Sub CmdNuevo_Click() TxtCurCodigo = “” TxtCurNombre = “” TxtCurVacantes = “” TxtCurProfe = “” CmdAceptar.Enabled = True CmdEliminar.Enabled = False CmdNuevo.Enabled = False Pág. 343 TxtCurCodigo.Enabled = True TxtCurCodigo.SetFocus End Sub Private Sub CmdAceptar_Click() Dim Rs As New ADODB.Recordset Set Rs = Cn.Execute(“Select CurNombre, ” & _ “CurVacantes, CurProfe From Curso ” & _ “Where CurCodigo = '” & TxtCurCodigo & “'”) If (Rs.EOF And Rs.BOF) Then MsgBox “No existe ningún curso con este código” TxtCurCodigo.SetFocus TxtCurCodigo.SelStart = 0 TxtCurCodigo.SelLength = Len(TxtCurCodigo) Exit Sub End If TxtCurNombre = Rs!CurNombre TxtCurVacantes = Rs!CurVacantes TxtCurProfe = Rs!CurProfe Rs.Close Set Rs = Nothing TxtCurCodigo.Enabled = False CmdAceptar.Enabled = False CmdEliminar.Enabled = True CmdNuevo.Enabled = True End Sub Private Sub CmdCerrar_Click() Unload Me End Sub De manera similar proceda a desarrollar el código para los formularios de mantenimiento de las demás tablas. Pág. 344 Aplicación Nº 4 Elaborar una aplicación que permita recuperar y mantener la información de la base de datos CursosLibres.MDB. Para tal fin debe preparar un formulario que permita establecer la conexión con el origen de datos. Luego, si la conexión es satisfactoria el usuario tiene la posibilidad de elegir una de las tablas de la base de datos para realizar las operaciones habituales de mantenimiento o simplemente para ejecutar consultas. El diseño de la interfaz debe ser similar a la siguiente figura: Las opciones Mantenimiento y Consulta deben ser análogas a las realizadas en aplicaciones anteriores. Microsoft Visual Basic Pág. 345 GUÍA DE LABORATORIO Nº 8 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Usar el diseñador de reportes DataReport. • Utilizar y controlar la impresora para obtener reportes impresos. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab8, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Diseñar un reporte que muestre la información almacenada en la tabla Cursos. El formato del reporte pedido se muestra a continuación: Para diseñar nuestro reporte, lo primero que debemos hacer es conectarnos a la base de datos CursosLibres.MDB. La conexión la haremos efectiva mediante el Data Environment. Luego, añada Pág. 346 un Comando y denomínelo CmCurso. Establezca el nombre de la tabla a utilizar, para nuestro caso Curso. El aspecto de la ventana Data Environment deberá ser similar a la figura: Luego, del menú Proyecto seleccionar la opción Agregar Data Report, lo cual permite agregar el diseñador de reportes: En seguida del Data Environment seleccionar cada campo que desee incluir en el reporte y luego arrastre el campo hacia la sección Detalles del Data Report. Pág. 347 El diseñador de reportes presenta un conjunto de controles que permiten mejorar la presentación de nuestro reporte. En seguida ubicar los siguientes controles: 2 etiquetas en la sección Encabezado de informe 4 etiquetas en la sección Encabezado de página A continuación proceda a establecer las propiedades según se indica: Etiqueta1 Nombre RptLblVAB Caption Instituto de Educación Superior “Víctor Andrés Belaúnde” Font Arial (Negrita 09) Etiqueta2 Nombre RptLblNombre Caption Reporte de Cursos Font Arial (Negrita Cursiva 16) Etiqueta3 Nombre RptLblCodigo Caption Código: Font Arial (Negrita 10) Etiqueta4 Nombre RptLblNombre Caption Nombre: Font Arial (Negrita 10) Etiqueta5 Nombre RptLblVacantes Caption Vacantes: Pág. 348 Font Arial (Negrita 10) Etiqueta6 Nombre RptLblProfesor Caption Profesor: Font Arial (Negrita 10) Para insertar la fecha actual dar un click con el botón derecho del ratón sobre el diseñador de reportes en la sección de Encabezado de informe, del menú contextual que se presenta seleccionar (formato la opción corto). Insertar En control, seguida, luego cambiar Fecha las actual siguientes propiedades: DataReport1 DataMember CmCurso DataSource DeCursosLibres Luego, seleccione del menú Proyecto la opción Propiedades de Proyecto, y en la ficha General del cuadro de diálogo Propiedades del proyecto, establecer DataReport1 como objeto inicial. Haga click en Aceptar y ejecute su aplicación. Aplicación Nº 2 Diseñar un reporte que permita mostrar un listado de profesores y los cursos que tienen a su cargo. Tener en cuenta que la información relacionada con cada profesor debe empezar en una página nueva. El formato del reporte pedido se muestra a continuación: Pág. 349 En datos. esta Para aplicación ello explicaremos iniciar un nuevo como crear proyecto. En grupos de seguida, conectarse a la base de datos CursosLibres.MDB mediante el Data Environment. Luego, añada un Comando y denomínelo CmProfesor. Establezca el nombre de la tabla a utilizar, para nuestro caso Curso. Para realizar el agrupamiento por profesor seleccionar la ficha Agrupar del cuadro de diálogo Propiedades de CmProfesor. A continuación activar la casilla de verificación Agrupar comando, luego seleccionar de la lista de campos, el campo por el cual se desea agrupar la información, para nuestro caso seleccionar CurProfe y dar un click en el botón “ > ”. El cuadro de diálogo Propiedades de CmProfesor debe presentar un aspecto similar a la figura siguiente: Pág. 350 A continuación sobre el diseñador de reportes dar un click con el botón derecho del ratón y del menú emergente que se presenta elegir la opción Insertar encabezado o pie de grupo. Del objeto DeCursosLibres arrastrar el campo CurProfe de la sección Campo de resumen en CmProfesor_Grouping al diseñador de reportes campos pero a la arrastrarlos sección de la Encabezado sección de grupo. Campos de Los demás Detalle en CmProfesor a la sección Detalle del generador de reportes. Por último proceda a cambiar las siguientes propiedades del objeto DataReport: DataReport1 DataMember CmProfesor_Grouping DataSource DeCursosLibres Aplicación Nº 3 Desarrollar una aplicación que permita crear un reporte para mostrar la información de la base de datos CursosLibres.MDB. Para tal fin debe preparar un formulario que Pág. 351 permita al usuario elegir una tabla, y en seguida se debe generar el reporte correspondiente. Además el usuario puede obtener una vista preliminar del reporte o una copia impresa. El diseño de la interfaz debe ser similar a la figura que se muestra a continuación: Para desarrollar nuestra aplicación, proceda a diseñar los reportes correspondientes según: Tabla Reporte Alumno DataReport1 Curso DataReport2 Laboratorio DataReport3 Luego, ubique los siguientes controles sobre el formulario: 1 marco 3 botones de opción 3 botones de comando En seguida proceda a establecer las propiedades según se indica: Pág. 352 Form1 Nombre FrmReporteCursosLibres Caption Cursos Libres BorderStyle 3-Fixed Dialog Frame1 Nombre FraTablas Caption Option1 Nombre OptTablaAlumno Caption Alumno Value True Option2 Nombre OptTablaCurso Caption Curso Value False Option3 Nombre OptTablaLaboratorio Caption Laboratorio Value False Command1 Nombre CmdVistaPrevia Caption VistaPrevia Picture C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Bitmaps\Win95\ Explorer.bmp Style 1-Graphical Pág. 353 Command2 Nombre CmdImprimir Caption Imprimir Picture C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Bitmaps\Win95\ Printfld.bmp Style 1-Graphical Command3 Nombre CmdSalir Caption Salir Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Private Sub CmdImprimir_Click() If OptTablaAlumno.Value Then DataReport1.PrintReport True ElseIf OptTablaCurso.Value Then DataReport2.PrintReport True ElseIf OptTablaLaboratorio.Value Then DataReport2.PrintReport True End If End Sub Private Sub CmdVistaPrevia_Click() If OptTablaAlumno.Value Then DataReport1.Show ElseIf OptTablaCurso.Value Then DataReport2.Show ElseIf OptTablaLaboratorio.Value Then DataReport2.Show End If End Sub Pág. 354 Private Sub CmdSalir_Click() Unload Me End Sub Cuando ejecute la aplicación, al dar un click en el botón Imprimir se visualizará el siguiente cuadro de diálogo, el cual nos permitirá confirmar o cancelar la impresión: Aplicación Nº 4 Diseñar un reporte combinando datos de la tabla Curso y Laboratorio. El reporte debe mostrar el código del curso, el nombre del curso, el nombre del profesor de teoría, el nombre del jefe de práctica y el horario de laboratorio. Dar formato al reporte según su criterio. FIN PARTE II Pág. 355 GUÍA DE LABORATORIO Parte III ELABORADO POR CARLOS CASTILLO PERALTA [email protected] INTRODUCCIÓN Pág. 356 La presente Guía de Laboratorio de Microsoft Visual Basic, se elaboró con la finalidad de complementar la parte teórica con la parte práctica del curso. Los problemas presentan un grado de dificultad gradual, es decir, en cada práctica primero se comienzan con problemas muy sencillos con la finalidad de que el estudiante esclarezca dudas y quede claro en los conceptos asimilados en la teoría, y luego en los problemas posteriores se va incrementando el nivel de dificultad. Esta guía explora una gran variedad de materias y contiene muchos problemas experiencia. recopilados Espero que a lo largo satisfaga las de varios necesidades años de de los estudiantes y colegas, ya que ha sido elaborada teniendo en cuenta los objetivos de aprendizaje del curso. Si desean compartirla con otros colegas, me agradaría mucho que lo hicieran, con la única condición de que siempre se respete el derecho del autor. Desde ya les deseo la mejor de las suertes en el aprendizaje de Microsoft Visual Basic. Lima, Diciembre del 2000 Carlos Castillo Peralta Microsoft Visual Basic Pág. 357 GUÍA DE LABORATORIO Nº 9 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Crear y utilizar clases dentro de una aplicación Visual Basic. • Diseñar y utilizar controles ActiveX personalizados. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab9, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Implementar una clase denominada Circulo, la cual debe contar con las propiedades públicas Radio y Area. Para tal fin seleccione la opción Agregar módulo de clase del Menú Proyecto: En la ficha Nuevo seleccione la opción Módulo de clase y haga click en Abrir. En seguida active la ventana de propiedades y cambie el nombre de la nueva clase por Circulo. Pág. 358 La ventana de código de la clase debe presentar la siguiente apariencia: A continuación proceda a ingresar el siguiente código para la clase: Private R As Double Public Property Get Radio() As Variant Radio = R End Property Public Property Let Radio(ByVal vNewValue As Variant) If IsNumeric(vNewValue) Then R = CDbl(vNewValue) Else R = 0 End If End Property Public Property Get Area() As Variant Area = 3.141592 * R * R End Property Private Sub Class_Initialize() R = 0 End Sub Pág. 359 Luego proceda a ubicar los siguientes controles en el formulario: 2 etiquetas 2 cajas de texto 3 botones de comando A continuación proceda a establecer las propiedades según se indica: Form1 Nombre FrmEjemClaseCirculo Caption Ejemplo con la clase Circulo Label1 Nombre LblRadio Caption Radio: Label2 Nombre LblArea Caption Area: Nombre TxtRadio Text1 Text Text2 Nombre TxtArea Text Una vez que ha establecido las propiedades indicadas, proceda a ingrese el siguiente código para el formulario de prueba: Pág. 360 Dim A As Circulo Private Sub Form_Load() Set A = New Circulo End Sub Private Sub Form_Unload(Cancel As Integer) Set A = Nothing End Sub Private Sub TxtRadio_Change() A.Radio = TxtRadio TxtArea = A.Area End Sub Guarde y pruebe su aplicación. El resultado debe ser similar a la siguiente figura: Aplicación Nº 2 Diseñar “Bienvenido un al Adicionalmente, control Mundo el ActiveX de control la que muestre Programación debe permitir con al el mensaje ActiveX”. usuario la posibilidad de cambiar el color del texto. Para comenzar nuestra aplicación, debe ingresar a Visual Basic y en la ventana de diálogo Nuevo Proyecto seleccione Control ActiveX, y luego haga click en el botón Aceptar. Pág. 361 Con esta opción, podrá crear un Control Active X. Las diferencias entre una opción y la usual (EXE estándar) las verá mejor conforme avance en el desarrollo de la presente Práctica de Laboratorio. En seguida añada un nuevo proyecto EXE estándar. Esto lo puede realizar desde el Menú Archivo opción Agregar Proyecto. Luego establezca las propiedades indicadas a continuación: Proyecto1 Nombre ActiveXMiControl UserControl1 Nombre MiControl ToolboxBitmap C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Bitmaps\Assorted\ Heart.bmp Proyecto2 Nombre VbpMiControl Form1 Pág. 362 Nombre FrmPruebaMiControl Caption Prueba de Control ActiveX BorderStyle 3-Fixed Dialog La ventana del Explorador de proyectos debe presentar la siguiente apariencia: En la ventana anterior haga click con el botón derecho del ratón sobre MiControl y elija la opción Ver código. En el ComboBox General Declaraciones seleccione seleccione UserControl Paint. Ahora y en ingrese el el ComboBox siguiente código: Private Sub UserControl_Paint() Const Msg = “Bienvenido al Mundo de la Programación ” & _ “con ActiveX” UserControl.Cls UserControl.Print Msg End Sub Luego en el Explorador de proyectos, hacer click con el botón derecho del ratón sobre la carpeta Controles de usuario y seleccione la opción Propiedades de ActiveXMiControl. seguida se mostrará la ventana Propiedades del proyecto: Pág. 363 En En la ventana anterior, en la ficha General, apartado Descripción del proyecto, escribir “Este es mi primer Control ActiveX”, tal como se muestra. Luego pulsar el botón Aceptar. Cierre todas las ventanas abiertas y haga un sólo click sobre la carpeta Controles de usuario. A continuación ingrese al Menú Archivo ActiveXMiControl.ocx, y seleccione guarde el la archivo opción con su Generar nombre por defecto. Luego, establezca como inicial el formulario FrmPruebaMiControl y añadir desde el Cuadro de herramientas nuestro control recientemente creado. Del Menú Proyecto seleccione la opción Componentes y veremos la descripción de nuestro control con su casilla de verificación activada, tal como se muestra a continuación: Pág. 364 En seguida, guarde y ejecute su aplicación. El resultado debe ser similar al siguiente: En este momento, Ud. acaba de terminar el diseño de su primer control ActiveX. No se preocupe por las diferencias que puede haber encontrado con respecto a la forma tradicional de programar. Conforme avancemos en el desarrollo de la práctica veremos que esta forma de programar en base a componentes es bastante sencilla. Pág. 365 Sin embargo, forma que nos debemos modificar nuestro control, de tal permita cambiar el color de texto de presentación. Para tal fin, vamos a hacer uso del Asistente para interfaz de control ActiveX y el Asistente para páginas de propiedades. Estos complementos deben ser instalados desde el menú principal Administrador Complementos de y complementos, seleccionar tal como la se opción indica a casillas de continuación: En la ventana anterior debe activar las verificación Cargado/Descargado y Cargar al iniciar. Luego haga click en el botón Aceptar. En seguida el menú Complementos deberá presentar siguiente apariencia: Pág. 366 la Luego, haga click sobre la opción Asistente para interfaz de control ActiveX. En seguida, aparecerá una ventana de presentación, haga doble click en el botón Siguiente. Tendremos entonces una ventana similar a la que se muestra: Haga click con el ratón sobre el botón << y a continuación elija de la lista de la izquierda ForeColor y haga click sobre el botón >. La propiedad ForeColor es la propiedad encargada de cambiar el color de texto, la cual no está disponible en nuestro control, por ello debemos asociarla. El aspecto del Asistente para interfaz de control ActiveX debe ser similar a: Pág. 367 Pulse, luego el botón Siguiente. En seguida aparecerá otra ventana, haga nuevamente click en el botón Siguiente. Pág. 368 Ahora hemos llegado a la ventana en la cual vamos a asociar a nuestro control la propiedad ForeColor. Seleccione del ComboBox Control UserControl y del ComboBox Miembro ForeColor, tal como se indica en la ventana anterior. Pulse el botón Siguiente Finalizar. y en Aparecerá detenidamente su la siguiente luego una contenido y ventana ventana luego de haga pulse el botón información, click en el lea botón Cerrar. A continuación guarde su aplicación y genere nuevamente el control. Para probar FrmPruebaMiControl el control y añada componente Microsoft Common añada formulario al CommandButton. Cambie un al abra Cuadro Dialog nombre de Control MiControl, el el un del formulario herramientas 6.0. En seguida CommonDialog botón el Command1 y un por CmdAceptar e ingrese el siguiente código: Private Sub CmdAceptar_Click() CommonDialog1.ShowColor MiControl1.ForeColor = CommonDialog1.Color MiControl1.Visible = False MiControl1.Visible = True End Sub Guarde y luego ejecute su aplicación, el resultado será similar al siguiente: Pág. 369 Al hacer click sobre el botón Aceptar, se presenta la siguiente caja de diálogo en la cual podemos elegir el nuevo color para el texto de bienvenida: Preste atención en que la propiedad Visible se utiliza para actualizar el contenido del control y se pueda ver el cambio de color. No es la mejor forma de hacerlo, deberíamos hacerlo mediante código dentro del mismo control, pero por el momento y para probar como asociar una propiedad a un control es más que suficiente. Aplicación Nº 3 Diseñar un control ActiveX que presente la forma de un cuadro de texto, pero que sólo admita números. Es decir, el usuario sólo podrá escribir en el control números, cualquier otro carácter que no sea un número, será rechazado por el control y no se imprimirá en el cuadro de texto. Al igual que en la aplicación anterior crear el grupo de proyectos y establezca las propiedades según: Pág. 370 Proyecto1 Nombre ActiveXNumBox UserControl1 Nombre NumBox ToolboxBitmap C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Bitmaps\Assorted\ Diamond.bmp Proyecto2 Nombre VbpNumBox Nombre FrmPruebaNumBox Caption Prueba de Control ActiveX BorderStyle 3-Fixed Dialog Form1 Para TextBox diseñar el cual nuestro debe control insertar utilizaremos en el un control formulario NumBox (UserControl). Luego elimine el contenido de la propiedad Text. Tener cuidado en que el control ha de ser del mismo tamaño del cuadro de texto. Luego, el cuadro de texto debe redimensionarse de acuerdo al control en tiempo de diseño, esto es a la hora de insertar nuestro control en un formulario. Para ello necesario ingresar el siguiente código: Private Sub UserControl_Resize() Text1.Top = 0 Text1.Left = 0 Text1.Width = UserControl.Width Text1.Height = UserControl.Height End Sub Pág. 371 es Private Sub UserControl_InitProperties() Text1 = Extender.Name End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) If Not (KeyAscii = 8 Or _ (KeyAscii >= 48 And KeyAscii <= 57)) Then KeyAscii = 0: Beep: Beep: Beep: Beep End If End Sub A continuación genere el control NumBox y cierre el formulario de diseño del control. Establezca como inicial el proyecto VbpNumBox y añada un control NumBox y un CommandButton al formulario FrmPruebaNumBox. Cambie el nombre del botón de comando por CmdSalir. A continuación guarde y ejecute su aplicación, el resultado debe ser similar al mostrado: El control que acabamos de diseñar permite escribir únicamente números, es decir es un cuadro de números. Trate de ingresar otros caracteres y vea lo que sucede. Aplicación Nº 4 Crear un control ActiveX que permita el ingreso del día, mes y el año correspondiente a cualquier fecha desde el año 1 hasta el año 9999. Deberá validar la fecha ingresada y no deberá permitir la edición de fechas no existentes como por Pág. 372 ejemplo 5 de Setiembre de 1752. El control deberá mostrar el día de la semana correspondiente a la fecha ingresada, tal como se muestra en la figura siguiente: El calendario Gregoriano actual obedece a la reforma del calendario Juliano que ordenó el papa Gregorio XIII en 1752, para ponerlo de acuerdo con los movimientos de los cuerpos celestes. Lo cual trajo como consecuencia adelantar las fechas del 2 de Setiembre al 14 de Setiembre de 1752, es decir las fechas comprendidas en este intervalo de tiempo existieron. Pág. 373 nunca Microsoft Visual Basic GUÍA DE LABORATORIO Nº 10 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Crear documentos ActiveX que se ejecuten directamente en una página Web. • Utilizar documentos ActiveX que incorporan hipervínculos. • Desarrollar documentos ActiveX para interactuar con bases de datos relacionales. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab10, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Como primer ejercicio vamos a desarrollar un documento ActiveX que permite recuperar información de la base de datos CursosLibres.MDB. Un documento ActiveX, es simplemente un formulario que se puede ejecutar directamente en los exploradores de Internet. Los documentos ActiveX se diseñan de la misma manera que los formularios estándar de Visual Basic. Para comenzar a desarrollar nuestro documento ActiveX, debe ingresar a Visual Basic y en la ventana de diálogo Nuevo Proyecto seleccione EXE de documento ActiveX y luego haga click en el botón Aceptar, tal como se indica en la figura: Pág. 374 A continuación proceda a diseñar la siguiente interfaz de usuario: Para tal efecto, proceda a ubicar los siguientes controles en el formulario: 3 etiquetas Pág. 375 1 cuadro combinado 1 control DataGrid 1 botón de comandos En seguida proceda a establecer las propiedades según se indica: Label1 Nombre LblTitulo1 AutoSize True Caption Instituto de Educación Superior Font Arial (Negrita 12) ForeColor &H00C00000& Label2 Nombre LblTitulo2 AutoSize True Caption “Víctor Andrés Belaúnde” Font Times New Roman (Negrita 24) ForeColor &H000000FF& Label3 Nombre LblTablas AutoSize True Caption Vacantes: Font Arial (Negrita 10) Combo1 Nombre CboTabla Font Arial (Negrita 10) Text DataGrid1 Pág. 376 Nombre BdgrdTabla Font Arial (Negrita 10) HeadFont Arial (Negrita 10) Command1 Nombre CmdAceptar Caption &Mostrar Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Dim Cn As ADODB.Connection Dim RsAlumno As ADODB.Recordset Dim RsCurso As ADODB.Recordset Dim RsLaboratorio As ADODB.Recordset Private Sub UserDocument_Initialize() Set Cn = New ADODB.Connection Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=C:\FundVB\Data\CursosLibres.MDB;” & _ “Persist Security Info=False” CboTabla.AddItem “Alumno” CboTabla.AddItem “Curso” CboTabla.AddItem “Laboratorio” End Sub Private Sub MostrarAlumno() Set RsAlumno = New ADODB.Recordset RsAlumno.ActiveConnection = Cn RsAlumno.CursorType = adOpenStatic RsAlumno.LockType = adLockReadOnly RsAlumno.CursorLocation = adUseClient RsAlumno.Open “Select AluCodigo As Código, ” & _ Pág. 377 “(AluPaterno + ' ' + AluMaterno) As Apellidos, ” & _ “AluNombres As Nombres From Alumno” Set DbgrdTabla.DataSource = RsAlumno End Sub Private Sub MostrarCurso() Set RsCurso = New ADODB.Recordset RsCurso.ActiveConnection = Cn RsCurso.CursorType = adOpenStatic RsCurso.LockType = adLockReadOnly RsCurso.CursorLocation = adUseClient RsCurso.Open “Select CurCodigo As Código, ” & _ “CurNombre As Nombre, ” & _ “CurVacantes As Vacantes, ” & _ “CurProfe As Profesor From Curso” Set DbgrdTabla.DataSource = RsCurso End Sub Private Sub MostrarLaboratorio() Set RsLaboratorio = New ADODB.Recordset RsLaboratorio.ActiveConnection = Cn RsLaboratorio.CursorType = adOpenStatic RsLaboratorio.LockType = adLockReadOnly RsLaboratorio.CursorLocation = adUseClient RsLaboratorio.Open “Select LabCodigo As Código, ” & _ “LabHora As Horario, ” & _ “LabProfe As [Jefe de práctica] From Laboratorio” Set DbgrdTabla.DataSource = RsLaboratorio End Sub Private Sub CmdMostrar_Click() Select Case CboTabla.ListIndex Pág. 378 Case 0 Call MostrarAlumno Case 1 Call MostrarCurso Case 2 Call MostrarLaboratorio End Select End Sub Finalmente resultado debe guarde ser y pruebe la su documento similar a figura ActiveX desarrollado ActiveX. que se en el muestra El a continuación: Aplicación Nº 2 Al anterior, documento añadirle un botón Acerca de, que ejercicio presente Pág. 379 la información referente al autor (o autores) de la aplicación. El diseño del formulario debe ser tal como se muestra a continuación: En primer lugar proceda a añadir un formulario estándar al proyecto. Cambie el nombre del formulario por el de FrmAcercaDe y diseñe la interfaz pedida. En seguida añada un botón de comandos al documento ActiveX y cambie su nombre por CmdAcerca. Luego haga doble click sobre dicho botón e ingrese el siguiente código: Private Sub CmdAcerca_Click() Load FrmAcercaDe FrmAcercaDe.Show vbModal End Sub Finalmente guarde y pruebe su aplicación. Como puede apreciar desarrollar documentos ActiveX no es nada complicado. Aplicación Nº 3 Al documento ActiveX desarrollado anteriormente añadirle un botón Ir a, que permita enlazarnos con la dirección que se Pág. 380 ingrese en el cuadro de texto adjunto. El diseño del documento se muestra a continuación: Para lograr lo que se pide, añada un botón de comandos y un cuadro de texto y cambie sus nombres por CmdURL y TxtURL respectivamente. Luego ingrese el siguiente código: Private Sub CmdURL_Click() UserDocument.Hyperlink.NavigateTo TxtURL End Sub Aplicación Nº 4 Elaborar contenido de un la documento tabla ActiveX Curso que de permita la base mostrar de Pág. 381 el datos CursosLibres.MDB. A continuación el usuario selecciona un curso y tiene la posibilidad de separar la matrícula o en su defecto matricularse en el curso de su elección. El diseño de la aplicación debe ser similar a la siguiente figura: Sugerencia: Añadir una nueva tabla a la base de datos para registrar a los alumnos matriculados o con separación matrícula. Microsoft Visual Basic GUÍA DE LABORATORIO Nº 11 Pág. 382 de Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Diseñar páginas Web dinámicas mediante aplicaciones DHTML. • Desarrollar aplicaciones DHTML para interactuar con los datos de un sistema distribuido de bases de datos relacionales. • Implementar aplicaciones mediante código Visual Basic y código HTML. • Agregar funcionalidad a sus aplicaciones para explorar Web. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab11, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 En DHTML este que ejercicio, lea un vamos número a desarrollar entero y muestre una su aplicación tabla de multiplicar. En su forma más sencilla, una aplicación DHTML (Dynamic HyperText Markup Language) puede consistir de una o más páginas HTML enlazadas con código Visual Basic y el modelo de objetos HTML dinámico. Para comenzar a desarrollar nuestra aplicación, ingresar a Visual Basic y en la ventana de diálogo Nuevo Proyecto seleccione Aplicación DHTML, y haga click en el botón Aceptar. Pág. 383 Al observar la ventana del Explorador de proyectos, esta presentará la siguiente apariencia: Visual Basic agrega automáticamente un Diseñador de páginas DHTML al proyecto. En seguida, haga doble click sobre DHTMLPage1 y proceda a establecer las propiedades que indican: DHTMLPage1 Nombre DHTMLTablaMultiplicar Id DHTMLTablaMultiplicar Pág. 384 se Para crear la interfaz de la aplicación DHTML, simplemente tenemos que ir agregando elementos HTML de la caja de herramientas. De esa manera, realice el diseño de la página mostrada en la siguiente figura: Una vez terminado el proceso de diseño de la página, seleccione el encabezado Tabla de Multiplicar y haga click en el cuarto botón de la barra de herramientas del Diseñador (Ajustar la selección en <SPAN> . . . </SPAN>). En seguida, sin dejar de seleccionar el encabezado, active la Ventana de propiedades y establezca lo siguiente: Tabla de Multiplicar Id Titulo A continuación proceda a establecer las propiedades para los demás controles según se indica: Pág. 385 TextField1 Nombre TxtN Id TxtN Value TextArea1 Nombre TxtTabla Id TxtTabla Value En seguida haga doble click sobre el cuadro de texto TxtN e ingrese lo siguiente: Private Sub DHTMLPage_Load() Document.bgColor = “Yellow” Titulo.Style.Color = “Red” End Sub Private Sub Titulo_onmouseout() Titulo.Style.Color = “Red” End Sub Private Sub Titulo_onmouseover() Titulo.Style.Color = “Blue” End Sub Private Sub TxtN_onpropertychange() If IsNumeric(TxtN.Value) Then Dim N As Integer, I As Integer, S As String N = Val(TxtN.Value) For I = 0 To 12 S = S & N & “ * ” & I & “ = ” & N * I & vbCrLf Next I Pág. 386 TxtTabla.Value = S Else TxtTabla.Value = “” End If End Sub Finalmente, guarde y pruebe su aplicación DHTML. El resultado debe ser similar a la figura siguiente: Aplicación Nº 2 Desarrollar una aplicación DHTML que permita visualizar el contenido de la tabla Curso de la base de datos CursosLibres.MDB. El diseño de la página debe ser similar al mostrado: Pág. 387 Para desarrollar nuestra aplicación, lo primero que debe de hacer es abrir una nuevo proyecto DHTML. Luego debe crear la conexión a la base de datos CursosLibres.MDB. Para ello ingrese al menú Proyecto seleccione la opción Agregar Data Environment. En la ventana Data Environment cambie el nombre del objeto DataEnvironment por DeCursosLibres y el de la conexión por CnCursosLibres. Luego, añada un Comando y denomínelo CmCurso. Haga click derecho sobre el comando y seleccione Propiedades. A continuación seleccione la opción Instrucción SQL e ingrese el siguiente código: Select CurCodigo, CurNombre, CurVacantes, CurProfe From Curso Pág. 388 Luego haga click en el botón Aceptar. El aspecto de la ventana Data Environment debe ser similar al siguiente: En seguida proceda a diseñar la página. Para ello digite los encabezados y etiquetas necesarios. Luego añada siguientes controles HTML al diseñador de páginas DHTML: 4 cajas de texto 4 botones de comandos Pág. 389 los A continuación, proceda a establecer las propiedades según se indica: “Víctor Andrés Belaúnde” Id Titulo TextField1 Nombre TxtCurCodigo Id TxtCurCodigo Value TextField2 Nombre TxtCurNombre Id TxtCurNombre Value TextField3 Nombre TxtCurVacantes Id TxtCurVacantes Value TextField4 Nombre TxtCurProfe Id TxtCurProfe Value Button1 Nombre CmdPrimero Id CmdPrimero Value Primero Pág. 390 Button2 Nombre CmdAnterior Id CmdAnterior Value Anterior Button3 Nombre CmdSiguiente Id CmdSiguiente Value Siguiente Button4 Nombre CmdUltimo Id CmdUltimo Value Ultimo Mediante el Data Environment, ADO y el objeto BindingCollection, es posible enlazar elementos de una página DHTML con un origen de datos cuando se carga la página. Esto le permite modificar los datos y escribir código para actualizar un conjunto de registros subyacente o simplemente desplazarse a través de los mismos. Por ejemplo, puede usar un objeto BindingCollection con un objeto Recordset de ADO para enlazar los elementos TextField de la página de código HTML con campos de la tabla Curso. Para Binding poder utilizar Collection es los objetos necesario de la cargar Microsoft la Data librería correspondiente. Selecciones el menú Proyecto y elija la opción Referencias. En el cuadro de diálogo Referencias seleccione la opción Microsoft Data Binding Collection, tal como se indica en la figura: Pág. 391 A continuación declare una variable de BindingCollection en la sección de Declaraciones de la DHTML y proceda a ingresar el código que se muestra: Dim ColBind As BindingCollection Private Sub DHTMLPage_Load() Document.bgColor = “Yellow” Titulo.Style.Color = “Blue” Set ColBind = New BindingCollection Set ColBind.DataSource = DeCursosLibres ColBind.DataMember = “CmCurso” ColBind.Add TxtCurCodigo, “Value”, “CurCodigo” ColBind.Add TxtCurNombre, “Value”, “CurNombre” ColBind.Add TxtCurVacantes, “Value”, “CurVacantes” ColBind.Add TxtCurProfe, “Value”, “CurProfe” End Sub Private Function CmdPrimero_onclick() As Boolean Pág. 392 tipo página DeCursosLibres.rsCmCurso.MoveFirst End Function Private Function CmdAnterior_onclick() As Boolean DeCursosLibres.rsCmCurso.MovePrevious If DeCursosLibres.rsCmCurso.BOF Then DeCursosLibres.rsCmCurso.MoveFirst End If End Function Private Function CmdSiguiente_onclick() As Boolean DeCursosLibres.rsCmCurso.MoveNext If DeCursosLibres.rsCmCurso.EOF Then DeCursosLibres.rsCmCurso.MoveLast End If End Function Private Function CmdUltimo_onclick() As Boolean DeCursosLibres.rsCmCurso.MoveLast End Function Finalmente, guarde y pruebe su aplicación. Aplicación Nº 3 Diseñar una aplicación que permita cargar en una tabla HTML el contenido de la tabla Curso. La tabla HTML se debe crear dinámicamente de acuerdo al número de registros existentes. Para desarrollar nuestra aplicación, añada una nueva página DHTML al proyecto anterior. Para ello seleccione el menú Proyecto y elija la opción Agregar DHTML Page. En seguida proceda a ingresar el siguiente código: Dim ColBind As BindingCollection Pág. 393 Private Sub DHTMLPage_Load() Dim RsResults As ADODB.Recordset Set ColBind = New BindingCollection Set ColBind.DataSource = DeCursosLibres ColBind.DataMember = “CmCurso” Set RsResults = DeCursosLibres.rsCmCurso Do While Not RsResults.EOF Document.body.insertAdjacentHTML “BeforeEnd”, _ “<Table Border Cellspacing=1 Cellpadding=7>” & _ “<Td Width=50>” & RsResults!CurCodigo & “</Td>” & _ “<Td Width=200>” & RsResults!CurNombre & “</Td>” & _ “<Td Width=50>” & RsResults!CurVacantes & “</Td>” & _ “<Td Width=200>” & RsResults!CurProfe & “</Td>” & _ “</Table>” RsResults.MoveNext Loop RsResults.MoveFirst RsResults.Close End Sub Finalmente, no olvide cambiar el componente de inicio antes de ejecutar su aplicación. Aplicación Nº 4 Diseñar una aplicación DHTML que permita seleccionar de un control Select (similar a un cuadro combinado), el nombre de un profesor y a continuación se muestren en una tabla HTML dinámica los cursos que dicta dicho profesor. Un elemento Select, es similar a un cuadro combinado. Por ejemplo, para agregar un elemento Select denominado SelProfe a una la página HTML, simplemente arrastrar el elemento a la página. A continuación establecer las siguientes propiedades: Pág. 394 Seleccion1 Nombre SelProfe Id SelProfe Value Para especificar los elementos de lista que se deben mostrar en el elemento Select agregar el siguiente código al procedimiento de evento Load de la página HTML, veamos: Private Sub DHTMLPage_Load() Dim SelElement As HTMLSelectElement Dim Cn As ADODB.Connection Dim RsProfe As ADODB.Recordset Set Cn = New ADODB.Connection Set RsProfe = New ADODB.Recordset Cn.Open “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=C:\FundVB\Data\CursosLibres.MDB;” & _ “Persist Security Info=False” RsProfe.ActiveConnection = Cn RsProfe.CursorType = adOpenStatic RsProfe.LockType = adLockOptimistic RsProfe.CursorLocation = adUseClient RsProfe.Open “Select Distinct CurProfe From Curso” Do While Not RsProfe.EOF() Set SelElement = Document.createElement(“OPTION”) SelElement.Text = RsProfe!CurProfe SelProfe.Options.Add SelElement RsProfe.MoveNext Loop End Sub Al ejecutar su aplicación debe ser similar a la figura mostrada: Pág. 395 Finalmente proceda a a manera escribir el de ejercicio código para necesario el para estudiante, mostrar información relacionada con cada profesor. Pág. 396 la Microsoft Visual Basic GUÍA DE LABORATORIO Nº 12 Objetivos Luego de completar este laboratorio, el estudiante será capaz de: • Utilizar funciones API de Windows desde Microsoft Visual Basic. • Convertir declaraciones de C a Visual Basic. • Añadir un sistema de ayuda a una aplicación. • Usar el asistente para empaquetado y distribución. • Generar programas de instalación mediante disquetes, carpetas en una unidad local de red o en una publicación Web. Consideraciones Para el desarrollo del presente laboratorio Ud. deberá crear una carpeta C:\FundVB\Lab12, para guardar sus trabajos correspondientes a este laboratorio. Aplicación Nº 1 Un programador de aplicaciones Visual Basic, además de conocer su entorno programación, de conocido trabajo, debe generalmente conocer como su entorno Interfaz de de Programación de Aplicaciones para Windows (Windows Application Programming Interface, Windows API). La API de Windows viene a ser un conjunto de funciones desarrolladas en lenguaje C. Sin embargo, muchos programadores de Visual Basic recurren a estas funciones para conseguir hacer lo que es imposible (o muy complicado) desde Visual Basic. Pág. 397 Las funciones API de Windows no son nada complicadas como pueden pensar algunos programadores de Visual Basic. Como primer ejercicio vamos a escribir una aplicación que permita modificar el título de un formulario. En la práctica, siempre se modifican los títulos del formulario con la propiedad Caption de Visual Basic, pero este ejercicio ofrece una manera sencilla de declarar y llamar a una API de Windows. El primer paso consiste en añadir un módulo de código al proyecto. En seguida proceda a declarar la función en la sección de declaraciones del módulo: Public Declare Function SetWindowText Lib “user32” _ Alias “SetWindowTextA” (ByVal hWnd As Long, _ ByVal lpString As String) As Long Luego, en el formulario ingrese el código que se muestra a continuación: Private Sub Form_Load() SetWindowText Form1.hWnd, “Bienvenidos a la API de Windows” End Sub Al ejecutar su aplicación, su resultado debe ser similar a la siguiente figura: Pág. 398 Aplicación Nº 2 Desarrollar archivo Wav o una aplicación Midi. Utilizar que la permita función reproducir API de un Windows mciExecute para lograr el objetivo deseado. Como se sabe, el lenguaje C diferencia las letras mayúsculas de las minúsculas. Por ello, si Ud. comete un error, por ejemplo minúscula (o utiliza una viceversa), letra la mayúscula función en lugar declarada de no una será reconocida y obtendrá un mensaje de error. Para evitar este tipo de problemas, vamos a utilizar el Visor API de Windows. En seguida, del menú Complementos elija la opción Administrador de Complementos. Del cuadro de diálogo que se presenta cargar la opción Visor de API de VB 6. Al dar un click en el botón Aceptar, se añadirá en el menú Complementos la opción Visor de API. En seguida ingrese al Visor de API. Se debe presentar una pantalla similar a la siguiente: Pág. 399 En elija la la pantalla opción anterior, Cargar seleccione archivo de el texto. menú En el Archivo cuadro y de diálogo que se presenta elegir el archivo Win32api.Txt y dar un click en el botón Abrir. Pág. 400 De la siguiente pantalla Ud. podrá seleccionar la función que desea, luego active la opción público y dar un click en el botón Agregar para visualizar el código de declaración de dicha función. En seguida haga click en el botón Copiar y pegue dicho código a su aplicación. Recordar que la declaración de la función API se debe realizar en un módulo, por lo tanto debe agregar un nuevo módulo y pegar el siguiente código: Public Declare Function mciExecute Lib “winmm.dll” _ (ByVal lpstrCommand As String) As Long Luego proceda a diseñar la interfaz de la aplicación. Para ello ubique los siguientes controles: 1 control Image Pág. 401 2 botones de comando En seguida establezca las propiedades según se indica a continuación: Form1 Nombre FrmMultimedia Caption Hacer sonar un fichero Wav o Midi BorderStyle 3-Fixed Dialog Image1 Picture C:\Archivos de programa\Microsoft Visual Studio\Common\Graphics\Icons\Misc\Mike.ico Stretch True Command1 Nombre CmdEjecutar Caption &Ejecutar Command2 Nombre CmdSalir Caption &Salir Una vez establecidas las propiedades, proceda a ingresar el siguiente código: Private Sub CmdEjecutar_Click() iResult = mciExecute(“Play c:\vbN2\bmp\34.wav”) End Sub Private Sub CmdSalir_Click() Unload Me End Sub Aplicación Nº 3 Pág. 402 Uno de los temas en los que Windows ha creado un estándar es el sistema de ayuda de las aplicaciones. Para ello incluye una aplicación denominada WinHelp como motor de ayuda de Windows. Los pasos necesarios para crear un sistema de ayuda son los siguientes: • Crear un archivo de texto RTF. • Compilar el archivo RTF mediante el compilador de ayudas Help Workshop, para obtener el archivo HLP. • Utilizar el motor de ayuda WinHelp. En vista de lo anterior, lo primero que necesitamos para crear nuestro sistema de ayuda, es un archivo con formato RTF donde se incluirá el texto de la ayuda. Para ello ingrese a Microsoft Word 2000 y digite lo siguiente: Microsoft Visual Basic 6.0 Curso de programación Profesor Carlos Castillo Peralta Contenido • Microsoft Visual Basic Nivel I • Microsoft Visual Basic Nivel II • Microsoft Visual Basic Nivel III En seguida ubique el cursor en la última línea de texto y presione la combinación de teclas Ctrl + Enter, para comenzar en una nueva página. A continuación digite lo siguiente: Pág. 403 Microsoft Visual Basic 6.0 Curso de programación Profesor Carlos Castillo Peralta Nivel I • • • • • • • Conceptos básicos Elementos del lenguaje Entrada y salida de datos Sentencias de control Arreglos Estructuras Archivos de datos Volver En seguida ubique el cursor en la última línea de texto que acaba de ingresar y pulse Ctrl + Enter para comenzar a digitar el siguiente texto en una página diferente: Microsoft Visual Basic 6.0 Curso de programación Profesor Carlos Castillo Peralta Nivel II • Creación de bases de datos • Aplicaciones Cliente Servidor • Sentencias SQL • Entorno de datos • Objetos de Datos ActiveX (ADO) • Reportes Volver Pág. 404 De manera análoga a los demás casos, ubique el cursor en la última línea de texto y presione Ctrl + Enter. En seguida ingrese el siguiente texto: Microsoft Visual Basic 6.0 Curso de programación Profesor Carlos Castillo Peralta Nivel III • Creación componentes • Lenguaje HTML • Visual Basic Script • Aplicaciones DHTML • API de Windows • Creación de archivos de ayuda • Empaquetado y distribución Volver Finalmente, debe obtener un archivo de cuatro páginas. Guarde su archivo como MiAyuda.RTF. El archivo de ayuda que vamos a construir va a utilizar más de una página, y en ese caso se requiere especificar un identificador para cada página. Ahora procederemos a crear los identificadores de páginas. Para ello ubicar el cursor en la primera página antes del encabezado Microsoft Visual Basic 6.0 y seleccione del menú Insertar la opción Nota al pie. Luego, ingresar como marca personal el símbolo # tal como se muestra en la siguiente figura: Pág. 405 Al dar click en el botón Aceptar, el cursor se ubicará automáticamente en el pie de página donde debe digitar VBMain delante del símbolo #. En la misma página, ubicar el cursor delante de la palabra Microsoft Visual Basic Nivel I y darle el atributo de subrayado doble. Luego, escribir VB1 inmediatamente después del texto subrayado y a este identificador darle el atributo de oculto. Realizar líneas, acciones después del similares texto para Microsoft las Visual dos siguientes Basic Nivel II escribir VB2 y para Microsoft Visual Basic Nivel III escribir VB3. No olvidar que estos identificadores deben tener atributo de oculto. En la segunda página ubicar el cursor antes del encabezado Microsoft Visual Basic 6.0 y seleccione del menú Insertar la opción Nota al pie. Luego, ingresar como marca personal el símbolo # y luego digitar en el pie de página VB1. Luego en la misma página, posicionar el cursor delante de la palabra Volver y darle el inmediatamente atributo después de subrayado del texto doble. Escribir subrayado y VBMain a identificador darle el atributo de oculto. Pág. 406 este Continuar de manera similar con las siguientes páginas. Al concluir vuelva a guardar su archivo. La primera página debe presentar una apariencia similar a la siguiente figura: Continuando con nuestro esquema, ahora debemos generar el archivo HLP a partir del archivo RTF que acabamos de crear. Para ello debemos ejecutar la aplicación Microsoft Help Workshop. Desde el menú Inicio, elija la carpeta Programas, luego elija la carpeta Microsoft Visual Studio 6.0, en seguida seleccione la carpeta Herramientas de Microsoft Visual Studio 6.0, y luego haga clic sobre la aplicación Help Workshop. A continuación se presentará una ventana similar a la mostrada en la siguiente figura: Pág. 407 Seleccione continuación se el menú mostrará File un y elija cuadro de la opción diálogo New. similar A al siguiente: Seleccione la opción Help Project y dar un click en el botón OK. En seguida se presentará una ventana en la cual debe indicar el nombre y la ruta del archivo HLP que desea generar. Para nuestro caso digite MiAyuda y haga click sobre el botón Guardar, tal como se indica en la figura que se muestra a continuación: Pág. 408 Al hacer click en el botón Guardar, en seguida se presentará la siguiente pantalla: Ahora que Ud. ha creado un proyecto de ayuda, necesita agregar la información sobre su archivo o archivos de ayuda. Pág. 409 ¿Ha creado su archivo de ayuda MiAyuda.RTF? Si Ud. ya lo ha creado haga click en el botón Files y en seguida aparecerá la siguiente pantalla: Luego dar un click en el botón Add. En seguida se presentará la siguiente ventana en la cual debe especificar el nombre y la ruta de su archivo de ayuda RTF. Para nuestro seleccione MiAyuda y haga click en el botón Abrir. Pág. 410 En seguida se mostrará la siguiente pantalla. Ud. haga click sobre el botón OK. A continuación se presentará una pantalla similar a la figura mostrada: Pág. 411 A continuación vamos a definir una ventana. Para ello haga click sobre el botón Windows. En seguida aparecerá un cuadro de diálogo en el cual debe ingresar el nombre de la ventana. Para nuestro caso digite Main. Luego haga click en el botón OK. En seguida se presentará el siguiente cuadro de diálogo. En la ficha General ingrese el texto que se indica para la barra de título de la ventana. Pág. 412 En la ficha Position defina el tamaño inicial de la ventana de ayuda, para ello haga click en el botón Auto-Sizer. En seguida se presentará una ventana de prueba similar a la que se muestra en la figura siguiente. Cambie las dimensiones de esta ventana según su parecer y haga click en el botón OK. Pág. 413 A continuación seleccione la ficha Buttons y active los botones que Ud. quiere agregar para su ventana. Luego seleccione la ficha Color. En seguida se presentará una pantalla similar a la siguiente: Pág. 414 Para cambiar el color de la zona de no desplazamiento o la zona de desplazamiento pulse el botón Change al lado de la ventana de muestra. Escoja el color que Ud. desee y entonces haga click en el botón Aceptar. El archivo de proyecto debe presentar una apariencia similar a la figura mostrada: Bueno, Ud. acaba de crear su primer proyecto de ayuda básico. Más adelante si así lo necesitará puede cambiar cualquiera de estas opciones. Para ello simplemente debe abrir su archivo de proyecto de ayuda y realizar los cambios que considere pertinente. Finalmente guarde y pruebe su proyecto. Para lo cual debe dar click en el botón Save and Compile. En seguida presentará una pantalla similar a la siguiente: Pág. 415 se En seguida ingrese al menú File y elija la opción Run WinHelp. Luego, se presentará una pantalla similar mostrada: Pág. 416 a la En seguida dar click en el botón View Help. A continuación se presentará una pantalla similar a la figura siguiente. Pruebe ingresando a las otras páginas, para ello simplemente haga click en cualquiera de los tres ítems que se muestran en la sección Contenido. ¿Sabe Ud. como añadir una imagen de mapa de bits a nuestro archivo de ayuda? La respuesta es bastante sencilla. Para ello realice los siguientes pasos: Ingrese a Microsoft Word 2000 y proceda a abrir el archivo MiAyuda.RTF. Ubiquese en la primera página y añada el siguiente texto {BMC CCP.BMP} antes del nombre del profesor. Luego guarde su archivo. A continuación cargue el Help Workshop. Luego dar click sobre el botón Bitmaps. Se presentará una pantalla similar a la figura siguiente: Pág. 417 En seguida haga click en el botón Add. A continuación se presentará una ventana similar a la siguiente figura: En el cuadro de diálogo anterior seleccione la ruta que se indica. Luego haga click en el botón OK. Finalmente, grabe y compile su proyecto de ayuda. Para ello dar click en el botón View Help. Pág. 418 A continuación se presentará una ventana similar a la siguiente figura: Por último, veremos como utilizar nuestros archivos de ayuda desde una aplicación Visual Basic. Para tal fin abra un nuevo proyecto y añada un botón de comandos al formulario. Cambie el nombre del botón por CmdAyuda y proceda a ingresar el siguiente código: Private Sub CmdAyuda_Click() Dim Ayuda Ayuda = Shell(“C:\Windows\WinHelp.exe ” & _ “C:\FundVB\Lab12\MiAyuda.HLP”, 1) End Sub Aplicación Nº 4 Pág. 419 Después de crear una aplicación Visual Basic, por lo general debemos proporcionársela al usuario final, ya sea en disquetes, CD, a través de una red local, o bien a través de una Intranet o Internet. Esto requiere primero empaquetar la aplicación y después distribuirla. Como ejemplo, vamos a generar el programa de instalación para la aplicación creada en el ejercicio anterior. Para ello es necesario que tenga abierta dicha aplicación. Primero debemos iniciar el Asistente de empaquetado y distribución. Para tal fin, del Menú Complementos seleccione la opción Package Administrador and de Deployment complementos Wizard. Al y añada momento de la utilidad iniciar el Asistente se visualizará una ventana similar a la siguiente figura: En seguida haga click en el botón Empaquetar. Esto hará que el Asistente le presente varios cuadros de diálogo que le Pág. 420 pedirán información referente al proyecto que vamos a empaquetar y le permitirá elegir qué opciones quiere incorporar al programa de instalación, el tipo de empaquetado, la carpeta donde se almacenará el paquete de instalación, qué archivos desea incluir adicionalmente en el paquete, qué grupos y elementos de grupo del menú Inicio se deberán crear en el equipo del aplicación, usuario final etc. medida A durante que la instalación avanza, si de necesita la más información consulte al Jefe de Práctica. Una vez concluido el proceso de empaquetado cierre Microsoft Visual Basic. Luego haga click en el menú Inicio y seleccione la opción Ejecutar. Seguidamente ingrese la ruta de nuestro programa de instalación y dar click en Aceptar, tal como se indica en la figura: En esos instantes se dará inicio a la instalación de nuestra aplicación. Concluido este proceso, seleccione el menú Inicio, carpeta Programas y ubique la carpeta que contiene la aplicación. Finalmente proceda a ejecutar su aplicación. Fin de las prácticas de laboratorio. Suerte. Pág. 421