VISUAL BASIC: Para entender lo que este lenguaje de programación quiere decir es necesario descomponerla en dos partes: VISUAL: Anteriormente era necesario escribir una gran cantidad de código en el lenguaje para formar la interfaz de usuario y además eran mucho menos eficientes y más difÃ−ciles de entender. Mediante la creación de una interfaz de usuario mediante objetos (controles) prediseñados puede cambiar de forma sencilla la interfaz de usuario reduciendo el tiempo de trabajo y la eficiencia del mismo, esto es lo que propone la palabra Visual, crear de forma sencilla la interfaz de usuario de modo que no sea necesario dedicar tanto tiempo a la creación de la misma. BASIC: Esta palabra es la abreviación de las siglas (en inglés) Beginners All-Purpose Symbolic Instriction Code, se refiere al lenguaje de programación más utilizado en la historia de la informática y la programación, aunque en principio era un poco más sencillo, ahora muchas más instrucciones y métodos que se han adaptado para crear aplicaciones bajo ambiente Windows. Entonces Visual Basic se refiere al lenguaje de programación de computadoras que combina las facilidades de trabajo que ha desarrollado Microsoft en un entorno de interfaz visual, con el lenguaje de programación BASIC, por ello ahora la forma de crear una interfaz de usuario se torna mucho mas económica, en los que a lÃ−neas de código se refiere y por lo tanto a ganar tiempo para realizar programas con mucho y hasta nada de código. 1. EL ENTORNO DE DESARROLLO DE VB 6.0 Primero, se presenta la primera pantalla que aparece al ejecutar el comando de entrada de VB 6.0. Fig. 1. FIGURA 1. Primera Pantalla que aparece al ejecutar VB 6.0. En ella, aparece el cuadro de diálogo “Nuevo proyecto” que ofrece tres fichas de opciones al comenzar en la sesión con Visual Basic, estas son: • Nuevo: Propone crear un nuevo proyecto. En ella aparece seleccionado por defecto EXE estándar. EXE es la abreviación de EXECUTE o en español -proyecto ejecutable-. Esta opción nos crea un nuevo proyecto que después de compilado nos crea una aplicación. Este es el elemento que más comúnmente utilizaremos, ya que la presente investigación hace referencias a creaciones ejecutables. No hay ejemplos de librerÃ−as dinámicas (*.dll o DLL ActiveX) ni a controles ActivesX (*.ocx) ni otro tipo de aplicación; asÃ− que si desea buscar información sobre estos tipos de proyectos, puede abandonar esta lectura. • Existente: Propone abrir un proyecto que fue creado anteriormente, desplega el cuadro de diálogo Abrir para buscar el proyecto en el directorio. • Reciente: Propone también abrir un proyecto ya creado, pero a diferencia de Existentes, éste nos desplega una lista de los proyectos que han sido creados o modificados en las últimas sesiones de trabajo con VB 6.0. Para comenzar, se creará un nuevo proyecto haciendo doble-clic en EXE estándar. VB desplegará la siguiente pantalla. Figura 2. Entorno integrado de desarrollo de VB 6.0 1
El Sector 1 en la Fig. 2 se llama Formulario del proyecto. El formulario será la ventana de aplicación o interfaz del usuario cuando el programa se compile o se ejecute. Un programa puede tener uno o varios formularios, y se puedes abrir y cerrar cada uno de ellos según se necesite. En ellos se agregarán los controles que sirven para crear una aplicación e interactuar con el usuario. La pantalla blanca que se ve detrás del formulario es la pantalla donde se agrega el código del programa. La Fig. 3 (Sector 2 de la Fig. 2) es el Cuadro de herramientas, ella proporciona algunas de las herramientas que puede agregar al formulario en tiempo de diseño. Estas herramientas son llamadas controles y alguno de ellos son las Etiquetas (Labels), Cuadro de texto (TextBox), botones de comandos (CommandButton. Ver Controles en la Sección Nro. 4. Para realizar la primera aplicación (Programa #1) se deben agregar dos controles al formulario número uno. Haga clic sobre CommandButton en Cuadro de Herramientas; el puntero del mouse tomará una forma de cruz cuando esté por encima del formulario, dibuje el tamaño del control en el mismo, para ello mantenga el clic presionado mientras dibuja el tamaño y luego suelte el botón del mouse. Se dibujará en el formulario un botón de comando con Caption (texto que se muestra) igual a Command1 e igual nombre. Agreguemos también un Cuadro de texto (Textbox), para ello haga clic sobre Textbox y luego dibújelo en el formulario mediante el mismo procedimiento, aparecerá un cuadro de texto con Text (texto que se ve igual a Text1) e igual nombre. El Sector 3 de la Fig. 2 muestra la Barra de herramientas (parte superior de la Fig. 2). Las Barras de herramientas también se encuentran en programas como Word, PowerPoint y Excel, entre otros y por ello ya es muy probable que ya sean conocidas. Ella proporciona un acceso a los comandos utilizados cuando está creando una aplicación. Puede agregar o quitar barras si hace clic en el botón secundario del mouse sobre la barra de herramientas y luego clic sobre la que desea agregar o quitar. Para usar la Barra de herramientas dirÃ−jase al Menu Ejecutar y luego haga clic sobre Iniciar. Se iniciará una prueba del programa, por ahora sólo mostrará el formulario con los controles Command1 y Text1. También puede agregar un formulario al proyecto, para ello dirÃ−jase al menú Proyecto y luego haga clic sobre Agregar formulario, después clic sobre Formulario. La Fig. 4 modela lo que es el Explorador de Proyectos (Sector 4 de la Fig. 2). Una aplicación puede contener uno o mas elementos (nuestro ejemplo tiene dos formularios) y si quiere tener acceso a uno de ellos tendrá que ir al Explorador de proyectos hacer un clic sobre el elemento y luego clic en Ver Objeto o Ver Código, según lo que desea. En este ejemplo existe un proyecto con dos formularios Form1(no seleccionado) y Form2 (seleccionado). Si hace clic en Ver Objeto mostrará el formulario 2 si lo hace en Ver Código mostrará el código de este formulario. En principio sólo es una pantalla en blanco, ya que no hay código hasta el momento. Si no puede ver esta ventana directamente, tendrá que ir al menú Ver de la Barra de herramientas y luego hacer clic sobre Explorador de Proyectos. En la Fig. 5 se hace referencia a la Ventana Propiedades (Sector 5 de la Fig. 2). Las propiedades son un conjunto de caracterÃ−sticas que determinarán la forma de los controles o formularios. Algunas propiedades comunes son el nombre (para identificarlo en el código), el alto, ancho, color del fondo y muchas mas según el tipo de control con el que trabaja, por ello cambia cada vez que cambia el enfoque del tipo de control. Es decir, las caracterÃ−sticas de un formulario no son iguales a las caracterÃ−sticas de una etiqueta, botón de comando o de un cuadro de texto. Por ejemplo, haga clic sobre el botón de comando Command1 y eche un vistazo sobre las diferentes propiedades, observará un cuadro igual a la Fig. 5. Ahora, haga clic sobre cualquier parte del formulario (que no sea Command1) o sobre el control Text1, verá que algunas 2
propiedades no se encuentran, y en cambio aparecen otras. Para utilizar esta Ventana, presione un solo clic sobre el Control Command1 y en la Ventana Propiedades, cambie Caption de Command1 a Saludar, vaya ahora al Cuadro de texto, ubique la propiedad Text, borre el contenido (Text1) y déjelo en blanco. La Fig. 6 que proporciona la parte 6 de la Fig. 2 es la imagen de la ventana Posición del Formulario. à sta ventana permite cambiar la posición del formulario antes de que la aplicación vaya a ser ejecutada. Puede utilizar esta pantalla cambiando la posición del formulario arrastrándola con el ratón (mouse) y luego verificarla ejecutando el proyecto. Programa #1. Saludar: Ahora se debe escribir un poco de código para crear la primera aplicación. Para comenzar se puede hacer de tres maneras. Verifique que el formulario 1 con los dos controles (TextBox y CommandButton) este activo en el Explorador de Proyectos, haga clic sobre Ver Código y aparecerá una pantalla en blanco para empezar a escribir código, también verá que inmediatamente arriba de esta pantalla aparece la palabra (General) que contiene una lista, busque en ella la palabra Command1, este llamará directamente al evento clic, es decir, las secuencias de comandos que se efectuarán al hacer clic en este botón. La otra manera es verificar que el formulario activo (en el Explorador de Proyectos) sea el que tiene los dos controles (Command1 y Text1), haga clic en Ver Objeto, y luego haga doble clic sobre el botón que dice Saludar, se desplegará el siguiente código: Private Sub Command1_Click() End Sub La tercera manera es escribir directamente el código que se mostró. AquÃ− se escribirán las sentencias que se efectuarán cuando haga clic en el botón Saludar (ya que Command1 es el nombre del botón). Ahora copie y pegue este código o escriba, de tal manera que quede de la siguiente manera: Private Sub Command1_Click() If Command1.Caption = "Saludar" Then Text1.Text = "¡Hola!, ¿Cómo estas?" Command1.Caption = "Borrar" Else Text1.Text = "" Command1.Caption = "Saludar" End If End Sub 3
Ejecute la aplicación con F5 o Iniciar en la Barra de Herramientas e interactúe con el programa. Si desea una explicación detallada de este programa vaya a la Sección Explicación Detallada de Programas en los capÃ−tulos finales. (Ver Ã−ndice) De aquÃ− podemos concluir que las propiedades de los controles pueden cambiar, tanto en tiempo de diseño como en tiempo de ejecución. Nota: Para cerrar una sesión de trabajo con VB y abrir un Nuevo proyecto, puede guardar el formulario, el proyecto y luego buscar en el Menú Archivo de la barra de herramienta, haga clic en Quitar Proyecto, esto cierra el proyecto y puede crear uno nuevo en Archivo - Nuevo Proyecto. Si no quita el proyecto y crea uno nuevo, se creará un Grupo de Proyectos. 2. PROPIEDADES, Mà TODOS, EVENTOS Y CONSTANTES. • Propiedades: Como ya se ha mencionado en varias ocasiones, los controles y los formularios contienen propiedades, éstas son, sus caracterÃ−sticas particulares que los diferencian de otros. Por ejemplo si hablamos de una silla, ésta tendrá propiedades como el material, número de patas, tamaño, forma del asiento, y otras. En Visual Basic las propiedades se identifican en el código por tener la forma: Objeto.Propiedad = Valor Donde Objeto es el elemento al cual se hace referencia y valor es una constante o variable que llama a una constante. El valor que identifica la propiedad. Si hablamos de la Silla, podrÃ−amos decir:. Silla.Material = Madera Silla.Patas = 4 Silla.Tamaño = 1,5 Se dice una variable que llama a una constante ya que, puede asignar a una variable un valor y luego llamar a esta variable de la siguiente manera: Material = Madera Silla.Material = Material En el Examinador de Objetos, o en el transcurso de una programación se pueden identificar las propiedades por tener a su lado una figura como esta: Lleve a cabo una pequeña demostración. En el programa #1, dirÃ−jase a la pantalla Ver Código y escriba Command1. (la palabra Command1 más el punto), se desplegará una lista de propiedades y métodos de los botones de comandos, en este caso de Command1. Observe la figura que se encuentra a su lado.
4
• Los Métodos: Los métodos son las diferentes acciones que puede realizar un elemento. Por ejemplo la silla puede inclinarse, volver a su posición inicial, subir o bajar su cabecera, moverse de un lado a otro, entre otros. Los Métodos se diferencian en el código de las propiedades ya que no les sigue el signo igual, pero podrÃ−a tener un valor, es decir, tienen la siguiente forma: Objeto.Método [Valor] AsÃ− podemos llamar los siguientes métodos de la silla: Silla.Inclinar 20° Silla.Volver El valor sólo aparece en algunos casos, es decir es opcional y depende del método que se esté utilizando. Puede tener más de un valor. Ejemplo: Silla.Mover (3mts adelante, 2mts hacia la derecha) Los métodos se identifican en el Examinador de Objetos o en el transcurso de la codificación por tener a su lado la siguiente figura: Realice la misma prueba que en las propiedades (Command1.) y ubique los métodos mediante la figura. • Los Eventos: Los Eventos son los acontecimientos que pueden suceder mientras ejecuta una aplicación, es decir, el clic a un botón de comando o a una etiqueta, esto llama a un procedimiento, a una secuencia de comandos. Estos se pueden Observar en el Código por la secuencia Sub, de la siguiente manera. Sub Objeto_Evento([argumentos]) • Comando1 • Comando2 • ...Otros Comandos End Sub Por ejemplo, haciendo referencia a la silla observe lo que sucede al evento sentarse. Sub Silla_Sentarse() Peso es Variable Si Peso es mayor a 100kg, entonces: Silla.Romper 5
Sillas.Patas=0 Sino Silla.Soportar Fin de Secuencia Si End Sub El código describe los sucesos que se ejecutarán cuando suceda el evento sentarse. Los eventos pueden encontrarse en el Examinador de Objetos, por medio de la figura de un rayo. • Las Constantes: Son valores numéricos o cadenas de texto que hacen referencia a un estado. Por ejemplo: En las casillas de verificación la propiedad Value del control puede tomar tres constantes: • vbUnchecked, que corresponde al valor 0. • VbChecked, que corresponde al valor 1. • VbGrayed, que corresponde al valor 2 Se puede colocar su cadena de texto que corresponde a dicho estado o su valor numérico si se quiere colocar en su forma abreviada. En VB 6.0 se utilizan mucho este tipo de constantes. Las constantes se identifican en el Examinador de Objetos por tener a su lado una figura como la siguiente: 3. EL EXAMINADOR DE OBJETOS El Examinador de Objetos es un tipo de ayuda de VB, que se utiliza generalmente para encontrar los detalles de las distintas propiedades, los métodos, funciones, eventos o constantes. Por ello es muy funcional a la hora de programar. Para acceder a él, mientras esté en una sesión de programación, presione la tecla F2 o vaya a la Barra de Herramientas en el menú Ver, busque Examinador de Objetos, se desplegará la siguiente pantalla: Por ejemplo, supongamos que deseamos verificar cuales son las diferentes constantes de los estilos que se pueden emplear al crear un Cuadro de Mensaje (MsgBox), podemos escribir la palabra MsgBox y el Examinador de objetos mostrará una serie de Clases que coinciden con la palabra buscada, entre ellas VbMsgBoxStyle, puede hacer clic en ella y ver en la lista inferior las constantes, tanto su modo abreviado como su equivalente numérico. También puede acceder a las explicaciones de los distintos eventos de los controles o formularios, para ello busque en la lista inferior izquierda el control al que desea encontrarle un evento, por ejemplo CommandButton, la lista inferior derecha mostrará sus distintas propiedades, métodos y eventos. Si ahora hace clic sobre uno de ellos, en la parte inferior se muestra la explicación de dicho elemento. 4. LOS CONTROLES: Los controles son una variedad de herramientas prediseñadas que pueden ser utilizados en una aplicación 6
según la finalidad de la misma. Por la particularidad de cada una puede emplearse en ciertas circunstancias para mostrar información, pedir información, enlistar miembros, desplegar imágenes o crear la ocasión para realizar cálculos, entre otras. Como ya dijimos, los controles están ubicados en el Cuadro de Herramientas (generalmente en la parte izquierda de la pantalla). Ya hemos interactuado un poco con los controles, pero en esta sección se explicarán cada uno de ellos por separado, utilizando en los programas algunas de sus propiedades, métodos y eventos. Los controles que aparecen siempre por defecto son: • Control Label: Etiqueta • Control TextBox: Cuadro de Texto • Control PictureBox: Cuadro de Imagen • Control Frame: Marco • Control CommandButton: Botón de Comando • Control CheckBox: Casilla de Chequeo • Control OptionButton; Botón de Opción • Control ListBox: Cuadro de Lista • Control ComboBox: Cuadro Combinado • Controles HScrollBar y VScrollBar: Barras de desplazamiento. • Control Timer: Control de tiempo (Reloj) • Control DriveListBox: Lista de Unidades de Discos • Control DirListBox: Lista de Directorios • Control FileListBox:: Lista de Archivos • Control Shape: Formas • Control Line: LÃ−nea • Control Image: Imagen • Control Data: Datos • Control OLE: Contenedor OLE Estos controles son llamados controles intrÃ−nsecos, ya que aparecen en todas las sesiones y no se pueden quitar del Cuadro de Herramientas. Pero además de éstos, existen otros controles que se pueden quitar o agregar y no aparecen por defecto, aparecen en una lista adicional. Para acceder a esta lista presione el botón secundario del mouse sobre el Cuadro de Herramientas, en la lista que se desplega presione clic sobre Componentes; también lo pude hacer Buscando en el Menú Proyecto Componentes o simplemente CONTROL+T. De esta lista se dará una explicación del control CommonDialog. Ahora, mediante el Examinador de Objetos, se recomienda dedicar un tiempo a estudiar las diferentes propiedades, los métodos y eventos de éstos distintos controles, aunque ya tenga algo de experiencia siempre nos podemos encontrar con algún elemento nuevo. Para ello, introduzca su nombre (Ejemplo: TextBox) y presione Buscar. ETIQUETAS: (LABEL) Las etiquetas se utilizan generalmente para dos fines:
7
• Escribir texto en el formulario, de modo que no esté disponible la opción de copiar y pegar. Con esto, por ejemplo, se pueden identificar nombres de variables para el usuario. (Ver Programa # 2). • Mostrar resultados de modo que no se tenga la opción de copiar y pegar. (Ver Programa # 2). Programa #2. Sumar: El siguiente programa agrega un valor a una suma. Diseñe el formulario con tres etiquetas (Label), un Cuadro de texto (TextBox) y un botón de comando (CommandButton). Establezca en las etiquetas las siguientes propiedades: • La primera (Label1) con Caption: &Valor = (Indica al usuario que en el Text1, agregará el valor a sumar). • La segunda con (Label2) con Caption: Resultado =, (Indica al usuario que el resultado se presenta a su lado) y, • En la tercera cambie el nombre (Name) a lblResultado y cambie la propiedad BorderStyle = (1 - Fixed Single), que parece un cuadro de texto con fondo gris. Luego, cambie el Caption del formulario a SUMA. En el cuadro de texto genere su propiedad Text a cadena vacÃ−a (borre Text1). En el botón de comando su Caption: &Sumar. Verifique que la propiedad TabIndex de la etiqueta que dice &Valor = sea un número menor que la propiedad TabIndex del Cuadro de Texto txtValor. El sÃ−mbolo (&) no aparecerá en el Caption y el efecto que produce es que subraya la letra que le sigue (en este caso la letra S) y crea un acceso directo (al presionar la combinación ALT+S se llamará al evento clic del comando o al presionar ALT+V tomará el enfoque el control Text1). Ahora reubique las posiciones de los controles en tiempo de diseño de modo que se visualicen de la siguiente manera: A continuación empecemos a codificar, para ello, haga clic en Ver Código en el Explorador de Proyectos. Escriba en la pantalla en blanco: Public Suma As Double Busque en la lista que dice (General) la palabra cmdSumar y cuando aparezcan las dos lÃ−neas para agregar código agregue las siguientes sentencias, de tal manera que aparezca: Private Sub Command1_Click() 8
Dim Valor As Double If Text1.Text = "" Then Valor = 0 Else Valor = CDbl(Text1.Text) End If Suma = Suma + Valor lblResultado.Caption = Suma Text1.Text = "" End Sub Ejecute la aplicación con F5, o en el menú Ejecutar. Verifique que el contenido de la suma no se puede copiar y pegar. También después de introducir un valor en el cuadro de texto, en vez de presionar clic sobre sumar, presione la combinación de teclas ALT+S, compruebe que se genera el mismo evento. Para que vuelva a tomar el enfoque Text1, presione la combinación Alt+V. Esto sucede ya que, como la etiqueta no puede tomar el enfoque pasa el enfoque a su TabIndex superior en uno, en este caso el cuadro de texto. La explicación de la codificación se encuentra en la Sección Explicación Detallada de Programas en los últimos capÃ−tulos. En este ejemplo se trabajaron con las propiedades de las etiquetas, Name (nombre), Caption (tÃ−tulo), BorderStyle (Estilo del Borde) y TabIndex (à ndice de Tabulación). Existen otras propiedades que también son muy utilizadas que son AutoSize (Ajustar horizontalmente al tamaño del Caption) y WordWrap (Ajustar verticalmente al tamaño del Caption). Para ver la explicación de otras propiedades, métodos o eventos puede dirigirse al Examinador de Objetos con la tecla F2. CUADROS DE TEXTOS: (TEXTBOX) Los Cuadros de texto son muy utilizados en las aplicaciones con VB, tiene mucha funcionalidad, pero generalmente son usados para: • Leer valores o cadenas de texto para trabajar con ellos. • Mostrar resultados tal como las etiquetas, pero en este caso facilita la posibilidad de copiar y pegar. Los Cuadros de texto son generalmente modificables en tiempo de ejecución, pero puede convertirlo a sólo lectura si establece su propiedad Locked a True (verdadero). En este caso sólo tendrá la posibilidad de copiar, pero no la de pegar
9
Como ya se ha trabajado la propiedad Text de los cuadros de Texto, se presenta ahora la explicación del método SetFocus y dos de los eventos que se pueden generar al trabajar con estos controles, los mismos son Change (que ocurre cuando cambia el control) y KeyPress (que ocurre que presiona una tecla cuando este control tiene el enfoque). Si quiere la explicación de otras propiedades, métodos o eventos dirÃ−jase al Examinador de Objetos. Programa #3. Ôrea de un triángulo: Con este programa se calcula el área de un triángulo, los datos pedidos son la Base y la Altura. Coloque tres etiquetas en un formulario: • La primera con propiedad Caption: &Base= • La segunda con propiedad Caption: &Altura= • La tercera con propiedad Caption: Resultado= Agregue también tres cuadros de textos: • El primero con propiedad Name: txtBase • El segundo con propiedad Name: txtAltura • El tercero con propiedad Name: txtResultado Coloque dos botones de comando: • El primero con propiedad Name: cmdCalcular, Caption: &Calcular y Enabled: False • El segundo con propiedad Name: cmdBorrar y Caption: B&orrar Cambie la propiedad Caption del formulario a AREA. Reubique los controles de tal manera que quede de la siguiente manera: TxtBase está ubicado al lado de la etiqueta Base =. TxtAltura al lado de la Etiqueta Altura = , y TxtResultado al lado de la Etiqueta Resultado =. Ahora, se puede empezar a codificar para realizar el programa, copie y pegue el siguiente código o escriba: Option Explicit Private Sub cmdBorrar_Click() txtBase = "" txtAltura = "" txtResultado = "" cmdCalcular.Enabled = False txtBase.SetFocus 10
End Sub Private Sub cmdCalcular_Click() Dim Base As Double, Altura As Double, Area As Double Base = Val(txtBase) Altura = Val(txtAltura) If IsNumeric(txtBase) And IsNumeric(txtAltura) Then Area = Base * Altura / 2 txtResultado = Area Else MsgBox "No se acepta texto. Verifique para continuar", vbOKOnly + vbExclamation, "Error" End If End Sub Private Sub txtBase_Change() If Len(txtBase) > 0 And Len(txtAltura) > 0 Then cmdCalcular.Enabled = True End If End Sub Private Sub txtBase_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then txtAltura.SetFocus End If End Sub Private Sub txtAltura_Change() If Len(txtBase) > 0 And Len(txtAltura) > 0 Then cmdCalcular.Enabled = True End If
11
End Sub Private Sub txtAltura_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then If cmdCalcular.Enabled = True Then cmdCalcular.SetFocus Else TxtBase.SetFocus End If End If End Sub Ejecute la aplicación con la tecla F5, y compruebe las nuevas opciones que se han generado en este programa, por ejemplo el reconocimiento de la tecla Enter (KeyAscii = 13) o activar el botón de comando cuando ya se han rellenado los cuadros de texto con valores. Para obtener una explicación detallada del programa puede ir a la Sección Detallada de Programas y buscar el programa #3. PICTUREBOX (CUADRO DE IMAGEN) Los controles PictureBox se pueden utilizar para mostrar imágenes y mediante sus métodos crear gráficos como lÃ−neas, cuadrados, rectángulos, cÃ−rculos o elipses; aunque con un poco de creatividad puede combinar varios de estos para realizar dibujos. Puede utilizarse también como contenedores de otros controles, esto es muy útil por ejemplo para realizar barras de herramientas o de estado. Otra opción que ofrece es la posibilidad de escribir sobre él mediante el método Print. Los formatos compatibles con este control son los archivos imágenes JPEG, formato de intercambio gráfico (GIF), mapa de bits (BMP), Ã−conos (ICO), cursores (CUR), metarchivo estándar de Windows (WMF) o mejorados (EMF). Puede mostrar una imagen en este control en tiempo de diseño mediante la propiedad Picture, para cambiarla en tiempo de ejecución puede utilizar la siguiente: Set Objeto.Picture = LoadPicture(Ruta) Donde Ruta es la ruta y el nombre de la imagen (Ejemplo: “C:\Windows\Aros.bmp”) Si desea quitar la imagen mostrada en el control se debe dejar en blanco los comandos de Ruta, quedando de la siguiente manera: Set Objeto.Picture = LoadPicture Una desventaja que tiene este control con respecto al control imagen, es que el tamaño de la imagen no se puede adaptar al tamaño del control, pero si el tamaño del control al tamaño de la imagen mediante la 12
propiedad AutoSize, si esta propiedad esta establecida como True (verdadera) el tamaño del control se adapta al tamaño de la imagen, si el tamaño de la imagen es muy grande debe tener cuidado de no opacar otros controles, si toma el valor False (Falso) no se cambia el tamaño del control ni de la imagen, si la imagen es más grande que el control ésta se recortará. Los Métodos Gráficos: Como se mencionó anteriormente, en el control PictureBox puede dibujar formas como puntos, lÃ−neas, cÃ−rculos, elipses, arcos, cuadrados o rectángulos, además que permite escribir sobre él. Estos métodos gráficos también son aplicables a los formularios. • Puntos: Se realizan mediante el método Pset: Objeto.Pset (X,Y), [color] Donde Objeto es el nombre del Cuadro de Imagen, de un formulario, o si se omite se hará referencia al formulario actual (activo). X, Y son las coordenadas donde se colocará el punto. Estos puntos tienen un tamaño de un pÃ−xel, siendo pequeños para la vista humana. • LÃ−neas: Se utiliza el método Line: Objeto.Line (X1,Y1)-(X2,Y2), [color] Donde X1 y Y1 son las coordenadas del punto inicial y X2 y Y2 las del punto final, el color es opcional. • CÃ−rculos: Se realizan mediante el método Circle: Objeto.Circle (X,Y), radio, [color] X, Y son las coordenadas del centro del cÃ−rculo, radio el tamaño del radio y el color es opcional. • Elipses: Se realizan mediante el método Circle: Objeto.Circle (X,Y), radio, [color], [inicio], [fin], aspecto Donde radio es la distancia más grande de la elipse, inicio y fin se colocan si se desea realizar sólo un arco, y aspecto es la relación o proporción de la distancia vertical con respecto a la horizontal, los valores mayores a uno dibujan elipses alargadas verticalmente, mientras que los valores entre cero y uno dibujan elipses alargadas horizontalmente. No se aceptan valores negativos. • Arcos: También se utiliza, por supuesto, el método gráfico Circle: Objeto.Circle (X.Y), radio, [color], inicio, fin, [aspecto] Donde inicio y fin son los ángulos de inicio y fin del arco en radianes y aspecto es opcional y se coloca si desea dibujar el arco de una elipse. • Cuadrados o Rectángulos: Se realizan mediante el método Line: Objeto.Line (X,Y)-Step(Ancho,Alto), [color], B Donde las coordenadas X, Y son las coordenadas de la esquina superior izquierda. Si desea rellenar el 13
cuadrado, debe cambiar la sentencia B por BF. • Escribir Texto: Se escribe texto mediante el método Print. Para establecer el lugar donde se colocará el texto se utilizan las instrucciones Objeto.CurrentX y Objeto.CurrentY. Objeto.CurrentX = CoordenadaX Objeto.CurrentY = CoordenadaY Objeto.Print "Escriba texto" Notas Importantes: Es importante resaltar que la coordenada Y se mide de arriba hacia abajo, tal como los formularios. Si en algún método gráfico desea omitir el color, inicio o fin deberá dejar el espacio en blanco entre las dos comas: Ejemplo: un cuadrado donde se omite el color: Objeto.Line (X,Y)-Step(Ancho,Alto), , B O una elipse completa: Objeto.Circle (X,Y), radio, color, , , aspecto Como se puede ver el color es opcional en todos los métodos gráficos y si se omite este presentará el color de la propiedad ForeColor cuyo valor predeterminado es negro. Programa #4. Dibujar en un PictureBox: El siguiente programa dibuja en un control PictureBox mediante los diferentes métodos gráficos explicados anteriormente: Para ello, agreguemos 7 botones de comando, y un control PictureBox. Cambie las propiedades de la siguiente manera: Todos los botones de comando tienen las propiedades: Left: 240 Width: 1935. Height: 375 Control
Propiedades Name: cmdMostrar
1er Botón de Comando
Caption: Mostrar &imagen
2do Botón de Comando
Top: 120 Name: cmdCuadrado
14
Caption: Dibujar c&uadrados Top: 600 Name: cmdLinea 3er Botón de Comando
Caption: Dibujar &lÃ−neas Top: 1080 Name: cmdPunto
4to Botón de Comando
Caption: Dibujar varios &Puntos Top: 1560 Name: cmdElipse
5to Botón de Comando
Caption: Dibujar &Elipse Top: 2040 Name: cmdCirculo
6to Botón de Comando
Caption: Dibujar &cÃ−rculos y arcos Top: 2520 Name: cmdTexto
7mo Botón de Comando
Caption: Escribir &texto Top: 3000 Name: cmdBorrar
8vo Botón de Comnado
Caption: &Borrar Top: 3480 Name: Monitor Height: 3735 Width: 4095
PictureBox Left: 2280 Top: 120 BackColor: Blanco Cambie la propiedad Caption del formulario para colocar un nombre al programa. Ahora, copie y pegue el siguiente código, o escriba: Option Explicit Private Sub cmdMostrar_Click() 15
Set Monitor.Picture = LoadPicture("C:\Windows\Aros.bmp") End Sub Private Sub cmdCuadrado_Click() Monitor.FillStyle=1 Monitor.Line (200, 400)-Step(700, 300), , B Monitor.Line (1000, 2000)-Step(1000, 1000), vbYellow, BF Monitor.Line (1000, 2000)-Step(1000, 1000), vbBlack, B End Sub Private Sub cmdLinea_Click() Monitor.Line (200, 400)-(900, 700), vbBlack Monitor.Line (2500, 500)-(1000, 2500), vbGreen End Sub Private Sub cmdPunto_Click() Dim X As Integer, Y As Double Monitor.PSet (200, 400), vbRed Monitor.PSet (600, 500), vbBlue Monitor.PSet (700, 800), vbGreen For X = 1 To Monitor.Width Y = 3 * X ^ (0.75) + 500 Monitor.PSet (X, Monitor.Height - Y), RGB(50, 200, 211) Next X End Sub Private Sub cmdElipse_Click() Monitor.FillStyle = 0 Monitor.FillColor = vbRed Monitor.Circle (1200, 1200), 500, vbBlue, , , 2 / 3
16
End Sub Private Sub cmdCirculo_Click() Const Pi = 3.1415927 Monitor.FillStyle=1 Monitor.Circle (3000, 800), 300, vbRed Monitor.Circle (2500, 2500), 700, vbBlack, Pi / 2, Pi End Sub Private Sub cmdTexto_Click() Monitor.CurrentX = 2500 Monitor.CurrentY = 3000 Monitor.ForeColor = vbBlue Monitor.Print "Muestra de texto" End Sub Private Sub cmdBorrar_Click() Set Monitor.Picture = LoadPicture End Sub Ejecute e interactúe con el programa. La explicación del programa se encuentra en la Sección Detallada de Programas. MARCOS (FRAME): Los Marcos actúan como agrupadores y contenedores de otros controles. Por ejemplo se puede utilizar para agrupar botones de opción para que el usuario elija una de las opciones presentadas o casillas de verificación para elegir varias opciones. Puede colocar cualquier control sobre él y al colocarlo el control hará referencia con sus propiedades top y left al marco y no al formulario. (La explicación de los botones de opción puede encontrarla más adelante durante la descripción de los controles) Programa #5. ¿Dónde estudiar? En este programa se utilizarán dos controles marcos (Frame) para agrupar botones de opción. Para ello se deben seguir los siguientes pasos:
17
• Dibujar una etiqueta en la parte superior del formulario, con las siguientes propiedades Caption: (Borre su contenido) Height: 375 Width: 4575 Left: 120 Top: 120 BorderStyle: 1 - Fixed Single • Dibujar ahora un control Frame (marco) con las siguientes propiedades: Caption: Carrera Height: 1575 Width: 2055 Left: 120 Top: 600 • Colocar un botón de opción dentro del marco. Colocando el nombre optCarrera y Caption igual a IngenierÃ−a. • Se va a crear una matriz de controles, para ello, se debe copiar el botón de opción y al pegar se desplegará un mensaje de diálogo que preguntará. ¿Desea crear una matriz de controles? Responda Si. Se pegará un control cuyo Caption se debe cambiar a Arquitectura. Después corte este control, seleccione el marco (haga clic sobre él) y pegue el control. Esto se hace para asegurar que el control quede dentro del marco seleccionado. Luego, colóquelo debajo del anterior botón de opción. Después, se debe pegar otro control (botón de opción) como matriz de control cuyo Caption va a cambiar a Letras. • Ahora se colocará otro control Frame (marco), se dibujará este control sobre el formulario asignando las siguientes propiedades: Caption: Institución Height: 1575 Width: 2415 Left: 2280 Top: 600 • Se van a colocar también tres botones de opción, el nombre para el primero es (no su Caption, sino su propiedad Name) es optInstitucion, cree la matriz de controles y colóquelos dentro de este marco, sus caption respectivos son: Universidad Nacional, Universidad Estatal y universidad Municipal. 18
• Se asigna a la propiedad TabIndex del botón de opción que dice Universidad Nacional el valor cero (0). • Coloque debajo de los marcos un botón de comando con Caption igual a &Salir. • Ahora le toca el paso a la codificación: Copie y pegue el siguiente código o escriba: Public strCarrera As String, strInstitucion As String Private Sub optCarrera_Click(Index As Integer) strCarrera = optCarrera(Index).Caption Call Display End Sub Private Sub optInstitucion_Click(Index As Integer) strInstitucion = optInstitucion(Index).Caption Call Display End Sub Private Sub Display() Label1.Caption = "Ha decidido estudiar " & strCarrera & _ " en la " & strInstitucion End Sub Private Sub Command1_Click() Unload Me End Sub BOTONES DE COMANDO (COMMANDBUTTON): Ya se ha trabajado un poco con ellos, su finalidad es de generar acciones cuando se hace clic sobre ellos, pueden tomar el enfoque con el método SetFocus y el evento principal es el evento clic. Otra propiedad que se puede mencionar es Default. à sta sólo puede tomar el valor verdadero o falso y determina qué control CommandButton es el botón de comando predeterminado en un formulario. Sólo un botón de comando de un formulario puede tener esta propiedad como verdadera. AsÃ−, si cualquier control del formulario tiene el enfoque al presionar la tecla Enter llama al evento clic del nombre del control. Por ahora, no realizaremos programas para aplicar esta propiedad. CASILLAS DE VERIFICACIà N (CHECKBOX): 19
Las Casillas de Verificación funcionan también como botones de opción, pero en este caso se puede seleccionar cualquier número de casillas, se puede seleccionar ninguna, una o más de una opción. La propiedad más importante de este control es Value, que puede tomar tres valores: • Desactivada: En este caso la propiedad Value toma el Valor 0 o también vbUnchecked. • Activada: La propiedad Value toma el valor 1 o vbChecked. • No Disponible: La propiedad Value toma el valor 2 o vbGrayed. Este caso se utiliza si desea deshabilitar el control. Si el control está habilitado, éste responde al evento clic cambiando su propiedad value a activado o desactivado, según sea el caso, si se presiona doble clic el control reconoce cada clic por separado quedando en el mismo estado. Puede crear un acceso directo si antepone el signo & a la letra en la propiedad Caption, asÃ− al presionar la combinación Alt+Letra se llevará a cabo el evento clic. Si no desea que la casilla muestre un texto en su propiedad Caption sino que muestre una figura, puede utilizar la propiedad Picture y Style para asignar la imagen a el control. Programa #6. Contrato: Este programa tiene la finalidad de utilizar el control CheckBox, se debe crear un proyecto nuevo y en el formulario colocar tres controles CheckBox, con los siguientes Captions: • &Entre 20 y 30 años • &Tiene experiencia en el área • &Bilingüe Ahora, para continuar se colocará un botón de comando debajo de las casillas de verificación, con Caption: &Contratar?. Para finalizar se agrega debajo del botón de comando una etiqueta con las siguientes propiedades: • Caption: (Sin contenido) • Font: Tamaño:12 - Negrita • Autosize=True (verdadero) • Alignment: 2 - center Si se quiere puede cambiar el caption del formulario a Requisitos A continuación se debe agregar el siguiente código en la pantalla del formulario: Private Sub Command1_Click() If Check1 = vbChecked And Check2 = 1 And Check3 = 1 Then Label1.Caption = "Si contratar" Else Label1.Caption = "No contratar" 20
End If End Sub Al ejecutar el programa se verifica que si el aspirante cumple con los tres requisitos debe ser contratado y no aquellos que sólo cumplen menos. BOTONES DE OPCIà N (OPTIONBUTTON): Tienen la finalidad de presentar un conjunto de opciones al usuario con el propósito que sólo pueda elegir una. Los grupos de botones deben estar agrupados, para ello, deben estar colocado en el mismo control o formulario, es decir, los botones de opción que se encuentran directamente encima del formulario se agruparán y sólo se podrÃ−a elegir una de ellas, aquellas que se encuentran dentro de un marco (Frame) se separarán de las primeras y de éstas se podrÃ−a escoger otra opción, asimismo aquellas que están dentro de un PictureBox. Si durante una prueba se observa que se pudo escoger más de una opción es porque el botón de opción no quedó agrupado sino que quedó fuera del área del grupo y por lo tanto debe, mediante el diseño, reubicarlo. Para asegurar que el control quede dentro del área del grupo se debe: • Dibujar el botón de opción en cualquier lugar. • Corte el botón de opción. • Seleccionar (mediante un clic) el control o el formulario donde se desea colocar. • Pegar el botón de opción. • Ubicarlo en la posición que se desea. Se puede crear un acceso directo si antepone el signo & a la letra en la propiedad Caption, asÃ− al presionar la combinación Alt+Letra se llevará a cabo el evento clic, es decir, la selección. El programa que ejemplifica este control es el Programa #5. CONTROL LISTBOX (CUADRO DE LISTA): Los cuadros de lista es un control que tiene la finalidad de presentar una lista de elementos al usuario de tal manera que éste escoja una o varias opciones, o puede también utilizarse para enlistar elementos en tiempo de ejecución. Los elementos pueden colocarse en la lista en tiempo de diseño o en tiempo de ejecución. Para agregarlos en tiempo de diseño, se debe rellenar la propiedad List (en la ventana Propiedades) con los elementos que se deseen, en este caso, cada vez que se coloque un elemento se presiona la combinación de teclas Control+Enter para pasar a la siguiente lÃ−nea, al siguiente elemento. Para agregarlos en tiempo de ejecución se utiliza la instrucción Additem, de la siguiente manera: Lista.Additem "Elemento" [, Ã−ndice] Donde Lista es el nombre de la lista, Elemento es una cadena de caracteres de texto o número que se va a agregar a la lista y el Ã−ndice es opcional y ofrece la opción de ubicar el elemento en algún lugar especificado de la lista. La lista enumera los elementos desde el número 0 (primer elemento) hasta el último 21
que tendrÃ−a como valor de Ã−ndice el número de elementos menos uno. Si en la instrucción Additem no se incluye el Ã−ndice, la lista colocará el elemento al final de la lista, de manera que si se desea colocar primero se escribirá el siguiente código: Lista.Additem Elemento, 0 Al colocar el elemento en esta posición, los otros elementos se reindexarán y pasarán a ocupar una nueva posición, el primero pasa a ser el segundo (1), el segundo pasa a tercero (2) y asÃ− sucesivamente. Si se agregan en una posición inválida que sobrepase la numeración de los elementos se producirá un error. Si desea agregar una lista de elementos a la lista de un formulario en tiempo de ejecución, de tal manera que el usuario escoga una o varias, puede agregarlo mediante el método Additem en el evento Load del formulario, es decir Private Sub Form_Load(), de manera que los elementos aparecerán cargados en la lista a la hora de cargar el formulario. Para eliminar un elemento de la lista en tiempo de ejecución se utiliza la instrucción RemoveItem, de la siguiente manera: Lista.RemoveItem Ã−ndice Sólo se pueden eliminar elementos mediante su número de Ã−ndice, para obtener el número de Ã−ndice de un elemento seleccionado se utiliza la propiedad Lista.ListIndex, de tal manera que para eliminar un elemento seleccionado se debe escribir: If Lista.ListIndex>=0 Then Lista.RemoveItem Lista.ListIndex End if Si no existe un elemento seleccionado la propiedad ListIndex toma el valor -1, por lo tanto se le antecede la sentencia IF asegurando que haya seleccionado un elemento. Si no se coloca esta sentencia y no hay elementos seleccionados en la lista el programa genera un error. La instrucción para obtener el número de elementos de una lista es ListCount, de forma que el Ã−ndice del último elemento es ListCount - 1. Otra propiedad que se utiliza con este control es List. Esta propiedad, guarda cada elemento de la lista en una matriz, de modo que para obtener un elemento en particular utilice la codificación: Lista.List(Ã−ndice) Por ejemplo, la secuencia Lista.List(1) devuelve el segundo elemento mostrado en la lista. La manera para quitar todos los elementos de una lista es el método Clear: Lista.Clear Programa #7. Coordenadas: Este programa utiliza una lista para ordenar puntos de coordenadas X, Y. Grafica estos puntos en un PictureBox. 22
Para este fin, se deben colocar una lista, dos etiquetas, dos cuadros de texto, un cuadro de imagen y tres botones de comando. A continuación, se muestran las propiedades Name que deben tener estos controles: Control Name Cuadro de texto 1 txtX Cuadro de texto 2 txtY Lista 1 lstPuntos Botón de Comando 1 cmdIngresar Botón de Comando 2 cmdEliminar Botón de Comando 3 cmdBorrar Cuadro de Imagen 1 Monitor Las propiedades Height y Width del Monitor son 2175 cada una. Se deben ubicar los controles de tal manera que se observen de la siguiente manera: Copie y pegue el siguiente código o escriba: Option Explicit Private Sub txtX_Change() cmdIngresar.Enabled = (Len(txtX) > 0 And Len(txtY) > 0) End Sub Private Sub txtX_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then txtY.SetFocus End If End Sub Private Sub txtY_Change() cmdIngresar.Enabled = (Len(txtX) > 0 And Len(txtY) > 0) End Sub Private Sub txtY_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then If cmdIngresar.Enabled = True Then cmdIngresar.SetFocus
23
Else txtX.SetFocus End If End If End Sub Private Sub cmdIngresar_Click() Dim X As Integer, Y As Integer X = CInt(txtX) Y = CInt(txtY) Monitor.Circle (X, Y), 30, vbRed lstPuntos.AddItem "(" & X & "," & Y & ")" txtX = "" txtY = "" txtX.SetFocus End Sub Private Sub cmdEliminar_Click() If lstPuntos.ListIndex >= 0 Then lstPuntos.RemoveItem lstPuntos.ListIndex End If End Sub Private Sub cmdBorrar_Click() lstPuntos.Clear Monitor.Refresh End Sub Se puede interactuar un poco con el programa para relacionarse con los comandos y funciones de cada botón de comando, lista y control PictureBox. Es importante resaltar que, en este caso, aunque se elimine de la lista las coordenadas de un punto, no se borra 24
éste del cuadro de imagen. Esto se hace debido a que todavÃ−a no se tienen las herramientas necesarias para generar dichos procedimientos, esto es sólo un ejemplo de cómo se utiliza el control ListBox y por lo tanto se dejaron a un lado estas posibilidades. Para obtener más detalles sobre este programa dirigirse a la Sección Detallada de Programas al final de este tomo. Puede ver también el ejemplo del control ComboBox para ver otra utilidad de los cuadros de lista. Guarde este programa ya que lo utilizará mas adelante cuando se introduzca en el tema del trabajo con ficheros. CONTROL COMBOBOX (CUADRO COMBINADO): Este control combina las posibilidades de una lista con un cuadro de texto, de manera que presenta la posibilidad de elegir de una lista un elemento de interés, pero además, puede obviar cualquier opción y escribir sobre el control mediante la propiedad text. Por lo tanto, posee además de las propiedades, métodos y eventos de la lista, también los de los cuadros de texto. Programa #8. Número de Mes: A continuación la elaboración de un programa para observar una de las utilidades del control ComboBox: Para ello se debe agregar al formulario: • Una etiqueta de Caption: Mes Nro: • A su lado un cuadro de texto de nombre Text1 (no cambiar) • Un botón de comando de nombre Command1 (no cambiar) y Caption: Escribir Mes • Un control ComboBox (Cuadro combinado) de nombre Combo1 (no cambiar). Se debe agregar al formulario el siguiente código: Private Sub Form_Load() Combo1.AddItem "Enero" Combo1.AddItem "Febrero" Combo1.AddItem "Marzo" Combo1.AddItem "Abril" Combo1.AddItem "Mayo" Combo1.AddItem "Junio" Combo1.AddItem "Julio" Combo1.AddItem "Agosto" Combo1.AddItem "Septiembre"
25
Combo1.AddItem "Octubre" Combo1.AddItem "Noviembre" Combo1.AddItem "Diciembre" End Sub Private Sub Command1_Click() Dim Mes As Byte Select Case Combo1.Text Case "Enero": Mes = 1 Case "Febrero": Mes = 2 Case "Marzo": Mes = 3 Case "Abril": Mes = 4 Case "Mayo": Mes = 5 Case "Junio": Mes = 6 Case "Julio": Mes = 7 Case "Agosto": Mes = 8 Case "Septiembre": Mes = 9 Case "Octubre": Mes = 10 Case "Noviembre": Mes = 11 Case "Diciembre": Mes = 12 Case Else MsgBox "Error en el mes. Corrija para continuar" End Select Text1 = Mes End Sub Al ejecutar la aplicación, se debe seleccionar un mes y presionar el botón de comando, se desplegará en el cuadro de texto en número de mes correspondiente. Para obtener los detalles de la programación se puede dirigir a la Sección Detallada de Programas.
26
Es muy importante resaltar que los cuadros de lista y el cuadro combinado tienen funciones similares, sin embargo pueden tener distintas funciones según el programa. En el caso del ejemplo del cuadro de lista se utilizó para enlistar un conjunto de puntos que se iban dibujando en el cuadro de imagen, además los elementos (puntos) se encerraban en paréntesis y se separaban las variables por comas. En el caso del ejemplo del cuadro combinado se utilizó para desplegar una lista en el cual el usuario podÃ−a elegir una opción; en este ejemplo también se pudo utilizar un cuadro de lista sin embargo se quiso que ambos ejemplos sirvieran para ambos casos de manera que el lector pueda asociar las distintas funciones que pueden tener estos controles a la hora de programar. CONTROLES HSCROLLBAR Y VSCROLLBAR: BARRAS DE DESPLAZAMIENTO. Las barras de desplazamiento se utilizan en las aplicaciones para desplazarse horizontal o verticalmente cuando halla una cantidad grande de información o cuando los controles toman gran tamaño. Estas tienen la misma finalidad de aquellas que aparecen en los cuadros de texto cuando el contenido de su propiedad text sobrepasa el ancho y/o el alto del mismo o también las que aparecen en un cuadro de lista o combinado cuando el número de elementos es mayor al tamaño designado para la muestra de ellos. Esta tiene la finalidad de mostrar elementos también contenidos en el control que no se pueden ver inmediatamente por el reducido tamaño del mismo. Aunque tienen la misma finalidad este control no son iguales ya que las primeras aparecen por defecto y en este caso se promueve mediante los métodos del control. Programa #9. Mirar el contenido de una etiqueta: El siguiente programa sugiere mediante la utilización de la barra de desplazamiento ver el contenido de una etiqueta cuyo interior no se podÃ−a observar completamente por el reducido tamaño de la etiqueta. Para ello se deben colocar los controles de la izquierda con las propiedades de la derecha: Control
Propiedades Nombre: Text1 (no cambiar) Height: 285
• Cuadro de texto (TextBox)
Width: 1575 Left: 0 Top: 0 Nombre: Picture1 (no cambiar) BorderStyle: 1 - Fixed Single Height: 495
• Cuadro de Imagen (PictureBox)
Width: 1575 Left: 0 Top: 360 Nombre: Command1 (no cambiar) 27
• Botón de Comando (CommandButton)
Caption: Asignar Height: 285 Width: 975 Left: 1680 Top: 0 Nombre: HScroll1 (no cambiar) Height: 255 Width: 1575
• Barra de desplazamiento Horizontal (HScrollBar)
Left: 0 Top: 960 Visible: False Nombre: Label1 (no cambiar)
• Etiqueta (Label)
AutoSize: True (verdadero)
Nota: la etiqueta estará insertada dentro del control BorderStyle: 0 - None cuadro de imagen. Para ello córtela de donde esté, seleccione el cuadro de imagen con un clic y pegue la Caption: (Borrar contenido) etiqueta. Height: 195 Ahora, se procederá a colocar el siguiente código dentro la ventana de código del formulario: Option Explicit Private Sub Command1_Click() Form1.ScaleMode = vbCharacters Picture1.ScaleMode = vbCharacters Label1.Move 0, 0 Label1.Caption = Text1 HScroll1.Max = Label1.Width - Picture1.Width + 1 HScroll1.Visible = (Picture1.Width < Label1.Width) End Sub Private Sub HScroll1_Change() Label1.Left = -HScroll1.Value 28
End Sub Ejecute el programa y coloque en el cuadro de texto una cadena de números o textos más grande que el tamaño del cuadro de imagen, luego haga clic en el botón de comando, aparecerá la barra de desplazamiento horizontal permitiendo desplazarse para ver el contenido completo de la etiqueta. Si coloca un número de menos caracteres no aparecerá la barra. Para obtener la explicación del programa detalladamente, se puede dirigir a la Sección Detallada de Programas. Puede utilizar la barra de desplazamiento también para observar completamente una imagen contenida dentro de un control cuadro de imagen. Esto es muy útil ya que el cuadro de imagen no muestra la imagen completa si su tamaño es menor. Se puede entonces colocar un Picture2 dentro de un Picture1 y seguir la secuencia semejante a como se hizo con la etiqueta, colocando además una barra de desplazamiento vertical. CONTROL TIMER (CONTROL DE TIEMPO - RELOJ) Este control es muy útil para crear aplicaciones donde necesite llevar un control de tiempo, ya sea que utilice el reloj del computador como contador o rector de las actividades del computador, o cree un nuevo contador de segundos, horas y minutos que comience desde cero, como es el caso del ejemplo que se muestra más delante de esta sección. El control Timer tiene dos propiedades principales, ellas son Enabled e Interval. La propiedad Enabled comienza el funcionamiento del control de tiempo y la propiedad Interval que genera un evento Timer cada vez que se cumple el valor que contiene (en milisegundos), es decir, si la propiedad Interval tiene el valor 1000 (1000 milisegundos = 1 segundo) se llama al evento Timer cada segundo. Programa #10. Cyber: El siguiente programa da un ejemplo de un contador de un cyber. Muestra la hora del computador, un contador de tiempo de uso y el precio por el tiempo de uso. Para la realización de este programa se deben agregar 6 etiquetas. Las tres primeras (de nombres Label1, Label2 y Label3) se colocan en la parte inferior del formulario y sirven para mostrar las variables del uso del computador, por ello fue borrado el contenido de la propiedad Caption de cada una. Las demás tienen propiedades: Label4 Caption: Hora Label5 Caption: Tiempo de uso Label6 Caption: Precio Se agregó además, por supuesto, el control Timer. Es muy importante resaltar que este control no es visible en tiempo de ejecución. Y por ello no tiene propiedades de tamaño, ni opciones de borde, color de fondo, y otras similares; ya que no son relevantes. Al control Timer se le asignaron las propiedades Interval=1000 y Enabled = True Luego se colocaron los controles de la siguiente manera: La ubicación del control Timer tampoco es relevante. Luego se procede a agregar a la ventana de código del programa las siguientes sentencias: 29
Option Explicit Private Sub Timer1_Timer() Static Segundos As Byte, Minutos As Byte, _ Horas As Integer, Precio As Double, Contador As Long Contador = Contador + 1 Label1 = Time If Segundos < 59 Then Segundos = Segundos + 1 Else Segundos = 0 If Minutos < 59 Then Minutos = Minutos + 1 Else Minutos = 0 Horas = Horas + 1 End If End If Label2 = Format(Horas, "##00") + ":" + _ Format(Minutos, "##00") + ":" + Format(Segundos, "##00") Precio = CDbl(Contador * 1200 / 3600) If Precio < 100 Then Precio = 100 End If Label3 = Format(Precio, "##,##00.00") End Sub Puede ejecutar el programa para observar su funcionalidad. Para obtener una explicación detallada del programa dirÃ−jase a la Sección Detallada de Programas. 30
CONTROLES • CONTROL DRIVELISTBOX: LISTA DE UNIDADES DE DISCOS • CONTROL DIRLISTBOX: LISTA DE DIRECTORIOS • CONTROL FILELISTBOX:: LISTA DE ARCHIVOS Estos controles se agruparon en uno ya que tienen finalidades semejantes. El caso de las listas de unidades de disco, muestran un cuadro combinado con las unidades de disco presentes en su computador. La propiedad más importante de este control es la propiedad Drive que devuelve o establece la unidad seleccionada en tiempo de ejecución. Las listas de directorios muestran las distintas carpetas de directorio que están grabadas dentro del computador. la propiedad más importante de ésta es la propiedad Path que devuelve o establece la ruta de acceso actual. La listas de archivos muestran la lista de archivos de un directorio seleccionado. También tiene la propiedad Path con las misma función que las listas de directorio, a diferencia que éste muestra la lista de archivos y no la de directorio. También contiene la propiedad Patern que muestra sólo la extensión de algún tipo de archivo. Es útil por ejemplo, si quiere mostrar sólo archivos de extensión *.exe, *.doc, u otro. Programa #11. Directorio: El siguiente programa combina los tres tipos de cuadros visto anteriormente: DriveListBox, DirListBox y FileListBox para mostrar los documentos de word (*.doc) de una carpeta. Para ello, se debe agregar a un formulario una lista de unidades, una de directorio y una de archivos: Luego, se debe copiar y pegar, o escribir: Private Sub Form_Load() Dir1_Change End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Pattern = "*.doc" File1.Path = Dir1.Path End Sub Ejecute el programa y ubique las diferentes unidades de disco, directorio y verifique que la lista de archivos corresponde a los archivos de word (*.doc) de la carpeta, es recomendado buscar la carpeta Mis Documentos. 31
La explicación detallada de la codificación la puede encontrar en la Sección Detallada de Programas. CONTROL SHAPE: FORMAS El control Shape permite crear figuras sin necesidad de escribir código, tiene varias propiedades que se explicarán a continuación: Propiedad Shape: Es la más común y permite dibujar distintos tipos de figura sin escribir código, por ejemplo: agregue un control Shape a un formulario y cambie la propiedad Shape (en la Ventana de Propiedades del Control) presionando doble clic o eligiendo de la lista, la forma va cambiando según vaya cambiando su propiedad Shape, se pueden crear las siguientes figuras: Figura Nro de 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 constantes se utilizan para cambiar la forma del control en tiempo de ejecución, o se puede colocar su forma abreviada mediante su número correspondiente. Propiedad FillStyle: Se refiere al estilo del relleno del control. Si se encuentra en la forma Transparente = 1, la propiedad FillColor queda deshabilitada, de tal manera que no habrá color de relleno. Los distintos estilo de la propiedades FillStyle pueden obtenerse en el Examinador de Objetos introduciendo la palabra FillStyleConstants. Para cambiar el grosor del borde utilice la propiedad BorderWidth, el grosor predeterminado es uno, de tal manera que los números mayores a uno serán mas gruesos que la predeterminada. No se aceptan valores menores a uno, ni valores decimales. Para cambiar el color del borde elija el tipo de borde con la propiedad BorderStyle y cambie la propiedad BorderColor y DrawMode al de su preferencia. Los estilos de borde también se pueden obtener en el Examinador de objeto introduciendo la palabra BorderStyleConstants. No se procedió a realizar un programa con este control ya que su funcionalidad y aplicación es muy fácil verla sólo con la explicación. CONTROL LINE: Là NEA Este control sólo tiene una finalidad decorativa de los formularios o puede agregarlas dentro de otro control como cuadro de imagen (PictureBox), marcos (Frame) u otros Puede agregar lÃ−neas y cambiar su grosor, estilo, color, puede ubicarla según las coordenadas y hacerlas visibles o invisibles.
32
Tampoco se procedió a realizar un programa con este control ya que su funcionalidad y aplicación es muy fácil verla sólo con la explicación. CONTROL IMAGE: IMAGEN Este control también se utiliza para mostrar imágenes, acepta los mismos formatos que los cuadros de imagen (PictureBox). La diferencia principal radica en que este control puede reducir el tamaño de la imagen para adaptarlo al tamaño del control, lo que no sucede con el control PictoreBox. Para ello; ya sea en tiempo de diseño o de ejecución, establezca la propiedad Stretch a True (verdadero) antes de cargar la imagen. Para cargar la imagen en tiempo de diseño utilice la propiedad Picture y en tiempo de ejecución utilice la secuencia: Set Imagen.Picture=LoadPicture(Ruta) Donde, imagen es el nombre del control y Ruta es una cadena de texto con la ruta a la imagen que desea mostrar. Si la imagen es pequeña y la propiedad Stretch es True (verdadera), la imagen pierde calidad al adaptarse al tamaño del control. Si la propiedad Stretch esta establecida a False (Falso) el control cambia de tamaño adaptándose al tamaño de la imagen. CONTROL DATA: DATOS Este control se utiliza para visualizar datos que se encuentran dentro de una base de datos. Ofrece acceso a varios tipos de bases de datos como Excel, Access, FoxPro, dBASE o incluso Lotus 1-2-3. Al agregarlo a un formulario puede tener acceso a la base de datos incluso sin escribir código. Para utilizar este control mediante un ejemplo se deben seguir los siguientes pasos: • Cree un archivo de Excel, rellene las casillas de la siguiente manera, o rellene las casillas como una base de datos Excel con los datos que prefiera (esto es sólo una opción): • Guarde el Archivo, con un nombre y en una carpeta que pueda recordar. • Cree un nuevo proyecto de Visual Basic. • Agregue un control Data en la parte inferior del formulario. • Active la Ventana de Propiedades del control; para ello, presione un clic sobre el control Data y luego presione la tecla F4. • En la ventana Propiedades, establezca la propiedad Connect a Excel 5.0 si tiene Office 97 o a Excel 8.0 si tiene Office 2000. • En esta misma ventana de propiedades, introduzca en la propiedad DatabaseName el nombre de archivo y la ruta mediante el directorio. • En propiedades también, haga referencia en la propiedad RecordSource a Hoja1. • Agregue un cuadro de texto (TextBox) al formulario. Borre el contenido de su propiedad Text. • En la propiedad DataSource del cuadro de texto haga referencia al control Data1. • Por último, en la propiedad DataField enlace al campo que desea mostrar en el cuadro de texto. • Puede agregar otros cuadros de texto y repetir los pasos 9 a 11, cambiando la propiedad DataField en cada uno para mostrar otros datos de la tabla. • Ejecute el programa y presione los diferentes botones del control Data1 para desplazarse en la base de datos. 33
En el ejemplo anterior sólo se utilizan controles TextBox para mostrar el contenido de la base de datos. Sin embargo no es el único control que sirve para visualizar una base de datos, de hecho existen otros controles cuya función principal es mostrar el contenido de una base de datos en compañÃ−a de un control Data de un formulario. Estos controles son DBGrid, DbList y DBCombo. Estos controles se pueden agregar al cuadro de herramientas, si desplega el cuadro de Componentes y elige de la lista Microsoft Dat Bound Grid Control 5.0 (para DBGrid) o Miscrosoft Data Bound List Controls 6.0 (Para DBList y DBCombo). Nota: La lista de componentes se desplega haciendo clic con el botón secundario del mouse sobre el cuadro de Herramientas, Ir a la barra de Menú a la opción Proyecto, luego Componentes, o simplemente presionando la combinación de teclas Control+T. Cuando se va a utilizar algunos de estos controles, se debe primero colocar el control Data que hara referecia a la base de datos en sus propiedades en la secuencia: Connect (que define el tipo de base de datos), DataBaseName (El nombre de la base de datos en el disco duro) y RecordSource (La tabla de la base de datos). Se puede rellenar una lista (Controles DBList o DBCombo) con todos los elementos de una columna de una base de datos, por ejemplo todos los nombres de los clientes de una base de datos, todos sus ID o cualquier otra columna. Para enlistarlos se deben rellenar las propiedades de estos controles (DBList y DBCombo) RowSource y ListField, en ese orden. Con el control DBGrid puede visualizar todo el contenido de una tabla de una base de datos si conecta mediante la propiedad DataSource. Para agregar elementos en una base de datos mediante este control en tiempo de ejecución establezca la propiedad AllowAddNew a True (Verdadero), se agregará una fila al final de la tabla donde puede escribir. Si desea eliminar registros establezca la propiedad AllowDelete a True (Verdadero). Puede ver otras propiedades, métodos y eventos de este control si escribe DBGrid en el Examinador de objetos. CONTROL OLE: CONTENEDOR OLE El control contenedor OLE, se utiliza para insertar aplicaciones de documentos. Cuando inserta un control OLE al formulario se desplega la siguiente pantalla: De tal manera que se puede crear y agregar un archivo nuevo eligiendo de esta lista el tipo de archivo con la opción “Crear nuevo” o puede insertar un archivo ya creado mediante la opción “Crear desde un archivo”. Inserte algunos tipos de archivos nuevos y ya creados desde el contenedor OLE e interactúe, es muy fácil obtener resultados con este control directamente. CONTROL MICROSOFT COMMON DIALOG 6.0: Este control no aparece por defecto en el cuadro de Herramientas, es decir no es un control intrÃ−nseco y debe agregarse mediante la Opción Componentes... que aparece en la Barra de menú Proyecto Componentes..., al hacer clic con el botón secundario del mouse sobre el cuadro de herramientas o simplemente presionando la combinación de teclas (Control + T). Este control, mediante sus propiedades y métodos, permite mostrar los cuadros de diálogos comunes que se utilizan en las aplicaciones de Windows. Algunos de estos cuadros de diálogo son: Abrir, Guardar como, imprimir y otros que se explicarán más detalladamente adelante en esta sección. Los métodos de este control son: Método
Cuadro de diálogo que muestra 34
• ShowColor • ShowFont • ShowHelp • ShowOpen • ShowPrinter
Cuadro de diálogo para cambiar Colores Cuadro de diálogo para cambiar Fuente Cuadro de diálogo de Ayuda, mediante el sistema de ayuda de Windows Cuadro de diálogo para Abrir un Archivo Cuadro de diálogo para Imprimir
Cuadro de diálogo para Guardar archivo. • ShowSave Estos métodos deben combinarse con algunas de sus propiedades para poder almacenar datos, abrir documentos o realizar completamente la acción que se desea. Es decir, no basta mostrar el cuadro de diálogo abrir para abrir un archivo, hace falta algunas propiedades que nos distingan. Este control en tiempo de ejecución no es visible, solo puede ver su aplicación en la aparición de los cuadros de diálogos, en tiempo de diseño este control tiene un tamaño que no se puede variar. Las propiedades de este control se encuentran “divididas” según el método, por ejemplo, la propiedad Filter (que devuelve o establece los filtros que se mostrarán en el cuadro de lista Archivos de tipo de un cuadro de diálogo) sólo pueden ser utilizados por los métodos Abrir (ShowOpen) y Guardar (ShowSave) ya que son los únicos cuadros de diálogos que necesitan especificar un tipo de archivo. De esta manera, se muestran a continuación las diferentes propiedades del control CommonDialog según los métodos mostrados anteriormente: Propiedades de los métodos del Control Cuadros de Diálogos Comunes: Métodos ShowOpen y ShowSave: Propiedad Filter: Cuando se muestra el cuadro de diálogo abrir o guardar, en la parte inferior del cuadro de diálogo aparece una etiqueta que escribe: (Archivos de tipo:). Al su lado aparece un cuadro combinado que muestra una cierta cantidad de tipos de archivos, si no aparece ningún tipo es porque todavÃ−a no ha establecido la propiedad Filter. La propiedad Filter es la propiedad que establece el o los tipos de archivos que se pueden abrir, o el tipo de archivos que se va a guardar. Para cambiar la propiedad Filter de un control cuadro de diálogo se utiliza la siguiente sentencia: NombreCDialog.Filter="DecripciónTipo1|tipo1|DescripciónTipo2|tipo2" Hasta completar todos los tipos de archivo posibles que pueden ser usados por la aplicación. Por ejemplo: En un formulario agregue un botón de comando (Command1) y un Control Common Dialog, siguiendo los siguientes pasos: • DirÃ−jase a Proyecto, haga clic sobre Componentes... • Espere un momento hasta que aparezca la lista de componentes. • Busque en la lista Microsoft Common Dialog Control 6.0, active su casilla de verificación. 35
• Haga clic en Aplicar para agregar al cuadro de herramientas y luego en Cerrar para salir de la lista. • Seleccione el control Common Dialog que ahora debe aparecer en el cuadro de herramientas. • Dibújelo en el formulario. Ahora agregue el siguiente código, puede copiar y pegar: Private Sub Command1_Click() CommonDialog1.Filter = "Mapa de bits (*.bmp)|*.bmp|Archivos JPG *.jpg|*.jpg|Archivos Animados (*.gif)|*.gif" CommonDialog1.FilterIndex=2 CommonDialog1.ShowOpen End Sub Ejecute la aplicación, presione un clic sobre el botón de comando, se mostrará el cuadro de diálogo abrir, el mismo en su parte inferior tiene tres tipos de archivos: mapa de bits, Imagen JPG y archivos animados GIF. La propiedad FilterIndex se utiliza para presentar el tipo de archivo predeterminado cuando se muestre el cuadro de diálogo; en este caso el número dos (Archivos de imagen JPG). Propiedad FileName: La propiedad FileName devuelve el nombre del archivo que se ha seleccionado cuando se utiliza el cuadro de diálogo Abrir. Puede utilizarse también para el cuadro de diálogo guardar. Para ver un ejemplo de esta propiedad puede ver los programas #27 y 28, donde se encuentra la aplicación de esta propiedad. Se utiliza de la siguiente manera: Archivo = NombreCDialog.FileName Donde Archivo es una variable que almacenará una cadena de texto con la ruta y el nombre del archivo seleccionado, la parte derecha de la igualdad corresponde al archivo seleccionado del cuadro de diálogo. Propiedad FileTitle: Devuelve o establece el nombre (sin la ruta de acceso) del archivo que se va a abrir o guardar en tiempo de ejecución. Método ShowPrinter: Propiedades: • Copies: Devuelve o establece un valor que determina el número de copias que se van a imprimir. • FromPage: Devuelve o establece el valor que indica la primera página que se va a imprimir. • ToPage: Devuelve o establece el valor que indica la primera página que se va a imprimir. • Orientation: Devuelve o establece la orientación del papel de la impresora. • Min: Establece el intervalo de impresión. • PrinterDefault: Determina si las selecciones de un usuario en cuadro de diálogo Imprimir se usan para cambiar la configuración predeterminada de la impresora.
36
Método ShowColor: Sólo tiene la propiedad Color que devuelve o establece el color seleccionado en el cuadro de diálogo, por ejemplo: Private Sub ColorDelCirculo_Click() Dim ColorCirculo As Variant CommonDialog1.ShowColor ColorCirculo = CommonDialog2.Color Picture1.Circle (X,Y), Radio, ColorCirculo End Sub Este código dibuja un cÃ−rculo en las coordenadas x, y de cualquier radio con el color seleccionado en el cuadro de diálogo. Método ShowFont: Las propiedades del método ShowFont se refieren al tipo de fuente, son las siguientes: • FontBold: Es un dato tipo boolean que es verdadero si la fuente es negrita, o falso si no lo es. • FontItalic: También es un dato tipo boolean que es verdadero para producir fuentes cursivas. • FontUnderLine: Es tipo boolean al que se asigna verdadero para producir fuentes subrayadas. • FontName: Es una cadena de texto que contiene el nombre del tipo de fuente a utilizar. Ejemplo: Arial, Times New Roman u otras. • FontSize: Es un dato tipo Single que asigna un valor de tamaño (en puntos) a la fuente. • FontStrikeThru: También es un dato tipo boolean que es verdadero para producir fuentes tachadas. Método ShowHelp: • HelpCommand: Devuelve o establece el tipo de Ayuda en pantalla solicitada. • HelpContext: Devuelve o establece el Id de contexto para el tema de Ayuda solicitado. • HelpFile: Devuelve o establece el nombre del archivo de Ayuda asociado con el proyecto. • HelpKey: Devuelve o establece la palabra clave que identifica el tema de Ayuda solicitado. 5. Variables, Tipos de datos y Constantes: ♦ Variables: Durante la creación de una aplicación en VB 6.0, puede que necesite almacenar temporalmente valores numéricos, cadenas de texto u otro tipo de dato y luego poder cambiarlos operando con ellos, hacer cálculos o mostrar resultados; para este fin se utilizan las variables. Las variables utilizan un nombre para identificarse en el código, este nombre almacena un tipo de dato mediante la utilización de un operador de asignación (signo igual =) y se puede cambiar operando con ellos ya sea sumando o multiplicando valores (cualquier función matemática) o agregando caracteres a una cadena de texto (para el caso de cadenas de texto). 37
Ejemplo: Variable1 = 45 Variable2 = "Cadena de Texto" AquÃ−, Variable1 es el nombre de la variable, luego se presenta el signo igual de asignación y luego 45 que es el dato que desea almacenarse. El ejemplo de la Variable2 almacena una cadena de texto, se identifica por estar encerrada entre comillas. Un ejemplo de operaciones con variables serÃ−a: Variable1 = 45 Variable2 = 30 Variable1 = Variable1 + Variable2 En este caso es muy importante resaltar que, la tercera lÃ−nea de instrucción el signo igual no representa una ecuación de igualdad sino una asignación. La primera lÃ−nea asigna el valor 45 a Variable1, en la segunda lÃ−nea se asigna 30 a la Variable2. En la tercera lÃ−nea se realiza una operación de suma (Variable1+ Variable2 = 45+30 ) que se asigna a Variable1, por ello el valor de Variable1 cambia de 45 a 75. En este caso se pudo utilizar una Variable3 que guardara el valor de la suma, pero de la forma como se desarrolló permitió la economÃ−a de memoria ya que utilizó una variable menos. • Declarar variables: Para declarar variables se utiliza la Sentencia: Dim Variable [As Tipo] Donde, Dim le dice al programa que cree una nueva variable con el nombre Variable, y [As Tipo] es opcional y declara el tipo de dato que se desea almacenar, sino se coloca el programa crea una variable tipo Variant (ver más delante de que se trata). Por ejemplo: Dim MiCadena As String, prepara una variable de nombre MiCadena para almacenar cadenas de texto. Las variables una vez declaradas no distingue entre mayúsculas y minúsculas, es decir si se declaró la variable con nombre MiCadena, cuando se escriba micadena, Micadena, miCadena u otro nombre con otras mayúsculas y minúsculas, el programa cambiará el nombre colocando MiCadena, que es el nombre original, es decir, aunque cambie mayúsculas y minúsculas será la misma variable. Nombres de variables permitidos: Como ya se dijo, las variables deben tener un nombre. Se debe elegir un nombre que siga las siguientes reglas: • No puede empezar por un número, mas bien, debe empezar por una letra (mayúscula o minúscula) • No puede tener más de 255 caracteres. • No puede ser igual a una palabra clave de Visual Basic. No puede ser por ejemplo Dim, If, Then, For, String, etc. • No puede incluir caracteres especiales como asterisco, punto, signo de admiración o interrogación, u otros. • Pueden tener el mismo nombre siempre y cuando estén en procedimientos diferentes. Si declara una variable dentro de un procedimiento, una vez terminada la secuencia del procedimiento, se 38
perderá el valor de la misma, para evitar esto se deberá declarar la variables de forma: Static Variable [As Tipo] Esto permitirá que se preserve el valor de la variable cuando se termine el procedimiento, y cuando se vuelva a llamar al procedimiento la variable tendrá el último valor asignado a ella. Hay variables que se necesitan que puedan modificarse desde diferentes procedimientos para esto, se debe declarar las variables en la sección de declaraciones del formulario (lÃ−neas superiores del código del formulario) de la siguiente forma: Public Variable [As Tipo] , o también Dim Variable [As Tipo] Dos variables de procedimientos separados pueden tener un mismo nombre y no serán la misma variable. Programa #12. Contadores de Variables: El siguiente programa tiene por finalidad relacionarse con distintos tipos de variables. Para ello, se deben agregar dos botones de comando y cuatro etiquetas a un formulario. Luego, se debe escribir el siguiente código o copie y pegue: Option Explicit Public Variable As Integer Private Sub Command1_Click() Dim Variable1 As Integer Static Variable2 As Integer Variable1 = Variable1 + 1 Variable2 = Variable2 + 1 Variable = Variable + 1 Label1 = Variable1 Label2 = Variable2 Label4 = Variable End Sub Private Sub Command2_Click() Static Variable2 As Integer Variable2 = Variable2 + 1 39
Variable = Variable + 1 Label3 = Variable2 Label4 = Variable End Sub Ejecute el programa e interactúe con el haciendo clic sobre los botones. Verifique como varÃ−an los valores de las variables cada vez que presiona uno de ellos. Para obtener una información detallada sobre la codificación del programa dirÃ−jase a la Sección Detallada de Programas. Pero si existe una variable declarada en la sección pública y una variable en un procedimiento privado, VB 6.0 hará referencia a la variable mas inmediata, es decir, a la variable del procedimiento mas interno. Tipos de Datos: Una buena selección de la variable dentro de un programa promueve un ahorro de memoria, por lo que se recomienda que se seleccione el tipo adecuado para almacenar los datos que se desean. Los tipos de datos son los siguientes: • Boolean: Almacena un valor que puede tomar dos opciones: verdadero (True) o Falso (False). Un ejemplo de este tipo de dato es la propiedad visible de algunos controles. Ocupa un espacio en la memoria de 2 bytes. • Byte: Puede almacenar un número natural que puede estar entre 0 y 255. No acepta valores negativos. Puede ser utilizado por ejemplo para almacenar edades, los números de meses del año o los dÃ−as del mes, etc. Si se realiza una suma o restan dos números Bytes, el resultado debe ser Byte, debe estar entre 0 y 255, si no, el programa genera un error de desbordamiento. Ocupa un espacio de 1 byte. • Integer: Puede almacenar valores enteros desde -32.768 hasta 32.767. Ocupa en la memoria 2 bytes. • Long: También puede almacenar valores enteros, pero en este caso tiene una extensión más grande ya que almacena números entre -2.147.483.648 hasta 2.147.483.647. Ocupa en la memoria 4 bytes. • Single: Puede almacenar valores numéricos con decimales, tanto negativos como positivos, es de precisión simple, su rango está entre -1,401298x10-45 hasta +1,401298x1045. Ocupa en la memoria 4 bytes. • Double: También puede almacenar valores numéricos con decimales, negativos y positivos, pero por tener más memoria asignada puede tener valores de precisión doble, van desde -4,94065645841247x10-324 hasta 1,79769313486232x10308. ocupa en la memoria 8 bytes. • Currency: Este tipo de dato se utiliza para almacenar valores numéricos monetarios, su rango va desde -922.337.203.685.477,5808 hasta el 922.337.203.685.477,5807. • String: Se utiliza para almacenar cadenas de texto. Puede tener una longitud fija si se declara: Dim Variable As String * Longitud, donde longitud es un número entero que indica el número de caracteres que va a tener la variable. Si cuando se introduce una cadena, ésta tiene la longitud menor a la cantidad dada por Longitud, entonces el programa los rellena con espacios en blanco, si la cantidad de caracteres es mayor entonces se recortará. Ocupa en la memoria de acuerdo al número de caracteres que contenga (1 byte por carácter). • Date: Este tipo de dato puede almacenar valores de fechas y horas. Su rango va para las fechas desde 1/1/100 hasta el 31/12/9999 y para las horas desde 0:00:00 hasta 23:59:59. • Variant: Este tipo de dato es el que mas memoria consume (16 bytes), pero tiene una ventaja sobre 40
los otros y es que puede almacenar cualquiera de los tipos de datos descritos anteriormente, incluso puede cambiar de una cadena a un número, después guardar una fecha o cualquier otro tipo de dato. Las variables tipo variant no son declaradas necesariamente puede escribir Dim Variable y VB reconocerá como si hubiese escrito Dim Variable As Variant. • Estructuras: Se utiliza para crear un solo tipo de dato (personalizados) combinando los distintos tipos básicos vistos anteriormente. Estas se explicarán más adelante en esta misma sección. Su espacio en la memoria es variable de acuerdo al tipo de datos que combine. Para declarar una variable a un tipo de dato se declara: Public/Private/Dim/Static Variable [As Tipo] Ejemplos de algunos serÃ−an: Dim MiNumero As Double Crea una variable de tipo precisión doble con nombre MiNumero Public Cadena As String * 8 Crea una variable de tipo cadena de 8 caracteres de nombre Cadena Static Valor As Integer Crea una variable de tipo entero de nombre Valor que preservará su valor Dim Variable Crea una variable tipo variante de nombre Variable Existen funciones que convierten un tipo de dato a otro: las funciones de conversión son: Función Convierte a: Cbool(expresión) Boolean Cbyte(expresión) Byte Ccur(expresión) Currency Cdate(expresión) Date CDbl(expresión) Double Cint(expresión) Integer CLng(expresión) Long CSng(expresión) Single CStr(expresión) Strng Cvar(expresión) Variant Por ejemplo la sentencia CStr(45125) almacena 45125 como una cadena de texto y no como un valor numérico. Programa #13. Conversión de datos: Agregue un botón de comando (Command1) y un cuadro de texto (Text1) a un formulario. Agregue el siguiente código o copie y pegue: 41
Private Sub Command1_Click() Dim Mi As Integer Text1 = CInt(Text1) Text1 = Text1 End Sub Private Sub Form_Activate() Text1.SetFocus End Sub Private Sub Form_Load() Form1.Caption = "Introduzca un valor" Text1 = "" Command1.Caption = "Convertir" End Sub Ejecute el programa en Iniciar y en el cuadro de texto agregue un valor con decimales, el programa lo convertirá a entero. Como ya los comandos e instrucciones que se encuentran en este programa ya han sido explicados este programa no se detalla en la Sección Detallada de Programas. Estructuras: Las estructuras se utilizan para crear un solo tipo combinando los tipos básicos, se denotan: Type Nombre SubVariable1 As Tipo SubVariable2 As Tipo ... End Type Donde Nombre es el nombre de la estructura que grabará un conjunto de datos. SubVariable1, SubVariable2 son sub-variables que componen la estructura. Para crear una variable de este tipo de dato se procede del mismo tipo como si estuviera creando una variable de tipo Nombre:
42
Public Variable As Nombre Ahora, para acceder o asignar cada sub-variable del conjunto se escribe: Variable.SubVariable1 = Valor1 Variable.SubVariable2 = Valor2 AsÃ− por ejemplo la siguiente secuencia: Type Alumnos Nombre As String Edad As Byte Grado As Byte End Type Crea un tipo de dato que graba el nombre, edad y grado de un alumno, luego se colocará: Public Alumno As Alumnos Alumno.Nombre = "Carlos Bravo" Alumno.Edad = 16 Alumno.Grado = 8 Text1.text = Alumno.Edad Constantes: Una constante es un valor que por si sólo puede ser difÃ−cil de recordar y por lo tanto se le asigna un nombre para trabajar con el nombre y no con el valor. Existen constantes que están intrÃ−nsecas en el lenguaje de programación como por ejemplo FillStyleConstants, que contienen un diverso conjunto de constantes que pueden ser utilizadas para cambiar el estilo del, relleno a un objeto. Pero, en VB 6.0, puede crear sus propias constantes anteponiendo la palabra Const al nombre de la constante que desea crear, agregar el sÃ−mbolo igual (=) y luego el valor, de tal manera quedarÃ−a: Const Nombre = Valor Como ejemplo, podrÃ−a ser el aplicado en el programa del control de cuadro de imagen (PictureBox): Const Pi = 3.1415927 O también: Const LineasCruzadas = vbCross
43
Luego, puede llamar a la constante de igual manera que se llamarÃ−a a una variable, pero en este caso no se puede cambiar el valor asignado, si se intentara cambiar el programa mostrarÃ−a un error de compilación. Por ejemplo, agregue en un formulario un botón de comando (Command1) y un cuadro de imagen (Picture1), escriba el siguiente código o copie y pegue: Private Sub Command1_Click() Const LineasCruzadas = vbCross Picture1.FillStyle = LineasCruzadas Picture1.Circle (1000, 1000), 400 End Sub AsÃ−, si se escribe LineasCruzadas en la propiedad FillStyle, ésta llama a su contenido que es la constante intrÃ−nseca vbCross que pertenece a las constantes de estilos de relleno, se rellenará en el circulo del cuadro de imagen con lÃ−neas cruzadas. Ahora si por ejemplo, agrega un botón de comando (Command1) a un formulario y escribe el siguiente código: Private Sub Command1_Click() Const e = 2.71828 Command1.Caption = e End Sub Se escribirá en el botón de comando la constante e. 6. MATRICES: Las matrices permiten crear variables con un mismo nombre diferenciándose sólo por un número de Ã−ndice. Los elementos de las matrices están entre un Ã−ndice inicial y un Ã−ndice final, los Ã−ndices de los elementos de la matriz deben estar dentro de estos Ã−ndices. Las matrices almacenan todos sus elementos en un mismo tipo de dato, este tipo de dato fue declarado al mismo tiempo que fue declarado la matriz. Las matrices pueden ser de tamaño fijo o dinámicas (que pueden cambiar de tamaño). Para declarar una matriz de tamaño fijo se utiliza la siguiente secuencia: Dim/Public/Static/Private NombreMatriz(NúmerodeElementos) As Tipo Los Ã−ndices de las matrices comienzan a enumerarse desde cero por lo tanto el número al lado de la matriz sumado en uno es el número de elementos que contiene la matriz. Por lo tanto: Dim MiMatriz(10) As String
44
Crea una matriz de nombre MiMatriz de 11 elementos de tipo cadena de texto. Con números de Ã−ndice entre 0 y 10. Si se desea que sólo contenga 10 elementos tendrá que declararse: Dim MiMatriz(1 To 10) As String En este caso los Ã−ndices van desde 1 hasta 10. El número de elementos no puede exceder de la capacidad de un dato Long (2.147.483.647 elementos) También puede declarar matrices con números de Ã−ndices entre dos valores diferentes por ejemplo: Public k(10 To 19) As Integer De esta manera puede variar los números de Ã−ndice entre dos valores Tipo Long diferentes. Para almacenar un valor en un elemento de la matriz de procede de la siguiente manera: Matriz(à ndice) = Valor De la misma manera que se asigna un valor a una variable, pero esta vez contiene dentro del paréntesis el número de Ã−ndice correspondiente. De manera que: Dim i As Integer Dim K(9) As Integer For i = 0 To 9 K(i)=i Next Almacena el número de Ã−ndice en su variable correspondiente. También se pueden crear matrices multidimensionales si separa con una coma los valores de Ã−ndices de la siguiente manera: Static OtraMatriz(4, 4) As Double Esta sentencia creará una matriz de 25 elementos, de 0 a 4 (cinco elementos) en el primer Ã−ndice e igual número de elementos para el segundo Ã−ndice. Al igual que las matrices unidimensionales puede cambiar la numeración de sus Ã−ndices como valores de tipo Long. Ejemplo: Dim MatrizDimensional(1 To 5, 10 To 13) As Single De esta manera se creará una matriz de dos dimensiones de 20 elementos. (De uno hasta cinco en el primer Ã−ndice y de diez hasta trece en el segundo Ã−ndice)
45
Puede agregar más dimensiones y crear matrices de tres dimensiones, cuatro o mas dimensiones. Se puede cambiar mediante una instrucción, que debe colocarse en la sección de declaraciones del formulario, para que todas las matrices comiencen a enumerarse desde el número 1 o desde el número cero, esta es: Option Base 1 Para que se comience a enumerar desde uno o, Option Base 0 Para enumerarse desde el número cero. Matrices Dinámicas: Las matrices vistas anteriormente son estáticas, ya que el número de elementos no puede variar, esto puede ocasionar que el número de elementos no sea suficiente para algunas acciones o por el contrario que esté sobredimensionado. Para este caso se crearon la matrices dinámicas, estas se declaran de la misma forma que las matrices dinámicas pero sin nada en los paréntesis, de la siguiente manera: Dim/Public/Static/Private NombreMatrizDinámica() As Tipo Luego, en tiempo de ejecución, cuando ya se esté seguro del número de elementos que necesite, se puede redimensionar, con la siguiente sentencia: Redim [Preserve] NombrematrizDinámica(NúmerodeElementos) Cada vez que redimensione la matriz se borrarán todos los elementos que estaban almacenados en la matriz, esto es muy útil si desea utilizar la matriz para almacenar valores nuevos, pero sino, esto se puede evitar si se coloca la palabra Preserve. Esta sentencia preservará los valores almacenados en la matriz hasta ese momento. Redim sólo se puede usar una vez por función o por procedimiento. Aunque se puede redimensionar el número de elementos que tiene una matriz no se puede cambiar el número de dimensiones. Para ampliar la matriz en un elemento preservando los valores de los elementos que ella contiene se puede utilizar la palabra UBound de la siguiente manera: Redim Preserve NombreMatriz(UBound(NombreMatriz)+1) Sólo se puede cambiar la última dimensión de una matriz, si se intenta cambiar otra dimensión se producirá un error en tiempo de ejecución. 7. OPERADORES Là GICOS, OPERADORES MATEMÔTICOS Y FUNCIONES MATEMÔTICAS: Los operadores lógicos son sÃ−mbolos (algunos matemáticos) que se utilizan para crear condiciones y 46
bucles. El computador toma decisiones (mediante las sentencias de control que se verán mas adelante) según estas condiciones devuelvan verdadero o falso. Los operadores lógicos son: Operador Igual Diferente Igual (en texto) Menor que Mayor que Menor o igual que Mayor o igual que Negación AsÃ− por ejemplo:
SÃ−mbolo = <> Like < > <= >= Not
Condición Devuelve: 30 = 12 Falso 12 <> 30 Verdadero 30 < 12 Falso Not 12 > 30 Verdadero También existen conexiones de condiciones y devuelven verdadero o falso según la combinación de dos condiciones, estas son: • Or: Devuelve Verdadero si alguna de las condiciones es verdadera. • And: Devuelve Verdadero si las condiciones comparadas son verdaderas. • XOr: Devuelve Verdadero si una devuelve Verdadero y la otra Falso. • Eqv: Devuelve verdadero si las condiciones comparadas son equivalentes, es decir, si son ambas verdaderas o falsas. • Imp: Devuelve verdadero en todos los casos, excepto cuando la primera sea verdadera y la segunda falsa. AsÃ− por ejemplo: Si X = 3 y V=2 Condición Devuelve: X = 2 Or V = 2 Verdadero X = 3 And V < 1 Falso X <= 3 Xor V = 1 Verdadero X = 2 Eqv V > 3 Verdadero X = 3 Eqv V = 4 Falso X = 3 Imp V = 2 Falso Se pueden colocar mas de una combinación y asÃ− anidar condiciones que también devolverán verdadero o falso: Condición
Devuelve:
47
X = 2 Or X = 3 And V = 1 Or V = 2 X = 2 And V = 3 Or X = 1 And V = 2 Operadores Matemáticos y Funciones Matemáticas:
Verdadero Falso
VB 6.0 contiene un conjunto de operadores matemáticos que se utilizan para hacer cálculos numéricos, algunos de ellos son: Operadores Matemáticos + * / \ ^ Mod Funciones Matemáticas
Operación Suma de números: Ejemplo (2 + 4) devuelve 6. Sustracción de números o número negativo. Ejemplo: (30 - 15) devuelve 15. Multiplicación de números. Ejemplo (2 * 5) devuelve 10. División de números. Ejemplo (10 / 3) devuelve 3.3333. División entera de números: Ejemplo 10\3 devuelve 3. Potencia de números. Ejemplo 11^2 devuelve 121. Residuo de una división. Ejemplo (100 Mod 9) devuelve 1. Operación Valor absoluto de un número. Ejemplo
Abs(Numero) Atn(Numero) Cos(Numero) Exp(Numero) Fix(Numero) Log(Numero) Log(Numero)/Log(Base#) Ramdomize([Numero]) Rnd([Numero]) Round(Numero, Decimales) Sgn(Numero) Sin(Numero) Sqr(Numero)
Abs(-45) devuelve 45. Arcotangente de un número. Ejemplo Atn(1) devuelve 0.7854. Coseno de un número radian: Ejemplo Cos(3.14159265) devuelve -1. E elevada a un número. Ejemplo Exp(1) devuelve 2.71828. Parte entera de un número. Ejemplo Fix(4.5) devuelve 4. Logaritmo natural de un número: Ejemplo Log(2.71828) devuelve 1. Logaritmo con base distinta de e. Ejemplo Log(100)/Log(10#) devuelve 2, o Log(8)/log(2#) devuelve 3. Inicia generador de números aleatorios. Número aleatorio igual o menor a Numero. Numero redondeado a decimales. Ejemplo Round(2.54512, 2) devuelve 2.55. -1, 0, 1 según número sea menor, igual o mayor que cero. Ejemplo Sgn(-45) devuelve -1. Seno de un número radian. Ejemplo Sin(1.570796) devuelve 1. RaÃ−z cuadrada de un número. Ejemplo Sqr(16) devuelve 4. 48
Tan(Numero)
Tangente de un número radian. Ejemplo: Tan(0) devuelve cero.
• PROCEDIMIENTOS Y FUNCIONES: Procedimientos: Los procedimientos contienen conjunto de acciones o secuencias de código que ejecuta la aplicación. Estos procedimientos pueden ser llamados desde cualquier lugar de un formulario o sin son públicos desde cualquier lugar de la aplicación. Los procedimientos pueden simplificar la codificación cuando existe una secuencia de código que se debe repetir. Con el nombre del procedimiento puede llamar a este conjunto de secuencias. Supongamos que se tienen dos procedimientos: el principal de nombre Procedimiento1 y el secundario de nombre Procedimiento2. Si en algún lugar de Procedimiento1 se llama a Procedimiento2, desde este lugar, el programa comienza a ejecutar el conjunto de secuencias de Procedimiento2, luego terminado este procedimiento el programa continua ejecutando las secuencias de Procedimiento1 hasta completar la secuencia. Las variables privadas de un procedimiento no se conservan cuando se ejecute el otro procedimiento, si las variables son públicas (declaradas en la sección superior del código del formulario bajo la sentencia Public) si conservan su valor. Programa #14. Variables de procedimientos: Se va a crear un programa que calcula el área de un cÃ−rculo dado su radio. Para ello se debe agregar, de arriba hacia abajo, una etiqueta con Caption: “Radio= “ al lado de un cuadro de texto (Text1), debajo de estos controles agregue un botón de comando (Command1), luego debajo de éste dos etiquetas Label2 y Label3. Agregue el siguiente código (puede copiar y pegar): Option Explicit Public Area As Double Private Sub Form_Load() Me.Caption = "Area de un CÃ−rculo" Text1 = "" Command1.Caption = "Calcular Area" Label2 = "" Label3 = "" Label2.BorderStyle = 1 Label3.BorderStyle = 1 End Sub 49
Private Sub Command1_Click() Dim Radio As Double, Area As Double If Text1 <> "" And IsNumeric(Text1) Then Radio = CDbl(Text1) Area = 3.16159265 * Radio ^ 2 Label2 = "Area= " & Area Display Else MsgBox "Introduzca un valor" Text1.SetFocus End If End Sub Private Sub Display() Label3 = "Area= " & Area End Sub Ejecute el programa introduzca un valor u otro contenido en el cuadro de texto y verifique la respuesta. El procedimiento Display (al final) desplega resultado cero ya que hace referencia a la variable Area pública (que no tiene ningún valor asignado) y no la variable Area privada que se encuentra en el procedimiento de evento Command1_click. Para obtener detalles sobre la codificación de este programa se puede dirigir a la Sección Detallada de Programas al final de este trabajo de investigación. Para ver otro ejemplo de llamadas a procedimientos puede ver el Programa #5. ¿Dónde estudiar?, donde se presentan dos variables públicas que conservan su valor fuera de los procedimientos. También puede dirigirse a sus Detalles en la Sección Detallada de Programas. En VB 6.0 existen tres tipos de procedimientos: • Sub • Function • Property Los primeros sólo ejecutan una serie de sentencias y comandos y no devuelven un valor. Los segundos contienen una función dentro de sÃ− que devuelven un valor al llamarlos.
50
Los terceros pueden devolver o asignar valores. Para crear un nuevo procedimiento, se puede ir en la Barra de Menús de VB a Herramientas, luego hacer clic en Agregar procedimiento tal como lo muestra la figura: Se desplegará la siguiente pantalla: En esta se deberá colocar el nombre del procedimiento, el Tipo (Sub = Procedimiento; Function = Función ; Property = Propiedad o un Evento) y el alcance en caso del procedimiento (Público o Privado) si es una función después deberá colocar el tipo de dato que devolverá la función, si no lo coloca este tomará Variant por defecto. Como se han visto ejemplos de procedimientos Sub, se procede a ejemplificar el procedimiento Function. Programa#15. Procedimiento Function: Este programa tiene como finalidad mostrar la aplicación de los procedimientos Function. Para ello, agregue dos cuadros de texto (Text1 y Text2) al formulario, agregue además un botón de comando (Command1) y una etiqueta (Label1), Después agregue el siguiente código (puede copiar y pegar): Option Explicit Private Sub Form_Load() Text1 = "" Text2 = "" Command1.Caption = "Calcular Residuo" Label1 = "" End Sub Private Sub Command1_Click() If IsNumeric(Text1) And IsNumeric(Text2) Then Label1 = Residuo(Text1, Text2) Else MsgBox "Introduzca valores numéricos" Text1.SetFocus End If End Sub Private Function Residuo(Dividendo As Integer, Divisor As Integer) _
51
As Integer Residuo = Dividendo Mod Divisor End Function Se puede notar que la función disminuyó considerablemente las instrucciones que debÃ−an colocarse en la secuencia de Command1. De hecho, no fue necesario declarar variables. Los detalles de la programación aparecen en la Sección Detallada de Programas. 9. SENTENCIAS DE CONTROL Las sentencias de control se utilizan en VB 6.0 para que el programa lleve un curso lógico y tome decisiones en base a condiciones que se puedan presentar mientras éste se ejecuta. Como ya se ha visto anteriormente, las condiciones pueden devolver dos posibilidades en una decisión, puede devolver verdadero (True) o Falso (False); asÃ− puede llevar el programa a ejecutar una serie de instrucciones de acuerdo a una respuesta, para ello se utilizan las estructuras de decisión. LAS ESTRUCTURAS DE DECISIà N SON: • If ... Then ... • Select Case ... Estructura de decisión If ... Then ... Este tipo de estructura (que ya ha sido utilizado en varios programas anteriores) ejecuta una serie de instrucciones, en base a una respuesta a una condición. Tiene la siguiente forma: If condición Then Instrucciones si condición es verdadera [Else] Instrucciones si condición es falsa End If Donde la condición reúne las especificaciones descritas en la sección anterior que devuelve verdadero o falso, entre la palabra Then y Else (si se coloca Else) se escriben una serie de instrucciones que se ejecutan si la condición devuelve verdadero. Entre Else y End If, se colocan las instrucciones en caso de que la instrucción devuelve Falso. La palabra Else no es obligatoria, si no se coloca en caso de que la condición sea falsa no hay ejecución de instrucciones. Quedando de la siguiente forma: If condición Then Instrucciones si condición es verdadera End If 52
También es posible que se encuentre el caso de que haya mas de una condición que se desea comparar, asÃ− por ejemplo, si se cumple una condición se ejecutan una serie de instrucciones, en caso de que sea falso talvez se desee comparar otra condición y verificar si es verdadera, asÃ− sucesivamente hasta encontrar la condición que se cumple, para esto se utiliza la siguiente secuencia: If condición1 Then Instrucciones si condición1 es verdadera [ElseIf condición2 Then] [Instrucciones si condición2 es verdadera] [ElseIf condición3 Then] [Instrucciones si condición3 es verdadera] ... [Else] [Instrucciones si todas las condiciones son falsas] End If Puede agregar cualquier cantidad de ElseIf tantas veces como quiera hasta lograr el objetivo de alcanzar la secuencia que se quiere ejecutar según la condición. Cuando ya una condición se cumple se ejecutan las instrucciones que están dentro de esta condición y al terminar la secuencia se va hasta el final Esta secuencia es muy valiosa si las condiciones no incluyen la misma variable o incluyen más de una variable. Ya que si desea comparar una variable es más fácil utilizar la secuencia Select Case. Programa #16. Instrucción If: El siguiente programa tiene la finalidad de utilizar la instrucción If en todos la mayorÃ−a de los casos que se pueda presentar durante la codificación de un programa. Agregue a un formulario un cuadro de texto (Text1) y un botón de comando (Command1) y escriba el siguiente código, puede copiar y pegar: Private Sub Form_Load() Text1 = "" Command1.Caption = "Comparar" End Sub Private Sub Command1_Click() Dim Valor As Double, Respuesta As String
53
If Text1 = "" Then Valor = 0 Else Valor = CDbl(Text1) End If If Valor < 0 Then Respuesta = "El Valor es negativo" ElseIf Valor = 0 Then Respuesta = "El Valor es cero" Else Respuesta = "El Valor es positivo" End If Text1 = Respuesta End Sub Ejecute la aplicación e introduzca un valor numérico en el cuadro de texto. Luego haga clic en el botón de comando y espere la respuesta. Si tiene alguna duda sobre la codificación de este programa puede repasar la explicación de la estructura de decisión If, y verificar los detalles sobre la función de dicha estructura. Estructura de decisión Select Case... La estructura Select Case se utiliza si desea comparar una sola variable a un conjunto de condiciones y ejecutar la secuencia según el caso que se cumpla. El caso del programa anterior pudo utilizar esta estructura. Select Case tiene la siguiente forma: Select Case Variable Case Valor1: instrucciones si Variable es igual a Valor1 Case Valor2, Valor3: instrucciones si Variable es Valor2 o Valor3. Case Is < Valor4: instrucciones si Variable es menor a valor4. Case Valor5 To Valor6: instrucciones si Variable está entre Valor5 y Valor6 End Select
54
Esta explicación se encuentran las cuatro combinaciones posibles de casos que se pueden presentar. En la sección que muestra Case Is, se puede colocar menor o igual (<=) , menor (<), mayor (>) o mayor o igual (>=) y hacer la comparación de la variable respecto a un valor. El programa #16 podrÃ−a colocarse entonces como código: Private Sub Form_Load() Text1 = "" Command1.Caption = "Comparar" End Sub Private Sub Command1_Click() Dim Valor As Double, Respuesta As String If Text1 = "" Then Valor = 0 Else Valor = CDbl(Text1) End If Select Case Valor Case Is<0: Respuesta="El valor es negativo" Case 0: Respuesta="El valor es cero" Case Else: "El valor es positivo" End Select Text1=Respuesta End Sub Reduciendo el número de lÃ−neas y las complicaciones de la codificación. Existe otro tipo de estructuras llamadas estructuras de bucles, ejecutan las instrucciones repetidamente, mientras o hasta que se cumpla una condición. LAS ESTRUCTURAS DE BUCLES SON: • Do ... Loop • For ... Next • For Each ... Next 55
El bucle Do ... Loop: Este bucle utiliza dos formas básicas (aunque se pueden colocar de distinta manera) para ejecutar un conjunto de instrucciones mientras o hasta se cumpla una condición. La siguiente instrucción: Do While condicion Sentencias [Exit Do] Loop Se utiliza para realizar el conjunto de instrucciones mientras se cumpla una condición, asÃ−, si la condición devuelve verdadero (True) o distinto de cero, se ejecutan el conjunto de instrucciones, luego se regresa al inicio y se vuelve a verificar la condición, si es verdadera de nuevo o distinta de cero, se vuelve a ejecutar la secuencia hasta que la condición devuelva Falso o cero. Este bucle se puede escribir mas rápidamente de la siguiente manera: While condidion Sentencias Wend Este caso no tiene la opción de salir del bucle si se deseara. Si la condición devuelve Falso o cero en la primera evaluación no se ejecutará ninguna vez, a menos que se coloque de la siguiente forma: Do Sentencias [Exit Do] Loop While condicion De esta forma se ejecuta primero el conjunto de instrucciones y luego se evalúa la condición. Se repetirá la ejecución de acuerdo a la respuesta obtenida en la condición de acuerdo a lo señalado anteriormente. También se puede cambiar la estructura Do ... Loop de tal manera que se ejecute el conjunto de instrucciones cuando la condición devuelva Falso o cero, para ello se debe cambiar la palabra While de la instrucción por la palabra Until. De tal manera quedarÃ−a: Do Until condicion Sentencias
O bien:
Do Sentencias
56
[Exit Do]
[Exit Do]
Loop Programa #17. Suma hasta cien:
Loop Until condicion
El siguiente programa desplega (cuando se hace clic en el botón de comando) una caja de entrada para obtener un valor que se sumará. Cuando la suma tome el valor 100 o mayor el proceso se detendrá: Agregue un botón de comando (Command1) y una etiqueta (Label1) a un formulario, escriba el siguiente código, puede copiar y pegar: Private Sub Command1_Click() Static Suma As Double Do While Suma < 100 Num = InputBox("Escriba un número", "Mensaje", "0") Suma = Suma + Num Label1 = Suma Loop End Sub Ejecute la aplicación e interactúe colocando valores hasta llegar hasta 100, verifique que se detiene el proceso. Este programa no se colocó en la Sección detallada de Programas ya que es de fácil comprensión y muchos de los procesos utilizados ya han sido ampliamente explicados. El bucle For ... Next: El bucle For ... Next se utiliza para ejecutar un número determinado de veces el conjunto de instrucciones que contiene. Tiene la siguiente forma: For Variable = ValorInicial To ValorFinal [Step ValorIncremento] Sentencias [Exit For] Next [Variable] Donde variable es una variable que va a cambiar desde un valor inicial a un valor final, con un incremento dado por Step (opcional). Exit For se puede utilizar en alguna parte del interior de las sentencias si se desea dar fin al bucle. El valor incremento puede ser positivo, para ir incrementando la variable o negativo para ir disminuyendo, lógicamente si es positivo el valor inicial debe ser menor al valor final o si es negativo el valor inicial debe 57
ser mayor al valor final. Si no se coloca el incremento (Step) este asumirá uno a menos que la variable cambie dentro de las sentencias. Programa #18. Utilización de For: En un formulario agregue un botón de comando (Command1) y un control cuadro de imagen (Picture1) de 2700 o más de Ancho (Width) y 1000 de alto (Height). Escriba el siguiente código: Private Sub Command1_Click() Dim X As Long For X = 250 To Picture1.Width Step 1000 Picture1.CurrentX = X Picture1.CurrentY = Picture1.Height - 300 Picture1.Print "Aqui" Next End Sub Ejecute el programa, presione clic sobre el botón de comando, se escribirá en el cuadro de imagen la palabra “AquÃ−” varias veces según el ancho del cuadro de imagen. También se puede eliminar la sección (Step 1000) y colocar en las sentencias después de la lÃ−nea Picture1.Print: X = X + 1000 Es la forma de incrementar la variable directamente en las sentencias de instrucciones. Bucle For Each ... Next: Es una modalidad del bucle For ... Next, pero éste permite recorrer una matriz o una colección de datos (Ver Objeto Collection) cuando no se sabe el número de elementos de contienen. Tiene la siguiente forma: For Each Elemento In Collection/Matriz Sentencias [Exit For] Next Donde Elemento es una variable de tipo Variant si es una Matriz o un Objeto si es una colección de objetos. También te la opción Exit For para salir del bucle en el momento que se desea. OTRAS SENTENCIAS: Sentencia Goto:
58
La sentencia Goto permite dirigir la secuencia de instrucciones a otro lugar mas inferior en vez de seguir la secuencia de lÃ−neas como generalmente se ejecuta un programa. Cuando esta sentencia se coloca, se debe colocar a su lado el nombre de un subprocedimiento, este nombre debe colocarse más abajo (en el lugar donde se desea que se dirija el programa) seguido de dos puntos y luego las sentencias o instrucciones que se desea que se ejecute, por ejemplo: Es muy importante resaltar que las lÃ−neas de secuencia de las instrucciones por realizarse de arriba hacia abajo no excluye al subprocedimiento, por lo tanto para finalizar la ejecución de instrucciones antes del subprocedimiento debe agregarse la palabra Exit Sub/Function que corresponda para no ejecutar las lÃ−neas contenidas en el procedimiento. Esta sentencia también se utilizan en el caso que se produzca un error en la ejecución de un procedimiento, en este caso se escribirÃ−a en la primera lÃ−nea del procedimiento: On Error Goto NombreSubprocedimiento Y debajo en la parte inferior del procedimiento colocar las lÃ−neas correspondientes a las acciones que se deben tomar en caso de producirse un error. Esto se ve ejemplificado en el siguiente programa: Programa #19. Sentencia Goto: Este programa tiene por objetivo verificar si un número introducido es divisible entre los valores 2, 3 y 4 simultáneamente. Para ello, agregue un botón de comando (Command1), además agregue dos cuadros de texto (Text1) y (Text2), el segundo identificado con una etiqueta que muestre “¿Divisible entre 2, 3 y 4?”, luego agregue el siguiente código: Private Sub Command1_Click() On Error GoTo ErrorValor Text2 = DivisibleEntre2_3_4(Text1) Exit Sub ErrorValor: If Err.Number = 13 Then MsgBox "Error en el valor introducido", , "Introduzca un valor" Text1 = "" Text1.SetFocus End If End Sub Private Function DivisibleEntre2_3_4(Numero As Integer) As Boolean 59
If Numero Mod 2 <> 0 Then GoTo NoEsDivisible End If If Numero Mod 3 <> 0 Then GoTo NoEsDivisible End If If Numero Mod 4 <> 0 Then GoTo NoEsDivisible End If DivisibleEntre2_3_4 = True Exit Function NoEsDivisible: DivisibleEntre2_3_4 = False End Function Ejecute la aplicación, introduzca un valor entero en el primer cuadro de texto y presione clic sobre el botón de comando, Text2 mostrará Verdadero si el valor es divisible entre 2, 3 y 4 o falso si no lo es. Pruebe con distintos números. Los detalles sobre la codificación de este programa están en la Sección Detallada de programas. Sentencia With: A esta sentencia también se le llama Bloque With, ya que agrupa un conjunto de instrucciones con respecto a un objeto, control o estructura. La sentencia With se utiliza cuando se desea ejecutar un conjunto de instrucciones con referencia a un objeto, control o estructura para no hacer referencia en cada paso a esta sino una sola vez. Por ejemplo la secuencia: With Label1 .BorderStyle=1 .Caption="Nombre:" .Enabled=True .Width=1815 End With 60
Cambia las propiedades estilo de borde, caption, ensamblado y ancho de la etiqueta uno, con necesidad de escribir Label1 sólo una vez. 10. CUADROS DE DIÔLOGO: Los cuadros de diálogo se utilizan para presentar un mensaje al usuario con la finalidad que éste tome decisiones y el programa reaccione a ellas. Por ejemplo si el usuario introdujo realizó una acción inválida, usted puede mostrar mediante un mensaje informando que la acción que se ha realizado fue inválida y por lo tanto debe corregir para continuar. También se pueden presentar cuadros de diálogo para mostrar información. Hay otros cuadros de diálogo como el cuadro de diálogo de Abrir, Guardar como, Imprimir, que esperan acciones del usuario para continuar., Los cuadros de diálogos pueden ser modales o no modales. Modales significa que se debe cerrar el cuadro de diálogo (puede ser hacer clic sobre el botón Aceptar, Cancelar, Cerrar u otro) para continuar utilizando la aplicación. Si no se cierra no se podrá continuar utilizando la aplicación. Los cuadros de diálogo Guardar como, Imprimir, Abrir y el que se han utilizado hasta ahora en la programación: MsgBox, son de tipo modal, esperan la reacción del usuario, mientras que el cuadro de diálogo Buscar es de tipo no modal, es decir, puede seguir cambiando o utilizando la aplicación mientras el cuadro de diálogo no modal está abierto o en funcionamiento. El siguiente programa convierte un formulario en tipo modal: Programa #20. Formulario Modal: Se va a crear un programa de dos formularios (Form1 y Form2). Para ello en el primer formulario cambie su propiedad WindowState a 2 - Maximized, después agregue un botón de comando (Command1). Luego, se debe agregar el otro formulario, para ello busque en la Barra de Herramientas Proyecto, busque Agregar Formulario y después haga clic sobre Formulario, se creará un formulario con nombre Form2. En Form2, agregue un botón de comando (Command1) y agregue el siguiente código: Private Sub Command1_Click() Unload Me End Sub Haga clic sobre Form1 en el Explorador de Proyectos, luego clic sobre Ver objeto, en el botón de comando presione doble clic para empezar a escribir código, escriba de tal manera que quede: Private Sub Command1_Clic() Form2.Show vbModal End Sub Ejecute el programa y verifique que cuando hace clic sobre el botón de comando Command1 de Form1 se desplega el Form2 de tipo modal, si elimina la sentencia vbModal, entonces Form2 no será de tipo modal. El botón de comando de Form2 hace que se cierre el formulario mediante la sentencia Unload Me. 61
Por ser de fácil comprensión este programa no se encuentra detallado en la Sección Detallada de Programas. Cuadros de Mensajes (MsgBox): Los cuadros de mensaje MsgBox se utilizan para mostrar una información al usuario, son utilizados muy a menudo en el tratamiento de errores para presentar al usuario una falla que se haya cometido, un error causado. Pero también se utiliza para informar al usuario sobre un acontecimiento que se ha generado que no sea un error sino que por ejemplo se ha llegado al final de un procedimiento. Los cuadros de mensaje tienen la siguiente forma MsgBox Prompt, [Estilo], [TÃ−tulo] Donde Prompt es una variable o una cadena de texto que representará el mensaje escrito que desea que el usuario lea, Estilo es opcional y son un conjunto de caracterÃ−sticas que puede tener el cuadro de mensaje ya sea que tenga botón de Aceptar, Cancelar, Ayuda o que tenga un icono a su lado como el signo de exclamación o un icono crÃ−tico, si se omite el estilo predeterminado no se mostrarán iconos y será vbOkOnly que significa que sólo se presentará el botón Aceptar. Los estilos de cuadros de mensaje se pueden observar si coloca la palabra vbMsgBoxStyle en el Examinador de objetos. El titulo también es una variable o una cadena de texto que aparecerá en el tÃ−tulo del cuadro de mensaje, por ejemplo el siguiente código presenta el siguiente mensaje: Programa #21. Mensaje: En este programa se utiliza un cuadro de mensaje para Advertir al usuario si quiere salir de la aplicación: Agregue a un formulario un botón de comando (Command1) y escriba el siguiente código: Private Sub Command1_Click() Dim Respuesta Respuesta = MsgBox("¿Desea salir de la aplicación?", vbCritical _ + vbYesNo, "Cerrar") If Respuesta = vbYes Then Unload Me End If End Sub Ejecute la aplicación y haga clic sobre el botón de comando, se mostrará un mensaje como el siguiente: Presenta dos opciones Si o No, si presiona clic sobre Si, se sale del programa y si presiona el otro botón cierra el mensaje y continúa la aplicación. Por ser de muy fácil comprensión este programa no se incluye en la Sección Detallada de Programas.
62
Cajas de Entrada (InputBox): Las cajas de entrada InputBox, se utilizan también para dar mensajes, pero en este caso se introduce un dato que se guardará en una variable. Estos cuadros de diálogo tienen la siguiente forma: Variable = InputBox (Prompt, [Titulo], [PorDefecto]) Donde variable es el nombre de una variable a la que se le asignará el valor o cadena introducida en la caja de entrada, Prompt es el valor o cadena que presentará el mensaje al usuario, TÃ−tulo es opcional y presenta el tÃ−tulo de la caja de entrada, y PorDefecto también es opcional y es el valor o cadena que aparecerá por defecto en la caja de entrada, si se omite no aparecerá nada por defecto. En este caso el valor o cadena introducido en el InputBox se asignará a Variable y luego puede trabajar con este valor. Programa #22. InputBox: Agregue a un formulario un botón de comando (Command1), también agregue una etiqueta, escriba el siguiente código (puede copiar y pegar): Option Explicit Private Sub Command1_Click() Dim Respuesta As String, Suma As Integer Respuesta = InputBox("Introduzca un número", "Suma", 10) Suma = Respuesta + 25 Label1 = Suma End Sub En este caso cuando se presiona un clic sobre el botón de comando se desplega una caja de entrada como la siguiente: El valor que introduzca en la caja de entrada el programa sumará 25, sino agrega un valor y coloca una cadena de texto el programa generará un error. Este programa no se detalla en la Sección Detallada de Programas ya que es de fácil comprensión. 11. LOS MENà S: La Barras de Menú que aparecen en la mayorÃ−a de las aplicaciones son herramientas que nos permiten acceder a los comandos principales de la aplicación, estas barras de herramientas contienen los nombres de los comandos esquematizados y organizados de tal manera que se puede acceder a ellos de una manera muy rápida. VB 6.0, contiene un Editor de Menús que permite crear este tipo de barras y también puede crear menús contextuales que son los que aparecen, por ejemplo, al hacer clic con el botón secundario del mouse sobre un elemento. 63
El Editor de Menús aparece de la siguiente forma: El Editor de Menús se compone del Caption, que es la palabra que se va a mostrar al usuario, debajo de ella aparece la propiedad Name, que es el nombre con el cual se va a acceder o a llamar desde el código del programa. Otras propiedades que aparecen son: • Index (Matrices de menús) • Shorcut (Método abreviado) • Checked (Sómbolo de chequeo) • Enabled (Habilitar - desabilitar) • Visible (Mostrar u ocultar) • WindowList • NegotiatePosition El Editor de Menús posee una lista inferior que esquematiza todos los elementos creados en él. Las flechas que se encuentran inmediatamente arriba de la lista tienen distintas funciones cada una, las flechas hacia la izquierda y la derecha sirven para disminuir y aumentar las sangrÃ−as de los menús, respectivamente. Las flechas hacia arriba y hacia abajo sirve para mover un menú desde una posición inicial a una final (cambiar de posición). Las sangrÃ−as de los menús se utilizan para crear submenús, asÃ−, aquellos que aparecen sin sangrÃ−a son los menús principales que se muestran al usuario directamente en la Barra de Herramientas, los submenús primarios (una sangrÃ−a) son aquellos que se muestran directamente al hacer clic sobre el menú principal, si desea crear otros submenús se deberá colocar doble, triple u otras sangrÃ−as al submenú, dependiendo de cuantos submenús desea crear. La máxima cantidad de submenús que puede crear es cinco niveles. Las sangrÃ−as se identifican por tener cuatro puntos(....). La propiedad Index se utiliza para crear matrices de controles de menús, esto se hace con el objetivo de simplificar el código cuando los elementos de las matrices deben de utilizar el mismo código sólo variando por su número de Ã−ndice. También se pueden utilizar para crear un menú en tiempo de ejecución, aumentando la propiedad Index en uno. Programa #23. Matriz de Menús: El siguiente programa utiliza la propiedad index de los menús para crear una matriz de controles de menús. Para ello, vaya al Editor de Menús y siga los siguientes pasos: • Seleccione el formulario al que va a Editar el Menú con un clic. • En la Barra de Menú de VB 6.0, dirÃ−jase a Herramientas - Editor de Menús, o directamente presione la combinación de teclas Ctrl+E. • Escriba en el primer Caption la palabra &Archivo, en la propiedad Name escriba mnuArchivo, presione Enter para pasar al siguiente menú o haga clic sobre la el botón Siguiente. • Presione la flecha hacia la derecha para crear una sangrÃ−a. • Escriba en el Caption nuevo la palabra &Abrir, coloque como Name mnuSubArchivo, establezca la propiedad Index a cero. Coloque como Shortcut (Ctrl+O). Pase al siguiente submenú presionando la tecla Enter o haciendo clic en siguiente. • Escriba en el Caption actual la palabra &Guardar como..., el la propiedad Name escriba mnuSubArchivo y en la propiedad Index escriba uno (1). Establezca la propiedad Shortcut (Ctrl+G). Pase al siguiente submenú. 64
• Escriba en el nuevo Caption la palabra &Imprimir, propiedad Name mnuSubArchivo y la propiedad Index sea igual a dos (2). Cambie la propiedad Shorcut a (Ctrl+P). Haga clic en Aceptar • DirÃ−jase en la Barra de Menú de Visual Basic dirÃ−jase a Proyecto - Componentes, o directamente presione la combinación de teclas Ctrl+T • De la lista de elementos que se muestran seleccione la casilla de verificación de Microsoft Common Dialog Control 6.0. Haga clic en aplicar y luego en aceptar. • Agregue este control sobre el formulario de la misma manera que se agrega un control no se preocupe por el tamaño, este al igual que el control Timer tiene un tamaño predeterminado y no es visible en tiempo de ejecución. • Ahora dirÃ−jase a la Ventana Ver Código y escriba las siguientes instrucciones: Private Sub mnuSubArchivo_Click(Index As Integer) Select Case Index Case 0: CommonDialog1.ShowOpen Case 1: CommonDialog1.ShowSave Case 2: CommonDialog1.ShowPrinter End Select End Sub Ejecute la aplicación e interactúa con el programa, dirÃ−jase a cualquier submenú de Archivo y compruebe como se muestra cada Cuadro de diálogo de acuerdo con su nombre. Ejemplo Abrir desplega el cuadro de diálogo Abrir, Guardar como, desplega el cuadro de diálogo guardar e igualmente con imprimir. No borre todavÃ−a el programa ya que se seguirá utilizando para las explicaciones de las otras propiedades. Este programa no se detalla en la Sección Detallada de Programas ya que es de fácil comprensión. La Propiedad Shortcut se utiliza si quiere agregar un acceso directo, por ejemplo si elige la combinación Ctrl+O para un submenú (que es el caso del submenú Abrir), si se encuentra en cualquier lugar de la aplicación al presionar esta combinación de teclas se llama a las instrucciones que se encuentran dentro del evento clic del nombre de menú, de manera que no tendrá que dirigirse siempre a la Barra de Menú sino que conociendo la combinación de teclas se abrevia el tiempo de ejecución. Si se presiona Ctrl+O o Ctrl+G o Ctrl+P se llama al procedimiento de Abrir, Guardar, o imprimir respectivamente que son los nombres de los submenús. Si antepone el sÃ−mbolo & a la palabra caption de un menú principal, al presionar la combinación de teclas Alt+(Carácter subrayado), se genera el evento clic sobre el nombre del menú, si antepone este mismo sÃ−mbolo a un submenú, luego que se hace clic sobre el menú principal con presionar la tecla subrayada se genera el evento clic del submenú. Para el ejemplo del Programa #19, si se encuentra en el formulario, puede presionar la combinación de teclas Alt+A, se llama al Menú Archivo de la Barra de Menú, luego si se presiona la tecla A, G o I, se llamarán a los eventos clic de Abrir, Guardar o Imprimir, respectivamente. La Propiedad Checked que no fue utilizada en el programa pasado sirve para colocar un sÃ−mbolo de chequeo al lado del caption del submenú, tiene la siguiente forma: 65
De tal manera que se muestre que hay un elemento activo y uno inactivo, en el caso del ejemplo se supone que se pueden crear dos tipos de gráficos (logarÃ−tmico y semilogarÃ−tmico) y según se muestra actualmente se está utilizando el gráfico de tipo logarÃ−tmico. La propiedad Enabled se utiliza para habilitar o deshabilitar un menú o submenú, por ejemplo si un tipo de menú no aplica para las opciones que se pueden crear durante una aplicación se puede deshabilitar y de este modo no estarÃ−a disponible. Por ejemplo en Word cuando no se ha copiado nada al portapapeles la selección Pegar está deshabilitada ya que no se puede pegar hasta ese momento ningún elemento. Cuando se copia una selección al portapapeles se habilita de nuevo el submenú pegar para que esta opción pueda ser utilizada. La propiedad Visible - Menús emergentes: Los menús emergentes son muy utilizados en las aplicaciones de Windows. Para ello se utiliza la propiedad Visible de los menús y la instrucción PopupMenu. Los menús emergentes aparecen usualmente cuando se hace clic con el botón secundario sobre algún elemento de la aplicación. VB 6.0 contiene estas herramientas que pueden desplegar un menú flotante independiente de la barra de menús que presenta también opciones de ejecución. Programa #24. Menú Emergente: Este programa tiene la finalidad de presentar un menú emergente cuando se hace clic con el botón secundario del mouse sobre un control cuadro de imagen (PictureBox). Para ello, seleccione un formulario y dirÃ−jase al Editor de Menús. Llene el editor con los siguientes datos y propiedades: Caption: Dibujar Name: mnuDibujar Menú Principal Visible: Falso (desactive la casilla de verificación) Caption: Dibujar CÃ−rculo Primer Submenú (con una sangrÃ−a)
Name: mnuCirculo Visible: Verdadero Caption: Dibujar LÃ−nea
Segundo Submenú (con una sangrÃ−a)
Name: mnuLinea
Visible: Verdadero Luego vaya al formulario y agregue un PictureBox (de nombre Picture1), después escriba el siguiente código: Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) If Button = 2 Then 66
PopupMenu mnuDibujar End If End Sub Private Sub mnuCirculo_Click() Picture1.Circle (1000, 1000), 500, vbRed End Sub Private Sub mnuLinea_Click() Picture1.Line (1500, 1500)-(2000, 2000), vbBlue End Sub Ejecute la aplicación, presione el botón secundario del mouse sobre el control Picture1 y verifique que se desplega un menú emergente con las opciones Dibujar Circulo y Dibujar LÃ−nea, si hace clic en alguno de ellos se llamarán a las instrucciones correspondientes. Este programa aparece en la Sección Detallada de programas explicando algunas de sus instrucciones principales. • COLORES EN VISUAL BASIC: Los colores en VB 6.0 pueden ser trabajados o asignados de distintas formas: La principal es asignar un color de los valores predeterminados de VB, estos se pueden visualizar en el Examinador de Objetos mediante la palabra ColorConstants, estos son: • vbBlack (Negro) • vbBlue (Azul) • vbCyan (Aguamarina) • vbGreen (Verde) • vbMagenta (Fucsia) • vbRed (Rojo) • vbWhite (Blanco) • vbYellow (Amarillo) Pero si sólo se trabajara con estos colores se estarÃ−a muy limitado, por ello el lenguaje cuenta con una manera de colores personalizados, cuenta con la instrucción RGB. Esta función combina tres colores principales R (Rojo) G (Verde) y B (Azul) - por sus siglas en inglés (Red, Green Blue) - para crear colores personalizados, el valor de cada componente principal puede variarse desde el cero hasta el 255 generando mas de 16 millones de posibilidades de colores. La instrucción RGB tiene la siguiente forma: Variable = RGB(Red, Green, Blue)
67
Donde variable es el nombre de una variable que almacena un valor tipo Long (Numérico Entero de gran extensión) que devuelve la función RGB, red es el tinte del color rojo, green el tinte de color verde y Blue el tinte de color azul, como ya se ha dicho estos valores pueden estar entre 0 y 255. De esta manera la combinación RGB( 0, 0, 0) devuelve el color negro mientras que la combinación RGB (255, 255, 255) devuelve el color blanco. Programa #25. Colores mediante RGB: El siguiente programa combina tres barras de desplazamiento horizontal para generar cambios en los colores de la función RGB. Coloque tres barras de desplazamiento horizontal con las siguientes propiedades: Name: HScrollRed Primera Barra
Min=0 Max=255 Name: HScrollGreen
Segunda Barra
Min=0 Max=255 Name: HScrollBlue
Tercera Barra
Min=0 Max=255
Coloque cuatro Figuras (Shape) de la siguiente manera: • La primera de nombre ShpRed, arriba de la barra de desplazamiento HScrollRed. • La segunda de nombre ShpGreen, arriba de la barra de desplazamiento HScrollGreen. • La tercera de nombre ShpBlue, arriba de la barra de desplazamiento HscrollBlue. • La cuarta de tamaño un poco mas grande de nombre ShpGenerado, sola en la parte derecha del formulario. Cambie todas las propiedades de FillStyle de estos rectángulos a 0 - Sólido (0 - Solid) El formulario debe tener la siguiente apariencia: Ahora, se va agregar el siguiente código al formulario: Private Sub HScrollRed_Change() ShpRed.FillColor = RGB(HScrollRed.Value, 0, 0) ShpGenerado.FillColor = RGB(HScrollRed.Value, _ HScrollGreen.Value, HScrollBlue.Value) End Sub 68
Private Sub HScrollGreen_Change() ShpGreen.FillColor = RGB(0, HScrollGreen.Value, 0) ShpGenerado.FillColor = RGB(HScrollRed.Value, _ HScrollGreen.Value, HScrollBlue.Value) End Sub Private Sub HScrollBlue_Change() ShpBlue.FillColor = RGB(0, 0, HScrollBlue.Value) ShpGenerado.FillColor = RGB(HScrollRed.Value, _ HScrollGreen.Value, HScrollBlue.Value) End Sub Ejecute el programa. Puede ver las variaciones de los colores mientras cambia las posiciones de las barras de desplazamiento, tanto individualmente como el color generado por la combinación de los tres colores. 13. EL OBJETO COLLECTION: Este objeto se utiliza para agrupar datos como si fuera una lista pero en este caso cada elemento queda grabado en la memoria como una variable tipo Variant, por lo que cada elemento tiene una longitud de 16 bytes, sea cual sea el contenido que éste tenga. Por almacenar este tipo de datos, puede grabar entonces cualquier tipo de dato que puede almacenar una variable Variant, como lo son todos los objetos, matrices estándar y los tipos de datos excluyendo las estructuras. Para crear una nueva colección se usa la siguiente expresión: Dim/Private/Public NombreColección As New Collection El objeto Collection tiene los siguientes métodos y propiedades: Propiedad o Método Función Método Add Agrega un elemento a la colección Propiedad Count Devuelve el número de elementos de la colección Método item Devuelve un elemento de la colección Método Remove Elimina un elemento de la colección Para almacenar, recuperar o eliminar elementos de una colección se puede hacer mediante los Ã−ndices y las claves. Si se utiliza el número de Ã−ndice se hace del mismo modo que una lista pero a diferencia que los elementos de las colecciones comienzan enumeradas por uno y no por cero como es el caso de las listas y los cuadros combinados. Para el caso de las claves, éstos son datos tipo String (cadenas de texto) que se colocan como referencia para almacenar un elemento, de tal manera que si no conoce el número de Ã−ndice se recurre a la clave que debe ser diferente para cada elemento.
69
Para agregar un elemento a la colección se utiliza la siguiente expresión. NombreColección.Add Elemento[, Clave, Before, After] Donde NombreColección es el nombre de la colección, Elemento es el dato que se quiere grabar en la colección ya sea un valor, objeto o cadena de texto. La clave es un dato tipo String que sirve como guÃ−a para encontrar el dato, y Before y After se utilizan para agregar el dato en una posición determinada, por ejemplo: MiColeccion.Add "Pedro Fernández", "Pedro", before:=2 Agrega a la colección MiColeccion el elemento “Pedro Fernández” con clave “Pedro” en la posición número dos. Para eliminar un elemento de la colección se utiliza el método Remove de la siguiente forma: NombreColección.Remove Ã−ndice O bien NombreColección.Remove "Clave" De modo que para borrar el elemento “Pedro Fernández” de la colección se usarÃ−a: MiColección.Remove 1 En el caso que este elemento esté en la primera posición o más directamente con su clave: MiColección.Remove "Pedro" Para obtener un elemento de una colección se utiliza el método item, que tal como Remove puede colocarse tanto su Ã−ndice como su clave. Tiene la siguiente forma: [Set] Variable = NombreColección.Item(indice) o también [Set] Variable = NombreCColección.Item("Clave") Si se utilizaron números como claves, éstos deben ser convertidos mediante la instrucción CStr para ser usados en el método item o Remove, ya que si es un número entero la colección lo admite como un Ã−ndice. Como item es el método predeterminado del objeto Collection, en la codificación no es necesario hacer referencia a él, se puede simplificar de la siguiente manera: [Set] Variable = NombreColección(Ã−ndice) o también, [Set Variable = NombreColección(“Clave”)
70
14. PROGRAMAS DE Mà LTIPLES DOCUMENTOS (FORMULARIOS MDI) MDI es la abreviación de Interfaz de Múltiples Documentos por su siglas en inglés (Multiple Document Interface). Los programas con este tipo de interfaz permiten visualizar y trabajar con más de un documento (Formulario) al mismo tiempo, estos formularios se encuentran dentro de un formulario principal contenedor. Los programas Microsoft Word, Microsoft Excel son ejemplos de programas con interfaz de Múltiples documentos. Se pueden identificar por tener en la Barra de Menú la opción Ventana que permite desplazarse entre los distintos documentos abiertos hasta ese momento. Lo contrario de MDI es SDI (Single Document Interface) que son aplicaciones donde pueden existir varios formularios también, pero cada uno es individual y separado y no posee un formulario principal contenedor. Todos los formularios poseen una propiedad llamada MDIChild que es Falsa por defecto. Para el caso de las aplicaciones MDI, este valor debe ser cambiado a Verdadero (True). Pero antes, debe colocarse un formulario principal contenedor como un formulario MDI, de la siguiente manera: • Se debe dirigir a la Barra de Menú - Proyectos. • Agregar Formulario MDI • Agregar un menú hijo, cambiando la propiedad MDIChild de un formulario a Verdadero (True). Si no existe un Formulario MDI en la aplicación y algún formulario tiene la propiedad MDIChild establecida a Verdadero, al llamar al formulario se producirá un error. Al formulario principal contenedor que desde ahora llamaremos Formulario MDI, no se le pueden agregar todos los controles directamente, se puede el control PictureBox, que servirá para agregar controles sobre éste y permitir insertar botones de comandos y todos los demás controles. También puede agregar el control Timer y el control Data. El tamaño de los controles cuadro de imagen se adaptan automáticamente a la parte superior del formulario MDI, tomando todo el ancho del formulario, esto se hace con la intención de que funcione como una Barra de Herramientas. Cuando se establecen formularios MDI y secundarios (MDIChild) estos tienen caracterÃ−sticas muy particulares que pueden distinguirse. • Los formulario MDI en tiempo de diseño presenta una coloración mas oscura que los formularios estándar. Además en el Explorador de proyectos tienen una imagen que los distinguen, al igual que los formularios secundarios y estándar, como se puede observar en la figura siguiente: • Los formularios secundarios cuando se abren, su área de trabajo siempre estará regido por el área de trabajo del formulario MDI, al maximizar el formulario secundario este tomará el total del formulario MDI, y su tÃ−tulo se combinará con el tÃ−tulo del formulario MDI, además las barras de menús que tenga el formulario secundario se combinará con la barra de Menú del formulario MDI. • Al minimizar los formularios secundarios, éstos no se colocarán directamente en la barra de Tareas, más bien, se colocarán en la parte inferior del formulario MDI. Programa #26. Programa MDI: Para la creación de un programa con múltiples documentos siga los siguientes pasos: 71
• Cree un proyecto Nuevo, en el formulario principal (Form1) establezca su propiedad MDIChild a Verdadero, cambie el Caption a Documento 1. • Agregue un formulario MDI, en el menú Proyecto - Agregar Formulario MDI. • Agregue un control cuadro de imagen (PictureBox) con propiedad Height = 375. • Agregue un botón de comando (Command1) al control cuadro de imagen insertado en el paso anterior, de tamaño cuyo alto se adapte al tamaño del control cuadro de imagen y el ancho sea de 375. Borre el contenido de la propiedad Caption. Luego, cambie su propiedad Picture, buscando la imagen en la carpeta: “C:\Archivos de Programas\Microsoft Visual Studio\Common\Graphics\Bitmaps\TlBr_W95\New.bmp” Establezca la propiedad Style del botón de comando a 1 - Graphical. Se mostrará la imagen del comando Nuevo, en el botón de comando. Si no se encuentra la imagen y la carpeta puede grabarlos en el computador desde la instalación de Visual Basic o Visual Studio 6.0. • Agregue dos botones de comando comando (Command2 y Command3) del mismo tamaño que Command1, puede colocar como sugerencia en Caption C2 y C3. O deje tal cual está. • DirÃ−jase al formulario Form1, y agregue un control cuadro de imagen (Picture1). Cambie la propiedad BackColor a Blanco. Y además establezca las propiedades Left y Top a cero. En este formulario agregue el siguiente código: Private Sub Form_Resize() Picture1.Height = ScaleHeight Picture1.Width = ScaleWidth End Sub • En el Formulario MDI agregue el siguiente código: Option Explicit Dim Contador As Integer Private Sub MDIForm_Activate() Contador = 1 End Sub Private Sub Command1_Click() Dim Formulario As New Form1 Contador = Contador + 1 Formulario.Show Formulario.Caption = "Documento " & Contador End Sub 72
Private Sub Command2_Click() ActiveForm.Picture1.Circle (500, 500), 300, , , , 2 / 3 End Sub Private Sub Command3_Click() ActiveForm.Picture1.Refresh End Sub Para probar este programa ejecútelo, maximice la ventana MDI, es decir la ventana superior, presione el botón Command1 (el que tiene la imagen Nuevo) se creará un nuevo Documento (Documento 2), coloque los dos de tal manera que sean totalmente visibles ambos, que no se superponga uno del otro, presione el segundo botón de comando se dibujará una elipse en el formulario activo, esto sucede debido a la sentencia ActiveForm que detecta el formulario activo y trabaja sobre el de acuerdo a la instrucción. Igualmente sucede con el tercer botón de comando, pero en este caso borra el contenido de la imagen. Otros detalles del programa pueden verse en la Sección Detallada de Programas. 15. TRABAJO CON FICHEROS: Muchas veces necesitamos guardar la información de aplicaciones en un dispositivo, ya sea disco duro, disquete u otro dispositivo de almacenamiento, para cargarlo posteriormente y continuar introduciendo datos sobre estos archivos ya establecidos. Para esto Visual Basic posee una herramienta de trabajo que permite almacenas en ficheros la información que el programador especifique. En Windows y en Visual Basic 6.0 existen dos tipos de ficheros: • Ficheros Ascii • Ficheros Binarios. Los primeros almacenan la información de acuerdo al código ASCII que pueden ser leÃ−dos por programas como el Bloc de Notas (NotePad). Generalmente tienen extensión *.txt (archivos de texto) o *.bat. Existen otros archivos que también guardan la información como archivos ASCII, como son *.c (archivos de lenguaje de programación C), *.cpp (Archivos de lenguajes de programación C++), *.java (archivos de lenguaje de programación JAVA) o *.m (Archivos de programas de Matlab). Los ficheros binarios son ficheros que devuelven la información tal como se encuentran en la memoria. à stos no son legibles por el bloc de notas y tampoco directamente por el usuario. Ocupan menos espacios de memoria y pueden ser fácilmente cambiados a formato ASCII al escribirlos y al leerlos. El Acceso de un fichero puede ser de alguno de estos tres tipos: • Acceso Secuencial: Leen y escriben los datos secuencialmente, es decir, uno tras otro y no hay posibilidad de volver atrás, el acceso secuencia sólo aplica a ficheros Ascii y por lo tanto pueden ser leÃ−dos por el bloc de notas (NotePad). Este tipo de acceso tiene tres formas de apertura, una para sólo lectura (Input), y dos para escritura (Output y Append).
73
• Acceso Aleatorio: Estos ficheros están formados por registros del mismo tamaño en bytes, por lo tanto permiten acceder a alguno de ellos sin necesidad de para por todos los anteriores. Es muy importante resaltar que cada registro debe tener el mismo tamaño en bytes, para que asÃ− se pueda acceder a un registro especÃ−fico por su ubicación en la memoria. La única forma de apertura es Random que sirve tanto para lectura como para escritura de datos. Este tipo de acceso almacena la información tal como se encuentra en la memoria. • Acceso binario: Son semejantes al acceso aleatorio pero en caso el acceso no esta basada en registros sino en cada byte. Para trabajar con ficheros deben respetarse los siguientes pasos mediante el código: • Apertura del fichero • Leer o escribir datos • Cerrar el fichero Apertura de un fichero. Para abrir un fichero se utiliza la sentencia Open. Ella debe especificar el tipo de acceso que se desea. La instrucción general para abrir un fichero es la siguiente: Open Archivo For tAcceso As #Número [Len = Tamaño] Donde Open da la orden de apertura, Archivo es una cadena de texto que devuelve la ruta y el nombre del fichero o archivo que se va a abrir, tAcceso es el tipo de acceso de acuerdo a los tres tipos de acceso que se explicaron anteriormente (Input, Output, Append, Random o Binary), Número es un número entero positivo (o variable que devuelve un número entero positivo) que definirá el número del fichero. La sentencia [Len = Tamaño] aplica sólo a ficheros de Acceso aleatorio, donde tamaño define el tamaño en bytes de cada registro. La apertura de un fichero nos permite escribir o leer datos en el mismo. No puede haber ficheros distintos abiertos con el mismo número. Para ello VB 6.0 dispone de una función llamada FreeFile que devuelve un número entero que no ha sido utilizado por ningún fichero. Ficheros de Acceso Secuencial: Si en un fichero de acceso secuencial se utiliza Input para abrir un fichero que no existe, el programa producirá un error. Si se utiliza el tipo de acceso Output a un fichero que no existe, se creará uno nuevo, si ya existÃ−a borra su contenido para empezar desde el comienzo, si desea conservar el contenido del fichero utilice el tipo de acceso Append. • Leer o escribir datos en un fichero secuencial: PARA LECTURA: Sentencia Input: Para leer y guardar el conjunto de caracteres escritos en una lÃ−nea de un archivo de texto se puede utilizar la sentencia Input de la siguiente manera:
74
Input #Número, Variable1, Variable2, Variable3 ... Donde Número, hace referencia al número con el cual el fichero fue abierto y las variables 1, 2, 3, ... son los nombres de las variables que almacenarán las distintas lÃ−neas de escritura del archivo o fichero abierto. Programa #27. Sentencia Input: AsÃ− por ejemplo si tenemos un programa con un botón de comando (Command1), una etiqueta (Label1) que tenga un ancho (Propiedad Width) de mediana longitud y un control de cuadros de diálogos comunes (CommonDialog1) y además tenemos el siguiente código: Option Explicit Private Sub Command1_Click() On Error GoTo Mensaje Dim Archivo As String, Linea1 As String Dim Linea2 As String, Linea3 As String CommonDialog1.ShowOpen Archivo = CommonDialog1.FileName Open Archivo For Input As #1 Input #1, Linea1, Linea2, Linea3 Label1.Caption = Linea1 & Chr(13) & Linea2 & Chr(13) & Linea3 Exit Sub Mensaje: Select Case Err Case 62: MsgBox "El archivo no tiene tres lÃ−neas" & Chr(13) & "Elija un Archivo con tres o más lÃ−neas", vbExclamation, "Error" Case 75: Exit Sub Case Else: MsgBox "Error " & Err.Number & " " & Err.Description End Select End Sub Cuando presiona el botón de comando, puede elegir un archivo de texto (*.txt) que tenga tres o más de lÃ−neas (si lo elige de menos lÃ−neas se mostrará un mensaje de error). La variable Linea1 almacenará los caracteres de la primera lÃ−nea y asÃ− sucesivamente llegar hasta la tercera lÃ−nea, estas variables serán mostradas en la etiqueta 1. 75
Como ya la mayorÃ−a de los comandos han sido explicados en la Sección Detallada de Programas en otros programas, este programa no aparece en dicha sección. Puede introducir valores numéricos en el archivo de texto y luego mediante la instrucción de conversión a numérico (sea CDbl, CSgl u otra) puede operar matemáticamente con ellos. Por ejemplo, si se introduce en la primera lÃ−nea el valor numérico 100, en la segunda 100 y en la tercera 120 y además se cambia la lÃ−nea de comando del programa: Label1.Caption = Linea1 & Chr(13) & Linea2 & Chr(13) & Linea3 Por la siguiente lÃ−nea Label1.Caption = CDbl(Linea1)+CDbl(Linea2)+CDbl(Linea3) Al presionar el botón de comando y abrir el archivo con los valores guardados anteriormente la etiqueta devolverá 320, que es el valor de la suma de los tres valores. Sentencia Line Input: La forma general de la función Line Input es: Line Input #Número, Variable1 Line Input #Número, Variable2 ... Donde Variable1 almacena los caracteres existentes en la primera lÃ−nea del fichero, Variable2 la segunda lÃ−nea y asÃ− sucesivamente tantas veces como tantas lÃ−neas crea necesario. La función Line Input también lee una lÃ−nea completa hasta llegar al retorno de carro o un retorno de carro mas avance de lÃ−nea - Chr(13) y Chr(10) respectivamente -. Hasta ahora no he podido distinguir la diferencia entre esta función y la anterior Input , la única diferencia que mi experiencia me ha dado es que para Line Input necesito escribir más código para asignar cada lÃ−nea a cada variable. Función Input: La función Input tiene la siguiente forma general: Variable = Input(nCaracteres, #Número) Donde Variable es una variable que almacena los caracteres indicados por nCaracteres, por ejemplo la siguiente sentencia: Variable = Input(10, #1) Almacena en Variable los primeros 10 caracteres del fichero abierto mediante la asignación número 1. Si se desea que la variable almacene todos los caracteres de un fichero o archivo se puede utilizar la siguiente instrucción: Variable = Input(LOF(Número), #Número) 76
Ya que LOF devuelve el número total de bytes o caracteres que contiene un fichero. PARA ESCRITURA: Las sentencias de escritura sólo se pueden utilizar en ficheros secuenciales que fueron abiertos mediante el tipo de acceso Output o Append. Sentencia Print: La sentencia Print tiene la siguiente forma: Print #Número, [Spc(n)];[Tab(n)];Variable1; Variable2; Variable3;... Donde Número es el valor numérico del fichero abierto donde se desea escribir, Variable1, 2, 3..., son las variables que se van a agregar al fichero o archivo abierto. Las sentencias opcionales son Spc(n) que indica si desea dejar un número de espacios (indicados por n) al comenzar a escribir, o un número de tabulaciones (indicados por n) al comenzar de escribir en la lÃ−nea. Por ejemplo las siguientes lÃ−neas de comando: Option Explicit Private Sub Command1_Click() Dim Variable1 As String, Variable2 As String Open "C:\Fichero.txt" For Output As #1 Variable1 = "Primera Cadena" Variable2 = "Segunda Cadena" Print #1, Spc(5); “Variables = ”Variable1;”, ”; Variable2 End Sub Cuando ejecuta el programa y hace clic en Command1 aparentemente no pasa nada, pero se ha creado un nuevo archivo (llamado Fichero) en la unidad C: (Disco Duro) donde se escribe, primero dejando cinco espacios en blanco: Variables = Primera Cadena, Segunda Cadena Salga del programa, busque el archivo fichero en C: con el Explorador de Windows y verifique. Como ya se explicó anteriormente, el archivo fue abierto mediante el tipo de acceso Output, esto hace que se cree el archivo si no existe y además si existe borra el contenido del fichero, para conservar el contenido del archivo de texto y escribir al final debe sustituirse la palabra Output por Append en el programa. Sentencia Write: La sentencia Write tiene la siguiente forma general:
77
Write #Número, Variable1; Variable2; Variable3... Una diferencia relevante que tiene esta sentencia con respecto a la sentencia Print, es que ésta separa las variables en el fichero por comas, además encierra entre comillas las cadenas de texto, entre numerales (#) los valores de fechas y boolean , y agrega al final de la lÃ−nea un retorno de carro + avance de lÃ−nea, constantes de VB 6.0 Chr(13) y Chr(10) respectivamente. Por lo tanto, si escribe otra sentencia Write debajo, se escribirá en la siguiente lÃ−nea del fichero. Por ejemplo: Private Sub Command1_Click() Open "C:\Fichero.txt" For Output As #1 Write #1, "Saludos" Write #1, "Hoy es"; Date Write #1, "La Hora es"; Hour(Time) & ":" & Minute(Time) End Sub Al abrir el archivo Fichero en la unidad C: este mostrará un archivo como el siguiente: Escribiendo al lado de “Hoy es” la fecha actual y al lado de “La hora es” la hora actual. Fichero de Acceso Aleatorio: Los ficheros de acceso aleatorio son una modalidad de ficheros binarios, es decir, poseen la información tal como se encuentra en la memoria, se caracteriza por tener registros que deben tener el mismo tamaño en bytes, aunque parezca una desventaja, se hace con la finalidad de encontrar un registro de los almacenados de acuerdo al número de bytes de los registros, por ejemplo, si cada registro del fichero tiene un tamaño fijo de 12 bytes, para encontrar el primer registro el programa se traslada al byte número 1, para el segundo registro al byte número 13 y asÃ− sucesivamente, hasta llegar al registro deseado. El tipo de Acceso es Random, que sirve tanto para lectura como para escritura, además al final de la sentencia Open debe agregarse el tamaño de registro Len = especificando el tamaño de cada registro en bytes, de la siguiente manera: Open Archivo For Random As #Número Len = Bytes Donde Archivo es una cadena de texto que debe tener la ruta y el nombre del archivo o fichero que se va a abrir, Número es el valor numérico entero que se asigna al fichero y Bytes es el tamaño de cada registro en bytes. Los ficheros de acceso aleatorios pueden grabar información de tal manera que puede crear una base de datos que puede ser almacenada en un dispositivo de memoria (disco duro, disquete, etc) para operar con los registros posteriormente. La desventaja que hasta ahora presenta VB 6.0 es que no posee sentencias para eliminar registros de este tipo de fichero. Esperemos que las versiones posteriores posean dichas funciones. PARA LECTURA: 78
Sentencia Get: La sentencia Get se utiliza para leer u obtener registros almacenados en el fichero, tiene la siguiente forma general: Get #Número, Registro, Variable Donde Número es el número que se asignó al fichero de donde se quiere obtener información, Registro es un número natural que indica el número de registro y Variable es la variable que almacena el valor que se encuentra grabado en la memoria. Variable puede ser un tipo de dato, un objeto (Object) o una estructura (Type). PARA ESCRITURA: Sentencia Put: La sentencia Put tiene una forma similar a la sentencia Get, se generaliza como: Put #Número, Registro, Variable Donde Número es el número de fichero donde quiere escribirse, Registro es un número natural que contiene el número de registro y Variable es la variable que contiene el valor, cadena, objeto o estructura que se escribirá. Si se da un valor de registro que ya estaba en lista, se rescribirá su valor, se borrará el registro anterior. Por lo tanto esta sentencia sirve tanto para escribir como para reemplazar. Eliminar registros de un fichero con Acceso Aleatorio: Aunque no existe un método para eliminar registros, se puede seguir un conjunto de pasos que permiten eliminarlos, estos son: • Abrir un archivo o fichero de acceso aleatorio provisional. El Archivo original queda hasta ahora intacto. • Pasar los registros que no serán borrados al fichero provisional. • Cerrar el fichero de original mediante la sentencia Close #Número. • Borrar de la memoria el archivo original mediante la instrucción Kill(Archivo). • Abrir de nuevo el archivo original con tipo de acceso aleatorio. • Devolver los registros. • Cerrar el archivo provisional. • Borrar de la memoria el archivo provisional con la instrucción Kill(Provisional). Este atento a que el archivo provisional no tome el nombre de un archivo existente, de ser asÃ− el archivo será borrado. En el siguiente programa se utiliza el siguiente procedimiento para eliminar registros. Programa #28. Extensión del Programa #7 - Coordenadas: El siguiente programa es una extensión del programa #7 que se planteaba usar el control ListBox (Cuadro de lista) para agregar valores de coordenadas X e Y. Ahora con el trabajo de los ficheros nos ofrecen la posibilidad de guardar estos valores en archivos que puedo utilizar posteriormente, agregando o eliminando valores. Agregue un control Common Dialog Control 6.0 (cuadros de diálogos comunes encontrado en la sección de Componentes del menú Proyecto o presione la combinación Ctrl+T), el nombre de este control será el 79
que viene por defecto (CommonDialog1) Además, agregue tres botones adicionales a los que contiene el formulario con los nombres cmdNuevo, cmdAbrir, cmdCerrar. Agregue el siguiente código, ademas del que ya aparece: Private Sub cmdNuevo_Click() Dim Nuevo As String Nuevo = InputBox("Introduzca un nombre de Archivo", "Nuevo") Archivo = CStr("C:\" + Nuevo + ".dat") Open Archivo For Random As #1 Len = 4 If LOF(1) > 0 Then For Registro = 1 To LOF(1) / 4 Get #1, Registro, Punto lstPuntos.AddItem "(" & Punto.X & "," & Punto.Y & ")" Monitor.Circle (Punto.X, Punto.Y), 30, vbRed Next Registro End If txtX.SetFocus End Sub Private Sub cmdAbrir_Click() CommonDialog1.Filter = "Archivos *.Dat|*.dat" CommonDialog1.ShowOpen Archivo = CommonDialog1.FileName Open Archivo For Random As #1 Len = 4 For Registro = 1 To LOF(1) / 4 Get #1, Registro, Punto lstPuntos.AddItem "(" & Punto.X & "," & Punto.Y & ")" Monitor.Circle (Punto.X, Punto.Y), 30, vbRed 80
Next Registro txtX.SetFocus End Sub Private Sub cmdCerrar_Click() Close #1 lstPuntos.Clear Monitor.Refresh End Sub `Ojo: AHORA, CAMBIE EL CONTENIDO DE LOS SIGUIENTES EVENTOS: Private Sub cmdIngresar_Click() Punto.X = CInt(txtX) Punto.Y = CInt(txtY) Monitor.Circle (Punto.X, Punto.Y), 30, vbRed lstPuntos.AddItem "(" & Punto.X & "," & Punto.Y & ")" Registro = LOF(1) / 4 + 1 Put #1, Registro, Punto txtX = "" txtY = "" txtX.SetFocus End Sub Private Sub cmdEliminar_Click() Dim RegEliminar As Integer RegEliminar = lstPuntos.ListIndex + 1 Open "C:\Provisional123.dat" For Random As #2 Len = 4 For Registro = 1 To LOF(1) / 4 - 1 If Registro >= RegEliminar Then
81
Get #1, Registro + 1, Punto Put #2, Registro, Punto Else Get #1, Registro, Punto Put #2, Registro, Punto End If Next Registro Close #1 Kill (Archivo) lstPuntos.Clear Monitor.Refresh Open Archivo For Random As #1 Len = 4 For Registro = 1 To LOF(2) / 4 Get #2, Registro, Punto Put #1, Registro, Punto lstPuntos.AddItem "(" & Punto.X & "," & Punto.Y & ")" Monitor.Circle (Punto.X, Punto.Y), 30, vbRed Next Registro Close #2 Kill ("C:\Provisional123.dat") End Sub Además agregue un módulo estándar (El módulo estándar se agregar mediante la barra de Menú en Proyecto - Agregar Módulo) y en él agregue el siguiente código: Public Type Puntos X As Integer Y As Integer End Type 82
En la sección de declaraciones del formulario donde aparece Option Explicit agregue debajo: Dim Punto As Puntos, Registro As Integer, Archivo As String Ejecute el formulario, haga clic sobre el botón cmdNuevo y establezca un nombre para el archivo nuevo, agregue valores de coordenadas y estos se irán grabando en el disco duro en un archivo cuyo nombre usted estableció. Para cerrar el fichero presione el botón con el nombre cmdCerrar, si intenta abrir un archivo o crear un archivo nuevo y está abierto otro fichero el programa generará un error. Puede borrar puntos de coordenadas mediante el botón cmdEliminar, en este caso (a diferencia del programa #7 que borraba sólo el dato de la lista) el programa nuevo borra el punto de la lista y del cuadro de imagen. Si desea tener una explicación detallada sobre la codificación de este pasado programa puede dirigirse a Sección Detallada de Programas al final de este trabajo de investigación. Fichero de Acceso Binario: Como ya se ha dicho este tipo de fichero es muy parecido al fichero de acceso aleatorio devuelve la información tal como se encuentra en la memoria, por lo tanto no pueden ser leÃ−dos por el bloc de notas, la diferencia radica en que estos no almacenan la información a través de registros sino por cada byte. La forma general para abrir un fichero con acceso binario es: Open Archivo For Binary As #Número Donde Archivo es una cadena de texto que indica el nombre y la ruta del fichero y Número es el número que se asigna al fichero. Por ejemplo: Dim ByteDiez As String Archivo = "C:\Fichero.dat" Open Archivo For Binary As #1 Get #1, 10, ByteDiez ByteDiez=R Put #1, 10, ByteDiez Close #1 En este caso se abre un fichero, se lee el décimo byte y se le asigna a la variable ByteDiez, luego se cambia la variable a r y se escribe en esa misma posición la variable. Cierre de Fichero: Tanto los ficheros de acceso secuencial, los de acceso aleatorio y binarios se cierran de la misma manera, se 83
utiliza la siguiente sintaxis: Close #Número Donde Número es el número de fichero que se desea cerrar, si se omite se cierran todos los ficheros, también se puede utilizar el método Reset para cerrar todos los ficheros. Otras funciones de Ficheros: Para ubicar otras funciones de ficheros puede dirigirse al Examinador de Objetos y escribir (en buscar) la palabra FileSystem. 16. IMPRIMIR TEXTO E IMÔGENES: Para imprimir texto e imágenes se utiliza el objeto Printer, que como todos los objetos posee propiedades y métodos. El objeto printer posee una colección que contiene todas las impresoras instaladas en el computador, para acceder a ella se pueden utilizar las siguientes lÃ−neas de comando: Agregue un cuadro combinado (ComboBox) de nombre Combo1a un formulario y escriba el siguiente código: Private Sub Form_Load() Dim Impresora As Printer For Each Impresora In Printers Combo1.AddItem Impresora.DeviceName Next End Sub Al ejecutar el programa el cuadro combinado contiene todas las impresoras instaladas en su computador. Para colocar una impresora como impresora predeterminada se utiliza la instrucción: Set Printer = Printers(Ã−ndice) Donde Ã−ndice indica el número de la lista de la impresora. Las impresoras están enumeradas desde cero hasta Printer.Count - 1. Para conocer el número de Ã−ndice utilice la siguiente sintaxis: Private Sub Form_Load() Dim Indice As Integer For Indice = 0 To Printers.Count - 1 Combo1.AddItem Indice & " - " & Printer.DeviceName
84
Next End Sub En este caso al cargar el formulario, el cuadro combinado contendrá el Ã−ndice de la impresora al lado de su nombre de identificación. Para imprimir texto mediante el objeto Printer se utiliza el método Print de la siguiente manera: Printer.Print Texto Donde texto contiene la cadena de caracteres que se desea imprimir, se puede llamar al contenido de una caja de texto (TextBox) si se coloca su nombre, de la siguiente manera: Printer.Print Text1.Text Para imprimir imágenes de debe llamar mediante la sentencia: Printer.PaintPicture LoadPicture (Ruta), DistanciaX, DistanciaY Donde Ruta es una cadena de texto que contiene la ruta y el nombre de la imagen que se desea imprimir, DistanciaX es la distancia en puntos que existe entre el margen izquierdo del papel y la ubicación donde se desea imprimir la imagen y DistanciaY la distancia entre el margen superior y la ubicación donde se desea imprimir la imagen. Además de poder imprimir texto e imágenes, el objeto printer soporta los métodos gráficos explicados en el control PictureBox (Circle, Line, CurrentX, CurrentY), puede imprimir, cÃ−rculos, arcos, elipses, cuadrados, rectángulos, etc. Pero en este caso hay que resaltar que la impresora generalmente tiene más resolución que el monitor y por lo tanto al utilizar un método gráfico con el objeto Printer debe tomar en cuenta que los puntos por pulgadas de la impresora son mucho mayor a los puntos por pulgada del monitor. Al momento de imprimir se observan éstos más pequeños. Programa #29. Objeto Printer: Para la realización de este programa sólo es necesario agregar un botón de comando (Commnad1) y un cuadro de texto (Text1) a un formulario, agregue después el siguiente código: Private Sub Command1_Click() If Text1.Text <> "" Then Printer.CurrentX = 15 Printer.CurrentY = 20 Printer.FontName = "Times New Roman" Printer.FontSize = 13 Printer.Print Text1.Text Printer.PaintPicture LoadPicture _ 85
("C:\Windows\Aros.bmp"), Printer.ScaleWidth / 2, 20 Printer.Circle (2000, 2000), 1000, vbRed Printer.Line (0, 1500)-(800, 500), vbBlack Printer.CurrentX = Printer.ScaleWidth / 2 - 300 Printer.CurrentY = Printer.ScaleHeight - 500 Printer.Print "Página " & Printer.Page Printer.EndDoc Else MsgBox "No hay texto para imprimir", vbExclamation, "Texto vacÃ−o" End If End Sub Ejecute el programa, escriba sobre el cuadro de texto y luego presione el botón de comando para enviar a imprimir. En el programa anterior se utiliza el método EndDoc del objeto Printer para enviar el documento a la impresora, este método da fin a la inclusión de elementos y da comienzo a la impresión. Existen otros métodos muy útiles, uno de ellos es NewPage, que continúa el trabajo de impresión en una nueva página y el método KillDoc que cancela el trabajo de impresión. Existe una enumeración en VB 6.0 llamada PrinterObjectConstants que puede verse desde el examinador de objetos, ella contiene las distintas constantes que pueden establecerse a las propiedades en un trabajo de impresión. Definen el tipo de papel a usar, orientación del mismo, color y calidad de la impresión y otras propiedades. 17. EL PORTAPAPELES: El portapapeles de Windows puede llamarse mediante la palabra Clipboard. Permite unas de las acciones mas comunes usadas bajo ambiente Windows: copiar, cortar y pegar. Este objeto no posee propiedades ni eventos, sólo contiene seis métodos que sirven para colocar, obtener, verificar el formato o borrar el contenido de él. Existen dos métodos que sirven para trabajar con texto: SetText y GetText; que coloca información o obtiene cadenas de texto del portapapeles respectivamente. Otros dos métodos que funcionan de la misma manera pero para gráficos, son: SetData y GetData. El método GetFormat devuelve un valor booleano que indica si un elemento del portapapeles se ajusta a un formato determinado y el método Clear se utiliza para eliminar o vaciar la información del portapapeles, tanto para texto como para gráficos. El portapapeles puede contener dos elementos siempre y cuando no tengan el mismo formato, es decir, si pega una imagen al portapapeles y luego un texto, permanecen los dos elementos contenidos en el mismo. Pero si coloca un texto, y posteriormente otro texto se elimina el primero para colocar el segundo. 86
Detalles de los métodos: Método SetText: Como ya se ha mencionado el método SetText del objeto Clipboard se utiliza para colocar una cadena de texto en el portapapeles, lo que corresponde a la acción de Windows Copiar, se utiliza la siguiente sintaxis: Clipboard.SetText Texto [, Formato] Donde Texto es la cadena de texto que se va a colocar en el portapapeles. Puede ser alguna variable o un objeto que contenga una cadena de texto (por ejemplo el contenido de la propiedad caption de una etiqueta). Formato es opcional y se refiere a algunos de los formatos que pueden ser reconocidos, para cadenas de texto los formatos pueden ser: Formato Valor Numérico Descripción vbCFText 1 (Predeterminado) Texto vbCFLink -16640 Información de conversación DDE vbCFRTF -16639 Formato de texto enriquecido También puede copiar un fragmento de un cuadro de texto en el portapapeles si utiliza la propiedad SelText de los mismos. Por ejemplo si utiliza la instrucción: Clipboard.SetText Text1.SelText Copia en el portapapeles la cadena de texto seleccionada en el cuadro de Texto (Text1). Método GetText: Este método se utiliza para devolver el contenido grabado en el portapapeles, lo que corresponde a la acción de Windows Pegar, se utiliza la siguiente sintaxis: Clipboard.GetText([Formato]) Donde Formato también es opcional y se refiere a los formatos de textos descritos en la parte anterior. Si el formato escrito en el método GetText no coincide con el que está grabado en el portapapeles, se devuelve una cadena vacÃ−a. Método SetData: Este método se utiliza para colocar una imagen o gráfico en el portapapeles, también corresponde a la acción de copiar, pero en este caso como ya fue mencionado es para imágenes y gráficos, tiene la siguiente forma: Clipboard.SetData FuenteImagen[, Formato] Donde FuenteImagen es la imagen que se desea colocar en el portapapeles, puede ser una imagen contenida en un cuadro de imagen si utiliza la propiedad Image de los PictureBox (no la propiedad Picture), o puede colocar alguna imagen contenida en el disco duro si agrega LoadPicture como se indica a continuación: Clipboard.SetData LoadPicture(Ruta)[, Formato] 87
Donde Ruta define la ruta y el nombre de la imagen que desea pegar en el portapapeles, los formatos aceptados para imágenes son las siguientes: Formato Valor Numérico vbCFBitmap 2 vbCFMetafile 3 vbCFDIB 8 vbCFPalette 9 Método GetData:
Descripción Imagen de Mapa de Bits (BMP) Metarchivo (WMF) Imagen de mapa de bits independiente (DIB) Paleta de colores
Se utiliza para pegar imágenes llamadas desde el portapapeles, tiene la siguiente forma: Clipboard.GetData ([Formato]) Como en todos los casos formato es opcional, puede tomar cualquiera de los valores o constantes descritos en el punto anterior, de colocarse debe ir entre paréntesis y si se omite, el portapapeles alige el formato apropiado con el que fue grabado. Método GetFormat: Este método se utiliza para verificar el formato del texto o imagen contenida en el portapapeles. Sólo puede ser verdadero (True) o falso (False), que corresponde al si o no el contenido del portapapeles cumple con un formato especÃ−fico tanto para texto como para imágenes, tiene la siguiente forma: VariableBool=Clipboard.GetFormat(Formato) En este caso el formato si es requerido colocarlo, puede tomar cualquiera de los formatos especificados en SetText y SetData, la VariableBool almacena Verdadero o Falso dependiendo de la correspondencia del contenido del portapapeles con el formato. Es muy importante resaltar que algunas imágenes cumplen en algunas ocasiones con más de un formato de imagen. Es decir, una sola imagen puede cumplir con el formato vbCFBitmap y a la vez el formato vbCFDIB. Método Clear: Borra el contenido del portapapeles, si el portapapeles contiene texto e imágenes se borran ambos. Es muy utilizado muy a menudo antes de colocar algún contenido al portapapeles, sin embargo, como se puede colocar simultáneamente texto e imágenes puede omitirse para agregar alguno de ellos sin borrar el contenido anterior. Pero, si sólo se está trabajando con un formato (sólo texto o sólo imagen) es recomendable vaciar el contenido del portapapeles antes de colocar un nuevo elemento. Este método tiene la siguiente forma: Clipboard.Clear Programa #30. Clipboard: Realice un formulario como se ve a continuación: Este formulario cuenta con los siguientes controles:
88
Picture1: PictureBox que contiene una imagen (cualquiera) desde la propiedad Picture. En este caso se visualiza la imagen de una computadora (carpeta de imágenes de Ã−conos) Picture2: PictureBox que tienes las propiedades Height y Width iguales a Picture1 y no contiene ninguna imagen. Se encuentra debajo de Picture1. Text1: TextBox donde fue borrado la propiedad Text, se encuentra en l aparte superior derecha. Label1: Etiqueta donde se encuentra escrito en la porpiedad Caption: Esta es una cadena de texto. Command1: CommandButton con caption: Copiar Texto Command2: CommandButton con Caption: Copiar Imagen Command3: CommandButton con Caption: Pegar Texto Command4: CommandButton con Caption: Pegar Imagen Command5: CommandButton con Caption: Contenido Portapapeles Command6: CommandButton con Caption: Limpiar Todo Label2: Etiqueta ubicada en la parte inferior. Propiedad Caption: Cadena VacÃ−a (“”). Coloque el siguiente código, puede copiar y pegar: Option Explicit Private Sub Command1_Click() Clipboard.SetText Label1.Caption End Sub Private Sub Command2_Click() Clipboard.SetData Picture1.Image End Sub Private Sub Command3_Click() Text1.Text = Clipboard.GetText() End Sub Private Sub Command4_Click() Picture2.Picture = Clipboard.GetData() End Sub
89
Private Sub Command5_Click() Dim Formato As Byte, Mensaje As String If Clipboard.GetFormat(vbCFText) Then Formato = Formato + 1 End If If Clipboard.GetFormat(vbCFBitmap) Then Formato = Formato + 2 End If Select Case Formato Case 0: Mensaje = "El Portapapeles está vacÃ−o" Case 1: Mensaje = "El Portapapeles contiene sólo texto" Case 2: Mensaje = "El Portapapeles contiene sólo una imagen" Case 3: Mensaje = "El Portapapeles contiene una imagen y un texto" End Select Label2.Caption = Mensaje End Sub Private Sub Command6_Click() Clipboard.Clear Text1.Text = "" Picture2.Picture = LoadPicture Command5_Click End Sub Ejecute la aplicación e interactúe con la misma, puede copiar texto (Caption de Label1) o imagen (imagen de Picture1), y colocarlo en otros controles. Puede verificar el contenido del portapapeles o borrar para comenzar de nuevo. Verificar el tipo de control activo para colocar un elemento al portapapeles: Puede que quiera en algunas ocasiones llevar al portapapeles un elemento, pero que el programa verifique el tipo de control activo, para colocar en el portapapeles una imagen o un texto de acuerdo al control activo, es 90
decir, si el control activo es un PictureBox aplicar el método SetData o GetData y si lo es un control con propiedad Text utilizar SetText. Para ello, se puede combinar La función TypeOf junto a Screen.ActiveControl de la siguiente manera: If TypeOf Screen.ActiveControl Is PictureBox Then Clipboard.SetData Screen.ActiveControl.Image ElseIf TypeOf Screen.ActiveControl Is TextBox Then Clipboard.SetText Screen.ActiveControl.SelText ElseIf TypeOf Screen.ActiveControl Is ListBox Then Clipboard.SetText Screen.ActiveControl.Text End If Aplica para otros controles. Después de colocar un elemento en el portapapeles, se puede pegar utilizando GetText y GetData también verificando el tipo de control de destino donde se pegará. De la siguiente manera: If TypeOf Screen.ActiveControl Is PictureBox Then Screen.ActiveControl.Picture = Clipboard.GetData() ElseIf TypeOf Screen.ActiveControl Is TextBox Then Screen.ActiveControl.SelText = Clipboard.GetText() ElseIf TypeOf Screen.ActiveControl Is ListBox Then Screen.ActiveControl.AddItem Clipboard.GetText() End If • BASE DE DATOS: Creación de una base de datos mediante código: Ya se ha visto un poco sobre la conexión con base de datos mediate la utilización del control Data. Y como se pueden eliminar y agregar registros a una tabla mediante el control no intrÃ−nseco DBGrid. Ahora este capÃ−tulo permite tener acceso a las bases de datos mediante otro procedimiento, o mejor dicho mediante la utilización de un objeto llamado DAO (por sus siglas Data Access Object). Este objeto, no tiene representación gráfica en la aplicación, pero debemos declararla como a una variable, siguiendo los parámetros para declaración de variable según el alcance que se quiera que tenga. Para comenzar a utilizar este objeto, se debe colocar la referencia, para ello se debe ir a la lista de referencias que se encuentra en la barra de menú Proyecto, y luego buscar Referencias, para elegir el Objeto DAO, debe 91
encontrar en la lista el objeto Microsoft DAO 3.51 Objet Library (para Access 97) o Microsoft DAO 3.6 Objet Library (para Access 2000), luego se hace clic en aceptar. Se ha creado la referencia. Luego podemos declarar una variable como una base de datos en la sección de declaraciones de un módulo o del formulario, según el alcance que se desee, de la siguiente manera: Dim MiBase As Database o Public MiBase As Database Nota: Si no se hace la referencia no se podrá declarar una variable como Database. Se generará el siguiente Error de compilación. No se ha definido el tipo definido por el usuario. El objeto DAO trabaja con colecciones, estas son a su vez objetos de acceso a datos. Luego de haber declarado la Base de datos, se debe declarar una sesión de trabajo mediante la utilización del Objeto Workspace. El objeto Workspace define una sesión de trabajo para algún usuario. En algunos casos necesitará crear más de una sesión de trabajo, pero normalmente sólo necesitará una sola sesión, para ello Visual Basic genera el primer elemento de la colección WorkSpaces, esta es Workspaces(0). Entonces primero declarar y luego, asignarlo. En el siguiente ejemplo se usa el Workspace creado por defecto en VB -Workspaces(0)-. Dim UnaSesion As Workspace Set UnaSesion = Workspaces(0) Luego pasamos a la creación de la base de datos, se utiliza la fórmula para la creación de Objetos DAO, se propone como fórmula general: Set ObjDAOInf = ObjDAOSup.Método (Argumentos) Donde argumentos varÃ−a según el método que se vaya a utilizar y los Objetos DAO Inferior y Superior mantendrán sus posiciones cualquiera que sea el caso de la creación del objeto DAO. Para crear la base de datos se utiliza el método CreateDatabase, en este caso el objeto DAO superior es el Workspaces UnaSesion y el objeto inferior MiBase, los argumentos son: (Ruta, Idioma, Opciones) Ruta es una cadena de texto que define el archivo de base de datos que se creará (de no tener extensión se agregará .mdb), Idioma es una constante de VB que define el idioma (por supuesto), se recomienda para los idiomas español, inglés o francés, la constante dbLangGeneral (la constante dbLangSpanish no ofrece ninguna ventaja frente a dbLangGeneral) y opciones se refiere a la versión de Access en la que se creará y puede incluir también si desea crear una base de datos codificada, si se omite se creará una base de datos no codificada. Por lo tanto para crear una nueva base de datos se coloca: Dim Archivo As String Archivo="C:\CarpetaDatos\MiBase.mdb" Set MiBase=UnaSesion.CreateDatabase(Archivo, dbLangGeneral) 92
Después de creada una base de datos, se procede a crear las tablas, sus campos, y si se desea también se pueden crear consultas, Ã−ndices (claves) y relaciones entre tablas. Para crear una tabla se usa el método CreateTableDef, pero antes de crearla se debe declarar la variable correspondiente, por ejemplo: Dim Tabla1 As TableDef Si se declara de la forma anterior sólo se podrá crear una tabla, por lo tanto se deben declarar tantas variables de objeto TableDefs como tablas se requieran para la base de datos. De forma que se puede agregar a la sentencias anterior: Dim Tabla1 As TableDef, Tabla2 As TableDef, Table3... Cuando se está creando una tabla no se está agregando a la base de datos, solo se está creando en forma apartada permaneciendo en la memoria RAM del ordenador, por ello luego debe agregarse al documento de datos mediante el método Append, este se verá mas adelante. Ahora si, se puede crear la o las tablas. Set Tabla1 = MiBase.CreateTableDef("NombreTabla1") Set Tabla2 = MiBase.CreateTableDef("NombreTabla2") Set Tabla3 = MiBase.CreateTableDef("NombreTabla3") ... Se puede observar que se ha usado la fórmula general: Set ObjDAOInf = ObjDAOSup.Método (Argumentos) En este caso ObjDAOInf es el objeto TableDef (Tabla#) y el superior es el nombre del objeto DataBase (MiBase). Para el caso del ejemplo puede cambiar los nombres de las tablas al que desea que aparezcan cuando ejecute Access. Siguiendo la secuencia, ahora le toca el paso a la creación de los campos, se usa el método CreateField. Tal y como se procedió con los objetos anteriores, estos también deben declararse, de la siguiente manera: Dim Campo_1_1 As Field, Campo_1_2 As Field, Campo_2_1 As Field,... En este ejemplo, se utiliza Campo_1_1 para referirse al campo de la primera tabla, primer campo, es decir, el primer número se utilizó para identificar la tabla y el segundo para identificar el número del campo. Ahora se puede crear el campo: Si utilizamos la ecuación general: Set ObjDAOInf = ObjDAOSup.Método (Argumentos) SerÃ−a ahora: 93
Set Campo_1_1=Tabla1.CreateField("Nombre", Tipo, Caracteres) Donde Nombre es una cadena de texto que definirá el nombre del campo, por ejemplo: ID_Cliente, NombreCliente, Dirección, etc. Tipo define el tipo de dato que aceptará el campo: la siguiente tabla enumera algunas de las opciones: Constante Tipo Descripción dbBoolean Boolean Verdadero o Falso dbByte Byte 0 a 255 dbCurrency Currency Dinero o cálculos de signo decimal fijo dbDate Date/Time Datos de fechas y hora dbDouble Double Números de precisión doble dbInteger Integer Números enteros medianos dbLong Long Números enteros Largos dbMemo Memo Texto extendido dbNumeric Numeric Numérico dbSingle Single Números de precisión simple dbText Text Cadenas de texto dbTime Time Hora Se desea conocer otros tipos de datos puede dirigirse a la ayuda de VB. En el caso de Caracteres, sólo aplica cuando el tipo de dato es texto, y se refiere al número máximo de caracteres que puede tener la cadena de texto. Una vez creadas todas las tablas y campos de la base de datos se procede a agregarlas, esto es posible al método Append, se utiliza de la siguente manera: Primero los campos: Tabla1.Fields.Append Campo_1_1 Tabla1.Fields.Append Campo_1_2 Tabla2.Fields.Append Campo_2_1 AquÃ− es muy útil la sentencia With cuando existe un número considerado de campos para resumir el código: With Tabla1 .Fields.Append Campo_1_1 .Fields.Append Campo_1_2 .Fields.Append Campo_1_3 .Fields.Append Campo_1_4 End With
94
Luego las tablas: MiBase.TableDefs.Append Tabla1 MiBase.TableDefs.Append Tabla2 Para finalizar es recomendable no dejar la base de datos abierta, esta se cierra mediante el método Close: MiBase.Close Programa #31. Crear una base de datos con código en VB: Para este programa no necesita agregar ningún control al formulario, es necesario crear una carpeta en el directorio C:\ de nombre CarpetaDatos, luego en el formulario agregue el siguiente código: Option Explicit Private Sub Form_Click() Dim MiBase As Database Dim UnaSesion As Workspace Set UnaSesion = Workspaces(0) Dim Archivo As String Archivo = "C:\CarpetaDatos\MiBase.mdb" Set MiBase = UnaSesion.CreateDatabase(Archivo, dbLangGeneral) Dim Tabla1 As TableDef, Tabla2 As TableDef Set Tabla1 = MiBase.CreateTableDef("Productos") Set Tabla2 = MiBase.CreateTableDef("Clientes") Dim Campo_1_1 As Field, Campo_1_2 As Field Dim Campo_1_3 As Field, Campo_2_1 As Field Dim Campo_2_2 As Field Set Campo_1_1 = Tabla1.CreateField("CodigoProducto ", dbInteger) Set Campo_1_2 = Tabla1.CreateField("Producto", dbText, 15) Set Campo_1_3 = Tabla1.CreateField("Precio", dbCurrency) Set Campo_2_1 = Tabla2.CreateField("CodigoCliente", dbInteger) Set Campo_2_2 = Tabla2.CreateField("NombreCliente", dbText, 20) 95
With Tabla1 .Fields.Append Campo_1_1 .Fields.Append Campo_1_2 .Fields.Append Campo_1_3 End With With Tabla2 .Fields.Append Campo_2_1 .Fields.Append Campo_2_2 End With With MiBase .TableDefs.Append Tabla1 .TableDefs.Append Tabla2 End With MiBase.Close End Sub Ejecute la aplicación, haga click sobre el formulario parece que el programa no reaccionara, pero la verdad se ha creado una base de datos en la nueva carpeta CarpetaDatos que se encuentra en el directorio C:\, puede dirigirse a ella y verificar, si da un clic nuevo se producirá un error debido a que no se podrá crear una base de datos ya creada, sólo se podrá abrir mediante el método OpenDatabase. Faltan ahora dos procesos por aprender, la creación de Ã−ndices y de relaciones. Para crear un Ã−ndice se utiliza el método CreateIndex, y como todos los objetos debe declararse antes de ser asignado: Dim Indice As Index Set Indice = Tabla1.CreateIndex("PrimerIndice") Una vez creado el Ã−ndice, éste pasa a crear al campo que se quiere sea Ã−ndice, fÃ−jese bien que aunque la sentencia dice crear campo, el campo ya estuvo que estar creado, sólo se utiliza esta sentencia para asignar el Ã−ndice al campo deseado: Set Campo_1_1 = Indice.CreateField("CodigoProducto ", dbInteger) En este caso el nombre del campo y su tipo de dato debe coincidir con el campo creado. De hecho si es tipo texto (dbText) debe coincidir también el número de caracteres declarados cuando se creó el campo. Esto 96
en caso que se quiera que sólo un campo tenga Ã−ndice, si desea que otro campo de la misma tabla también sea Ã−ndice entonces se colocan las dos sentencias: Set Campo_1_1 = Indice.CreateField("CodigoProducto ", dbInteger) Set Campo_1_2 = Indice.CreateField CreateField("Producto", dbText, 15) Una vez que se hayan asignado el o los Ã−ndices, se debe(n) agregar a la colección Fields, de la siguiente manera: Indice.Fields.Append Campo_1_1 Indice.Fields.Append Campo_1_2 Las dos lÃ−neas son necesarias si desea que dos campos sean Ã−ndices, si sólo se desea que un campo sea el indice sólo es necesario escribir la primera lÃ−nea. Después de agregar el o los Ã−ndices a la colección Fields, se deben agregar a la colección Indexes del Objeto Tabledef, de la siguiente manera: Tabla1.Indexes.Append UnIndice Ahora le toca el turno a la creación de Tablas Relacionales, es decir, las relaciones. à stas se crean mediante el método CreateRelation, pero claro, primero hay que declararla: Dim Relacion As Relation Para relacionar un campo con otros, ese campo debe ser clave primaria. A la tabla que contiene a este campo se le llama Tabla Principal. A la tabla que contiene el campo (o los campos) relacionados se le llama Tabla Relacionada. Después de declararse, si observa un poco los pasos de los objetos, le toca el paso a la creación de la relación, esto se hace de la siguiente manera: Set Relacion = MiBase.CreateRelation ("NombreRelación") En este caso NombreRelación pasa a ser el nombre de la relación, aunque este sea poco utilizado. La relación se ha creado pero falta un detalle importante, que campos se van a relacionar. Supongamos que se va a relacionar el primer campo de la primera tabla (Campo_1_1 de la Tabla1) y el primer campo de la segunda tabla (Campo_2_1 de la Tabla2), claro está, esto no es posible porque estos campos no son del mismo tipo ni tienen el mismo nombre, pero como se dijo anteriormente, esto es sólo una suposición. Para ello se procede de la siguiente manera: Relacion.Table = "Tabla1" Relacion. ForeignTable = "Tabla2" Podemos utilizar la propiedad Attributes para cambiar los atributos de la relación, por ejemplo se puede establecer la constante dbRelationUpdateCascade, para que, cuando se realice algún cambio en el campo de la tabla principal, se refleje en el campo o los campos relacionados con él. 97
Establecemos cual es el nombre del campo de la tabla principal que vamos a relacionar, mediante el método CreateField (aunque el campo ya ha sido creado), también debemos declarar el nombre del objeto Field que vamos a crear para la relación: Dim OtroCampo As Field Set OtroCampo = Relacion.CreateField("Campo_1_1") Establecemos ahora cual es el nombre del campo en la tabla relacionada: OtroCampo.ForeignName = "Campo_2_1" Añadimos el campo creado a la colección Fields del objeto Relation Relación.Fields.Append OtroCampo Y ahora añadimos el objeto Relation recién creado a la colección Relations del objeto Database MiBase.Relations.Append Relacion Con esto se da fin al trabajo de investigación, a continuación la Sección Detallada de Programas. Sección: Explicación Detallada de Programas Programa #1. Saludar: Cuando hace clic en el botón Saludar, el programa llama al código de Private Sub Command1_Click(). Por ello, verifica si la propiedad Caption del botón Command1 es “Saludar”, si es asÃ−, entonces el programa ejecuta las sentencias después de Then y antes de Else. Por lo tanto, la propiedad Text del control Text1 mostrará: “¡Hola!, ¿Cómo estas?”, luego cambia la propiedad Caption de Command1 a “Borrar”. Ahora el botón no mostrará la palabra Saludar, sino Borrar. Al volver a hacer clic (ahora en Borrar), el programa vuelve a llamar a la sentencia Private Sub Command1_Click(). Verifica la condición Command1.Caption=”Saludar”, pero en este caso es falsa ya que es “Borrar”, entonces se ejecutan las sentencias que están después de Else y antes de End If. AsÃ−, la propiedad Text del control Text1 generará una cadena vacÃ−a (“”) y la propiedad Caption del botón Command1 volverá a ser “Saludar”. Programa #2. Sumar: La Sentencia (Public Suma As Double) crea una variable pública de nombre Suma de tipo doble (Numérico de doble precisión) que guardará el resultado de una operación. (ver Sección nro. 5 Variables y Tipos de Datos) Cuando hace clic en el comando Sumar, el programa llama a la secuencia de códigos de Private Sub Command1_Click(). Dim es una expresión que también crea una variable en este caso privada. El nombre de la variable es Valor y es también de tipo Doble.
98
La siguiente lÃ−nea verifica si la propiedad Text de txtValor es una cadena vacÃ−a (si no hay datos), si es asÃ− asigna a la variable Valor el número cero, sino es cadena vacÃ−a, convierte el contenido de txtValor a tipo doble y lo asigna a la variable Valor (Si el contenido de txtValor no es numérico se genera un error). La siguiente lÃ−nea realiza la operación: Suma = Suma + Valor, aquÃ− realiza la operación suma + valor y lo asigna a la variable Suma, Ejemplo, si suma es igual a 10 y quiero sumar 15, VB toma el valor de Suma = 10 y le suma 15 luego borra de la memoria el valor 10 y asigna 25. La siguiente lÃ−nea consigue que se muestre este resultado en la propiedad Caption de lblResultado. Luego, se convierte el contenido de txtValor a una cadena vacÃ−a, de manera que borra el contenido que haya en ella. Es importante resaltar que Suma se declaró como una variable pública para mantener su valor fuera de el evento clic del botón de comando. Si se declara privada dentro del procedimiento Private Sub Command1_Click() cada vez que inicie la secuencia, Suma valdrá cero, por lo que el resultado mostrará el valor de la variable Valor. También podrÃ−a declararse privada pero con la sentencia Static (Static Suma as Double) para que mantuviera su valor. Programa #3. Ôrea de un triángulo: La primera sección del programa llama al evento clic del botón de comando Borrar y elimina el contenido de los cuadros de texto, desactiva el botón calcular y ocasiona que el cuadro de texto donde se debe introducir el valor de la Base del triángulo tome el enfoque. La segunda sección cita al evento clic del botón calcular (en caso que esté activado), crea las variables privadas Base, Altura y Area como valores numéricos de doble precisión, luego asigna a Base el valor de txtBase a Altura el valor de txtAltura. Después verifica si la entrada de datos de estos cuadros de texto son numéricos, de ser asÃ−, calcula el área y lo muestra en un texto, sino muestra un mensaje de Error. Luego viene la siguiente sección, que se llama cada vez que cambie el contenido del cuadro de texto txtBase, comprueba si la longitud en bytes de los cuadros de texto txtBase y txtAltura tienen uno o más elementos, de ser asÃ−, activa el botón Calcular. Es importante resaltar que el contenido de txtAltura_Change es igual al contenido de txtBase_Change, ya que estos verifican si los dos cuadros de textos tienen uno o más elementos. Luego se llama al evento KeyPress, que se genera cada vez que se presione y libera una tecla del teclado. En este caso, reconoce si se presiona la tecla Enter (vbKeyReturn o 13), de ser presionada esta tecla ocasiona que el cuadro de texto txtAltura tome el enfoque. El último evento en la codificación es KeyPress del Cuadro de texto txtAltura, este provoca (si se presiona la tecla Enter) que el botón de comando Calcular tome el enfoque. Programa #4. Dibujar en un PictureBox: Como la explicación de los métodos fueron explicados uno por uno durante los métodos gráficos del PictureBox, no se darán mayores explicaciones sobre cada uno. Sólo hay que resaltar varios puntos: • Si el comando Mostrar Imagen produce un error, coloque la ruta de una imagen que esté grabada en su computador. • En el Comando para crear cuadros se puede ver que se asigna a la propiedad FillStyle (Estilo de relleno) el valor de uno, que a pesar de ser el predeterminado, pudo ser cambiado si se presiona antes la tecla para dibujar la elipse. Este estilo determina un relleno transparente (sin color). Además, en el 99
primer rectángulo se omite la instrucción para el color, por ello, el programa asigna el color determinado por la propiedad Monitor.ForeColor. En la lÃ−nea siguiente el argumento B cambió a BF, esto se utiliza para rellenar un cuadrado o rectángulo con el color asignado. Luego se enmarca el cuadrado rellenado con uno negro. • En el comando para crear puntos, primero se realizan tres puntos que se muestran cerca de la esquina superior izquierda, luego se crea una secuencia de puntos que generan una curva con la la Sentencia For X=1 to Monitor.Width. à sta va aumentando el valor de X de uno en uno hasta llegar al valor del ancho del control PictureBox (Monitor.Width), durante esta secuencia de puntos se calcula el valor de Y (una función) y se dibuja el punto X, Y. La instrucción Next hace que la sentencia For vaya al próximo valor de X. El color de los puntos utiliza la instrucción RGB. Ver explicación de esta sentencia en el capitulo 12 de este trabajo. • En el comando para crear dibujar la elipse, se coloca la propiedad FillStyle a cero (Sólido), esto crea un relleno para la elipse y a la propiedad FillColor se asigna el color rojo, es decir, se rellena de color rojo, una elipse de color azul. • Luego viene el comando para realizar cÃ−rculos y arcos, se asigna a la constante Pi el valor 3.1415927, esta constante se utiliza para trabajar en grados radianes, luego se coloca de nuevo la propiedad FillStyle a transparente (1) y se dibuja un cÃ−rculo y un arco desde el grado pi medio (Pi/2) hasta el grado pi. (90° a 180° si fueran grados sexagesimales, ya que la conversión dice que un grado Pi es 180° sexagesimales) • Para escribir texto se va al punto (X, Y) = (2500, 3000) se cambia la propiedad ForeColor para escribir en color azul. Programa #5. ¿Dónde estudiar?: Este programa tiene la finalidad de mostrar como se pueden agrupar varios controles mediante el control Frame (marcos) y además dar una respuesta a los eventos clic de un botón de opción, en este caso mostrando una respuesta en una etiqueta llamada Label1. La primera sentencia crea las variables de cadenas de texto strCarrera y strInstitucion. El primer evento que es llamado es el evento optCarrera_Click(Index), que ocurre cuando hace clic sobre cualquier botón de opción que esté dentro del marco Carrera, si hace clic en el botón de opción IngenierÃ−a, este corresponde al Index #0 (optCarrera(0)), se asigna a la variable strcadena el Caption del botón, en este caso IngenierÃ−a, luego llama al evento Display que escribe en la etiqueta una cadena que incluye “Ha decidido estudiar” luego la variable strCarrera que describe la carrera, a continuación escribe “ en la “ y después la variable strInstitucion. No se hizo referencia el evento de los botones de opción dentro del control Frame de la institución ya que ocurre un procedimiento semejante al del control Frame que contiene las carreras. El botón de comando finaliza el programa mediante la descarga del formulario. Programa #6. Contrato: En este programa la etiqueta muestra en la etiqueta “Si contratar” si las tres casillas de verificación están activadas o chequeadas, si alguna falta muestra la etiqueta “No contratar”. Programa #7. Coordenadas: Los eventos Change de los dos cuadros de texto habilitan y deshabilitan el botón de comando cmdIngresar según ambos tengan uno o más elementos. Si ellos tienen uno o más elementos se habilita y sino se deshabilita. El evento KeyPress de txtX hace que el cuadro de texto txtY tome el enfoque cuando se presiona la tecla Enter. El evento KeyPress de txtY hace (si se presiona la tecla Enter) que tome el enfoque el botón de 100
comando cmdIngresar si está habilitado, y si no lo está, toma el enfoque txtX. El evento clic del comando Ingresar, genera dos variables de números enteros (X,Y) asigna a la primera el valor entero de txtX y a la segunda el valor entero de txtY; luego, dibuja un pequeño cÃ−rculo (simulando un punto) en las coordenadas del cuadro de imagen (Monitor). La siguiente lÃ−nea agrega un elemento a la lista de puntos, incluye un paréntesis abierto, la variable X, una coma, la variable Y y un paréntesis cerrado. El contenido del evento clic del comando Eliminar se puede comprender con la explicación de cómo se borra un elemento de una lista durante la explicación de este control e igualmente el método Clear del cuadro de lista. El método Refresh del cuadro de imagen borra el contenido del PictureBox (Monitor). Programa #8. Número de Mes: El primer evento Form_Load ocurre cuando se carga el formulario, dentro de ella están las instrucciones para agregar cada mes (mediante su nombre) al control Combo1. Luego se presenta el evento clic del botón de comando Command1. Primero, crea una variable de nombre Mes de tipo Byte (byte es un número entero que puede estar entre 0 y 255, se creo de este tipo ya que el valor de Mes va a estar entre 1 y 12). La lÃ−nea consecutiva verifica cual es el valor constante o cadena que toma Combo1 (selecciona el caso); en caso que sea Enero asigna a la variable Mes el valor 1, si es Febrero le asigna dos y asÃ− sucesivamente. La sentencia Case Else ocurre cuando no toma ninguno de los casos particulares, en este caso, si no toma ningún nombre de mes desplega un mensaje de error. La instrucción End Select finaliza la secuencia de Select Case y luego se muestra en el cuadro de texto el valor de la variable mes. Programa #9. Mirar el contenido de una etiqueta: Dentro del evento Command1_click se asignan a las escala del formulario y a la de la imagen la constante vbCharacters, para trabajar con escala de tamaño de caracteres de cadena de texto. Luego, se llama al método mover que coloca la etiqueta al principio del control cuadro de imagen (esquina superior izquierda). Después, se asigna a la propiedad caption de la etiqueta el contenido del cuadro de texto, a continuación, se asigna a la propiedad Max de la barra de desplazamiento la diferencia entre el ancho de la etiqueta y el ancho del cuadro de imagen mas un carácter, esto se hace para que la barra de desplazamiento se limite a los extremos de la cadena de texto, es decir, que se puede desplazar sólo por la cantidad de elementos que existen. La barra de desplazamiento aparece (es visible) si el ancho del cuadro de imagen es menor al ancho del contenido de la etiqueta. El evento HScroll1_Change se llama cada vez que cambia la posición de la barra de desplazamiento, esto se aprovechó para asignarle a la propiedad Left de la etiqueta el valor negativo de la Barra de desplazamiento, es decir, la propiedad Value va de Min (mÃ−nimo) a Max (máximo), en este caso de cero hasta (Label1.Width - Picture1.Width + 1), si se le asigna el valor negativo de Value a la propiedad left de la etiqueta, hace que la etiqueta se desplace hacia la izquierda mostrando el contenido de ella. Programa #10. Cyber: Como la propiedad Enabled del control Timer está Activada (True) y además la propiedad Interval de este control tiene el valor 1000, el programa llama al evento Timer cada segundo, por lo tanto, cada segundo se llaman a las variables que preservan su valor debido a la sentencia (Static), con los siguientes nombres: Segundos (tipo Byte), Minutos (tipo Byte), Horas (tipo Entero), Precio (tipo Doble) y Contador (tipo Entero Largo). 101
Luego se aumenta en una unidad la variable Contador, cada vez que transcurre un segundo se suma una unidad. Este contador nos sirve para calcular el precio del tiempo de uso. Luego, se muestra en la primera etiqueta la hora del sistema (Label1=Time). A continuación si el valor de los segundo no ha llegado a 59, se suma un segundo, de lo contrario, se reinicia el conteo de los segundos y se suma un minuto. Similarmente si el conteo de minutos no ha llegado a 59, se suma un minuto, de lo contrario se reinicia el conteo de minutos y se suma una hora. En la segunda etiqueta se muestra el contador de horas, minutos y segundos con un formato de dos dÃ−gitos cada uno separados por los dos puntos. Se calcula el valor del precio del tiempo de uso, para ello se contabiliza 1 unidad monetaria cada tres segundos, si este valor no ha llegado a 100, la etiqueta del precio muestra 100 como valor mÃ−nimo, después de los 5 minutos (tiempo cuando ya el precio ha alcanzado 100) se suma cada tres segundos una unidad monetaria. El precio se muestra en la tercera etiqueta. Programa #11. Directorio: En este programa cuando se carga el formulario se llama a la secuencia de Dir1_Change, esto se realizó con la intención que se actualice la lista de archivos al directorio seleccionado por defecto “C:\”. Después, si ocurre el evento Change del DriveListBox (cambio de unidad de disco) cambia la propiedad Path de la Lista de Directorio a la unidad elegida. Path es una propiedad que sólo está disponible en tiempo de ejecución y devuelve o establece la ruta de acceso actual, por lo tanto se actualiza la lista de directorio a la unidad seleccionada. Dentro del evento Change de Dir1, la propiedad Pattern del File1 (Lista de Archivos) muestra sólo los archivos con la extensión especificada, en este caso los archivos de extensón *.doc (Archivos de Word), luego la lista de archivos actual muestra el directorio seleccionado; es decir, se muestran los archivos de Word de la carpeta. Se recomienda ir a la carpeta Mis Documentos para enlistar los archivos. También puede cambiar la extensión de los archivos, si no elige ningún patrón se mostrarán todos los archivos. Programa #12. Contadores de Variables: En este programa se crearon cuatro variables, la variable pública de nombre Variable de tipo entero aumenta en uno si se presiona cualquiera de los dos botones de comando, como es una variable pública conserva su valor después de presionar cualquiera de los dos botones. Para la sección del evento clic del primer botón de comando se crean dos variables mas: • Variable1, de tipo entero, se declara con la sentencia Dim, por lo tanto cada vez que termina el evento clic del botón de comando éste toma el valor de cero, y como mediante el procedimiento se aumenta en uno la primera etiqueta siempre muestra el valor uno al presionar el primer botón. • Variable2, también de tipo entero, en este caso se declara con la sentencia Static, por lo tanto una vez terminado el procedimiento el valor conserva su valor final, terminado el primer procedimiento su valor será uno, luego dos y asÃ− sucesivamente tantas veces se presione este botón. Este valor se muestra en la segunda etiqueta. Para la sección del evento clic del segundo botón de comando se crea otra variable, llamada Variable2. Como está declarada con la sentencia Static, conserva su valor después de terminado este procedimiento, por lo tanto se aumenta en uno cada vez que presiona un clic. Es muy importante resaltar que a pesar de tener 102
el mismo nombre de una variable de otro procedimiento, es otra variable, ya que está declarada en otro procedimiento. Programa #14. Variables de procedimientos: La secuencia Option Explicit permite llevar el control de las variables, no permite que se utilice una variable no declarada. Public Area As Double, crea una variable de nombre Area de tipo numérico de precisión doble. La secuencia de Private Sub Form_load() se ejecuta cuando se carga el formulario, en este caso cambia su propio caption a “Area de un CÃ−rculo” y suceden varios cambios de propiedades de los controles del formulario. La secuencia del procedimiento de evento Command1_Click se ejecuta cuando se hace clic en el botón de comando, en este caso declara dos variables: La primera de nombre Radio de tipo numérico de precisión doble y la segunda de nombre Area de tipo precisión doble. Luego se colocó una sentencia de control If, en este caso quiere decir: Si el cuadro de texto Text1 es diferente de vacÃ−o (tiene algún elemento) y además es numérico entonces se procede a realizar el cálculo de área, antes asignando a la variable Radio el valor de text1 convertido a numérico de precisión doble. Se muestra en la segunda etiqueta el área calculada y después se llama al procedimiento de nombre Display. Este procedimiento tiene como única secuencia mostrar en la tercera etiqueta una variable de nombre Area; es muy importante destacar que la tercera etiqueta mostró el valor cero, ya que la variable Area a la que se hace referencia ya no es la variable Area calculada en el procedimiento Command1_Click sino la variable publica que no a sufrido ningún cambio desde el transcurso de todo el programa. Programa#15. Procedimiento Function: Como otros detalles de programación han sido explicados en programas anteriores, sólo se procederá a explicar el procedimiento Function utilizado en este programa. La “Function” de nombre Resto crea un procedimiento que devuelve un valor cuando es llamado. Hay que resaltar que Resto fue declarada con dos variables, se puede notar que está escrito Resto(Dividendo As Integer, Divisor As Integer), de modo que, la Function Resto se puede llamar al escribir Resto(Valor1, Valor2), donde el Valor1 toma el valor del dividendo y Valor2 toma el valor del divisor. En este programa cuando se presiona clic sobre el botón de comando el programa verifica que la entrada de los cuadros de texto sean valores numéricos, de ser asÃ− se asigna al caption de la etiqueta la función Resto con dividendo igual a Text1 y divisor Text2. Programa #19. Sentencia Goto: La primera lÃ−nea del botón de comando On Error Goto NombreSubprocedimiento, se aplica cuando puede suceder algún error mientras se ejecutan las instrucciones de un programa, de modo que me guÃ−a hasta una sección del programa (subprocedimiento) que ejecuta una serie de instrucciones cuando se produzca un error, son muy útiles mas que todo para mostrar un mensaje personalizado de error al usuario, o para realizar acciones especÃ−ficas ante la presencia de un error. En este programa esta sentencia dirige hasta el subprocedimiento ErrorValor que contiene la siguiente instrucción: 103
If Err.Number = 13 Then Esta sentencia verifica el número de error (Err.Number) que se ha producido al ejecutar este procedimiento, en este caso el tipo de error tiene el número 13 que se refiere al Error (No coinciden los tipos). El número de error siempre lo muestra VB al momento de producirse un error en sus mensajes. Por ello, la sentencia On Error Goto puede aplicarse para informar al usuario mediante un Mensaje (MsgBox) la acción que debe tomar para continuar utilizando la aplicación. En este programa se utilizó para mostrar un mensaje al usuario diciendo que se produjo un error en el valor introducido, borra el contenido de text1 y hace que éste tome el enfoque. Si no hay error en el valor introducido, se llama a la función DivisibleEntre2_3_4 con el valor introducido en Text1, al llamar a la función ésta verifica si el valor introducido es divisible entre 2, en caso contrario dirige a la secuencia de la función al subprocedimiento NoEsDivisible, igual para el caso de divisible entre 3 y 4, una vez terminada esta secuencia se cambia el valor de la función Divisible a Verdadero (hay que notar que en caso de que fuera falso el procedimiento ya anteriormente ha saltado este paso), luego se colocó la sentencia Exit Function para que el programa finalice la secuencia, el subprocedimiento NoEsDivisible cambia el valor de la función a Falso. Programa #24. Menú Emergente: El primer procedimiento llamada es el evento Picture1_MouseUp que ocurre cuando libera algún botón del mouse sobre el control Picture1 (Cuadro de imagen). En este la instrucción If button=2 Then, ocurre cuando persona el botón secundario del mouse, si es asÃ− se desplega el menú emergente mediante la instrucción: PopupMenu mnuDibujar, Popupmenu realiza el llamado y al lado está el nombre del menú que se quiere desplegar. Las demás instrucciones ya han sido vistas en la explicación del control cuadro de imagen. Programa #26. Programa MDI: Este programa utiliza las instrucciones mas comunes para programas con formulario MDI. El formulario hijo (Form1) contiene dentro de sÃ− la sentencia ScaleHeight y ScaleWidth para adaptar el ancho y el alto al tamaño del formulario, se encuentra dentro del procedimiento de evento Form_Resize, para que cada vez que cambie de tamaño el formulario, el control Picture1 cambie su tamaño también adaptándose al tamaño del formulario. Dentro del procedimiento de evento Form_Activate se encuentra el iniciador de conteo de documentos abiertos, Contador toma el valor 1, es importante resaltar que se colocó dentro del procedimiento de evento Form_Activate ya que no se permite colocar valores a variables dentro del procedimiento Form_Load. Cuando se hace clic sobre el primer botón de comando se crea una nueva instancia de Form1, se agrega una unidad al contador y se muestra el formulario, se cambia el Caption de acuerdo al número de documento. Cuando se presiona clic sobre el segundo botón de comando, el sólo ejecuta una lÃ−nea de instrucción que es: ActiveForm.Picture1.Circle (500, 500), 300, , , , 2 / 3 ActiveForm, busca el formulario activo, como todos los formularios abiertos son instancias de Form1, todos tienen el control Picture1, por ello en él se dibuja una elipse, es decir, en el control Picture1 del formulario activo. 104
Con respecto al tercer botón de comando, también utiliza la sentencia ActiveForm, pero en este caso para borrar el contenido de su cuadro de imagen. Programa #28. Extensión del Programa #7 - Coordenadas: El evento clic del botón cmdNuevo, crea un archivo nuevo si no existe, si el archivo existe se abre graficando sus coordenadas en el cuadro de imagen (Monitor). La variable Nuevo es una cadena de texto que el usuario introduce para dar un nombre al archivo, mediante la conversión a cadena de CStr("C:\" + Nuevo + ".dat") se completa el nombre del archivo, es decir, se agrega la ubicación donde se guardará “C:\”, el nombre del archivo introducido por el usuario y además la extensón .dat. Luego se abre el fichero con tipo de acceso aleatorio con un tamaño de registro de 4 bytes (X es Integer y además Y es Integer, por lo tanto como se vio en la sección de tipos de datos, éstos ocupan sólo dos bytes cada uno por lo tanto el tamaño de cada registro es de 4 bytes). Si el archivo tiene registros grabados (If LOF(1) > 0 Then) el programa procede a enlistar los puntos en el ListBox y además los grafica en el cuadro de imagen (Monitor), los demás detalles ya han sido explicados en otros programas. El evento clic del botón cmdAbrir tiene las siguientes secuencias: Si se produce un error se dirige a la parte inferior del procedimiento llamado Corregir, sino se declara una variable de cadena llamada Archivo, se establece la propiedad Filter del CommonDialog1 para leer sólo los archivos de extensión DAT, se muestra el cuadro de diálogo Abrir para buscar un archivo grabado para luego asignar a la variable Archivo el archivo elegido (si se presiona la tecla cancelar se produce un error) posteriormente se procede a abrir el fichero tipo aleatorio, se leen los datos (Get #1, Registro, Punto), se enlista y se grafica en el monitor el punto. El evento clic del botón cerrar, cierra el fichero, borra el contenido de la lista y del cuadro de imagen, este boton se debe presionar si se desea abrir un fichero nuevo, si abre un fichero cuando existe otro abierto se produce un error. Para el caso del cmdIngresar las cuatro primeras lÃ−neas se han explicado, luego se asigna a registro un número mayor en uno del número de registros que existen (Registro = LOF(1)/4+1), el número de registros que existen viene dado por LOF(1)/4, que es el tamaño del fichero entre el tamaño de cada registro. Se escribe en el fichero los datos del punto, luego borra el contenido de los cuadros de texto y hace que tome el enfoque el primer cuadro de texto (txtX). El comando Eliminar crea una variable nueva que guarda el número del registro que se va a eliminar (RegEliminar=lstPuntos.ListIndex + 1) ya que las listas comienzan a enumerar desde cero, abre el archivo provisional que grabará los registros que no serán borrados. Luego se utiliza el bucle For para pasar los registros desde el fichero original hasta el fichero provisional, es muy importante notar que para para los registros que se encuentran antes el traslado es directo: Get #1, Registro, Punto Put #2, Registro, Punto) Pero a partir del registro que será borrado se utilizan las siguientes instrucciones Get #1, Registro + 1, Punto Put #2, Registro, Punto) Esto se hace con la intención que grabe el registro superior en uno al registro menor en uno del fichero provisional, es decir que si se va a eliminar el tercer registro, pase el cuarto del fichero original al tercero del provisional, asÃ− se desplaza el registro eliminado. 105
La sentencia Close #1 cierra el fichero original, luego Kill(Archivo) borra del disco duro éste fichero. Los demás comandos que se encuentran en este procedimiento, ya se han visto. Indice: Contenido: VISUAL BASIC 1. EL ENTORNO DE DESARROLLO DE VB 6.0 2. PROPIEDADES, Mà TODOS, EVENTOS Y CONSTANTES. 3. EL EXAMINADOR DE OBJETOS 4. LOS CONTROLES: • Variables, Tipos de datos y Constantes: 6. MATRICES: • OPERADORES Là GICOS, OPERADORES MATEMÔTICOS Y FUNCIONES MATEMÔTICAS: • PROCEDIMIENTOS Y FUNCIONES: • SENTENCIAS DE CONTROL • CUADROS DE DIÔLOGO • LOS MENà S • COLORES EN VISUAL BASIC • EL OBJETO COLLECTION • PROGRAMAS DE Mà LTIPLES DOCUMENTOS (FORMULARIOS MDI) • TRABAJO CON FICHEROS • IMPRIMIR TEXTO E IMÔGENES • EL PORTAPAPELES • BASE DE DATOS • SECCION DETALLADA DE PROGRAMAS Programación con VB 6.0 Tsu . Enzo Costantini
Página 2 2 7 9 10 34 40 42 44 47 53 56 60 62 64 67 75 77 81 86
Por:Enzo Costantini mailto:
[email protected] Caracas, Venezuela Este trabajo no pretende ser un Manual, pero si una guÃ−a de estudio de VISUALBASIC 6.0 producto de una investigación personal. Figura 3. Cuadro de Herramientas Figura 4. Explorador de Proyectos Figura 5. Propiedades Figura 6. Ventana Posición del Formulario Formulario Estándar 106
Formulario Secundario Formulario MDI
107