viernes, 22 de agosto de 2008

Enumeración

Enum

Una enumeración es un conjunto de constantes asociadas a valores númericos (Long). Para declarar una enumeración se utiliza la palabra reservada Enum y puede ser de tipo Private o Public.

La primer constante de una enumeración inicia con el valor 0, pero es posible asignar valores explícitamente a las constantes.

 Public Enum Calificacion
MB = 10
B = 8
S = 6
NA = 5
NP = 0
End Enum
Leer más...

Type

TypeOf

Compara el tipo de dato de un valor contra un objeto y regresa un valor booleano.

Por lo regular se aplica en intrucciones If - Then - Else

    Dim o As Object
Set o = New Collection
MsgBox TypeOf o Is Object

Regresa: True|Verdadero

TypeName

Regresa un string que contiene el nombre del tipo de dato del valor evaluado

    Dim o As Object
Set o = New Collection
MsgBox TypeName(o)

Regresa: "Collection"

Leer más...

Distribución de una aplicación

Una vez puesta a punto y finalizada la aplicación será necesario distribuirla al usuario o usuarios mediante un programa de instalación que realice tareas como:

  • Copiar todos los archivos necesarios para ejecutar la aplicación
  • Crear la estructura de directorios que contendrán los archivos necesarios para ejecutar la aplicación
  • Registrar archivos
  • Crear un menú de inicio o grupo
  • Crear un icono en el escritorio del usuario

Visual Basic puede hacer esto por nosotros para ello es necesario seguir 2 pasos:

  1. Packaging, será necesario empaquetar los archivos que requiere la aplicación en 1 o más archivos .cab (cabinet file) y que puedan ser colocados en la ubicación deseada, también será necesario crear los programas de instalación para ciertos tipos de empaquetamientos. Un archivo con extesión .cab es un archivo comprimido.
  2. Deployment, será necesario poner la aplicación empaquetada en un medio de almacenamiento para que los usuario puedan instalarla lo cual significa por ejemplo copiar el paquete a un disco, una ubicación de red o sitio web.

Visual Basic provee 2 herramientas necesarias para realizar lo anterior:

  1. Package and Deployment Wiward, automatiza varios de los pasos involucrados en la distribución de aplicaciones y proporciona varias opciones de la forma en la que se desea configurar los archivos .cab.
  2. Setup Toolkit, permite personalizar algunas de las cosas que ocurren durante el proceso de intalación.

Existen 3 formas de iniciar el Package and Deployment Wiward:

  1. Ejecutarlo desde Visual Basic como un add-in
  2. Ejecutarlo como un componente stand-alone fuera del ambiente de desarrollo
  3. Ejecutarlo en modo silencioso utilizando el Package and Deployment Wiward desde Visual Basic como un Add-in

Para utilizar el Package and Deployment Wiward desde Visual Basic, primero es necesario cargarlo desde el Add-In Manager:

Menú Add-ins » Add-In Manager » Package and Deployment Wiward » Loaded/Unloaded » OK

Una vez cargado el Package and Deployment Wiward será necesario empaquetar la aplicación.

Empaquetar una Aplicación

Empaquetar una aplicación es el acto de crear un paquete que puede instalar una aplicación en una máquina.

Un paquete consiste de archivos .cab o archivos que contienen el proyecto comprimido y otros archivos necesarios para instalar y ejecutar la aplicación. Estos archivos pueden contener un programa de instalación, archivos secundarios .cab o otros archivos necesarios.

Es posible crea dos tipos de paquetes: standard packages o Internet packages, por ejemplo si se planea distribuir la aplicación sobre un medio de almacenamiento será necesario crear standard packages para la aplicación, pero si planea distribuir la aplicación via un sitio intranet o internet se debería crear Internet packages.

Pasos para crear standard packages:

  1. Abir el proyecto a empaquetar utilizando el wizard
  2. Seleccionar del menú principal Run» Start with full compile
  3. Seleccionar del menú principal File » Make (para generar archivo .exe)
  4. Menú Add-ins » Add-In Manager » Package and Deployment Wiward » Loaded/Unloaded » OK

    Esta acción agrega la opción Package and Deployment Wizard al menú Add-Ins

  5. Seleccionar del menú principal Add-Ins » Package and Deployment Wizard
  6. En la pantalla principal clic en Package
  7. Selecionar el tipo de paquete como Standard Setup Package » Next
  8. Seleccionar el directorio donde el paquete podría ser ensamblado » Next
  9. Se indica seleccionar los archivos a incluir como parte de la aplicación » Next
  10. Seleccionar entre Single Cab o Multiple cabs (para generar un sólo archivo .cab o varios) » Next
  11. Proporcionar el título para ser desplegado cuando el programa de instalación se ejecute » Next
  12. Seleccionar la estructura del grupo de menú Start y sus elementos los cuales podrían ser creados por el proceso de instalación » Next
  13. Modificar en caso necesario cualquier ubicación de archivos » Next
  14. Seleccionar cualquier archivo que se desee instalar como compartido en caso de que sean utilizados por más de un programa » Next
  15. Proporcione el nombre del archivo bajo el cual se almacenara la configuración de la sesión actual
  16. Seleccione Finish para crear el paquete (se crea un reporte de empaquetamiento el cual puede ser almacenado para futuras referencias)
Leer más...

Objetos

Es posible crear y trabajar con varios tipo de objetos como: controls, forms, menus y objetos genericos en Visual Basic Integrated Development Environment (IDE), por ejemplo:

   Dim frmMiForma As Form
Dim txtMiCajaTexto As TextBox
Dim lblMiEtiqueta As Label
Dim ctlGenerico As Control

Para asociar una variable tipo objeto con un control particular se utiliza la sentencia Set:

Set txtMiCajaTexto = frmAltaEmpleados.txtNombre

Una vez realizada la asignación, es posible utilizar la variable como un Alias para el nombre del control.

txtMiCajaTexto.Text = "Hello World!"

También es posible utilizar una variable tipo objeto generico, la cual puede asumir el valor de cualquier tipo de objeto:

   Dim oGenerico As Object
Set oGenerico = txtNombre
oGenerico.Text = "Rebeca"
Set oGenerico = New frmAltaEmpleado 'el objeto es una nueva instancia de una forma
oGenerico.Show
oGenerico.Nothing 'Se destruye el objeto

Suponga que tiene varios controles del mismo tipo y dada cierta acción es necesario establecer ciertas propiedades de estos controles, hacerlo control a control puede ser una tarea poco eficiente pensando en que es posible automatizarla, por lo que Visual Basic permite trabajar con arreglos de objetos, para ello primero declare un arreglo del tipo que sean sus controles:

Dim aBotones(5) As CommandButton

Después inicialice el arreglo:

   Set aBotones(1) = cmdAlta
Set aBotones(2) = cmdBaja
Set aBotones(3) = cmdCambio
Set aBotones(4) = cmdConsulta
Set aBotones(5) = cmdSalir

Por último automatice el estado de sus controles:

   Dim i As Integer
For i = 1 To 5
aBotones(i).Enabled = False
Next
Leer más...

Colecciones

Una Colección es un conjunto ordenado de elementos que pueden ser referenciados como una unidad.

Un objeto Collection provee una forma conveniente para referir un grupo relacionado de elementos como un simple objeto. Los elementos o miembros en una colección sólo necesitan estar relacionados por el hecho de que existen en la colección, pero no necesitan compartir el mismo tipo de dato.

El objeto Collection tiene las siguiente propiedades y métodos:

* Add, agrega un elemento a la colección
* Count, regresa el número de elementos en la colección. Sólo lectura.
* Item, regresa un elemento por índice o por llave
* Remove, borra un elemento de la colección por íncide o por llave

Key es un valor de tipo string, se utiliza el método Add para asociar una llave con un elemento

Index es un valor long entre 1 y el número de elementos en la colección.

A diferencia de un arreglo las colecciones comienzan en el índice número 1 y cada vez que se emplea el método Remove() se actualiza el índice de las colecciones, así como su propiedad Count.

Dim colColores As New Collection

Private Sub crearColeccion_Click()
colColores.Add "rojo"
colColores.Add "Amarillo"
colColores.Add "blanco"
colColores.Add "azul"
colColores.Add "verde"
colColores.Add "negro"
End Sub

Private Sub mostrarElementosColeccion_Click()
Dim sTmp
Dim i
If colColores.Count Then
For i = 1 To (colColores.Count)
sTmp = sTmp & i & " : " & colColores.Item(i) & Chr(13)
Next
MsgBox sTmp
Else
MsgBox "Primero de clic en [Crear Colección]" 'crearColeccion_Click()
End If
End Sub

Private Sub eliminarPrimerElementoColeccion_Click()
If colColores.Count Then
MsgBox "Se elimino el elemento : " & colColores(1)
colColores.Remove (1)
Else
MsgBox "La colección no tiene elementos"
End If
End Sub

Vueling
Leer más...

Eventos del mouse

Existen 3 tipos de eventos del mouse en Visual Basic

  1. MouseDown, ocurre cuando el usuario da clic a cualquier botón del mouse.
  2. MouseUp, ocurre cuando el usuario libera cualquier botón del mouse.
  3. MouseMove, ocurre cuando el usuario mueve el mouse.

Cada uno de los eventos anteriores reciben 4 parámetros:

  1. button, regresa un valor que permite identificar a que botón se le dio clic: vbLeftButton, vbRightButton, vbMiddleButton
  2. shift, regresa un valor que permite identificar que tecla o teclas se mantienen presionadas: vbShiftMask = SHIFT, vbCtrlMask = CTRL, vbAlttMask = ALT, posibles combinaciones CTRL + SHIFT = (2+1) = 3
  3. x, regresa la posición actual X, relativa a la esquina superior izquierda
  4. y, regresa la posición actual Y, relativa a la esquina superior izquierda
   Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
sbMouse.SimpleText = "Coordenadas del Mouse (" + CStr(X) + ", " + CStr(X) + ")"
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbRightButton Then
DatosUsuario.PopupMenu mnuOtro
End If
Dim Msg
Select Case Button
Case vbRightButton
Msg = "Botón derecho liberado"
Case vbMiddleButton
Msg = "Botón medio liberado"
Case vbLeftButton
Msg = "Botón izquierdo liberado"
End Select
Select Case Shift
Case vbShiftMask
Msg = Msg & " + Shift"
Case vbCtrlMask
Msg = Msg & " + Ctrl"
Case vbAltMask
Msg = Msg & " + Alt"
Case vbShiftMask + vbAltMask
Msg = Msg & " + Shift + Alt"
End Select
sbMouse.SimpleText = Msg
End Sub
Leer más...

Drag and Drop

Dragging, acción de mantener presionado un botón (down) del mouse.

Dropping, acción de liberar un botón (up) del mouse.

Existen 2 tipos de drag y drop:

  1. Drag/Drop dentro de una aplicación, seleccionar y mover objetos dentro de una misma aplicación
  2. Drag/Drop entre aplicaciones, seleccionar y mover objetos de una aplicación a aplicación

Propiedad DragMode

La propiedad DragMode puede establecerse en tiempo de diseño o de ejecución si se da el valor vbAutomatic a está propiedad el usuario puede mover el control en cualquier momento, Visual Basic despliega un recuadro del control cuando este comienza a moverse.

duke.DragMode = vbAutomatic

Cuando se establece esta propiedad en modo automático, el control no recibe eventos del mouse como el evento Click.

También es posible establecer esta propiedad en modo manual dandole el valor vbManual que es el valor por default de la propiedad.

El siguiente código muestra como se indica iniciar el drag (vbBeginDrag) de un control:

   Private Sub nombrePictureBox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
nombrePictureBox.Drag vbBeginDrag
End Sub

El siguiente código muestra como se indica finalizar el drag (vbEndDrag) de un control:

   Private Sub nombrePictureBox_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
nombrePictureBox.Drag vbEndDrag
End Sub

Cuando el usuario libera el botón del mouse mientras mueve un objeto el drag para, pero el control no mueve de manera automática el objeto a la nueva posición, ya que es necesario escribir el código para el movimiento del control.

Establecer el valor de la propiedad DragMode o invocar el método Drag solamente habilita un control para ser movido, es necesario determinar que podría pasarle al control cuando se termine de mover.

Antes de escribir el código para mover un control, primero es necesario identificar la fuente (source) que es el control que comienza a ser movido por el usuario y el destino (target) que es la forma o control que puede recibir el control que es movido.

Evento DragDrop

El evento DragDrop provee 3 parámetros:

  1. source, se refiere al control que es liberado
  2. X, regresa la ubicación X en la que el control es liberado
  3. Y, regresa la ubicación Y en la que el control es liberado
   Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X, Y
End Sub

Propiedad DragIcon

Por default Visual Basic despliega un contorno del control fuente cuando un usuario mueve un control, es posible cambiar esta imagen a través de la propiedad DragIcon del control fuente:

nombrePictureBox.DragIcon = LoadPicture("nombreImagen.ico")

Leer más...

Tool Bar

Usualmente un ToolBar son botones representados por un icono el cual ejecuta una función de la aplicación.

Para representar un ToolBar a través de un icono primero se debe asociar este a un control ImageList.

Un control ImageList contiene una colección de ListImages que contienen objetos picture, cada uno puede ser referenciado por su índice o llave.

Para construir un ImageList:

  1. Agregue un control ImageList a la forma
  2. Seleccione el control y de clic al botón derecho del mouse para seleccionar Propiedades
  3. Seleccione General Tab, seleccione el tamaño de la imagen
  4. Seleccione Images Tab, de clic en Insert Picture, para insertar el número deseado de imagenes dentro del control ImageList, por último clic en [OK].

Para crear un ToolBar:

  1. Agregue un control TollBar
  2. despliegue las propiedades del control
  3. Seleccione General Tab para establecer que el valor de la propiedad ImageList sea igual al nombre del control ImageList al cual se desea asociar
  4. Seleccione Buttons Tab de clic al botón [Insert Button] para agregar nuevos botones
  5. Asigne las propiedades:
    • Key, regresa o establece un string que identifica de manera única a un miembro en una colección
    • ToolTipText, regresa o establece un tool tip (ayuda contextual)
    • Image, regresa o establece un valor que especifica cual de los objetos ImageList en un control ImageList se utilizará con otro objeto.

El control Toolbar contiene una colección de objetos botones los cuales comparten un evento Click, es posible determinar que botón se activo evaluando su propiedad Key de un objeto Button dentro del procedimiento de eventos Buttonclick.

   Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Key
Case "almacenar"
'instrucciones
Case "abrir"
'instrucciones
Case "ayuda"
'instrucciones
Case "salir"
'instrucciones
End Select
End Sub
Leer más...

Barra de estado

El control Status Bar es utilizado para desplegar información de varios tipos de manera discreta o poco llamativa en un área localizada por lo común en la parte inferior de la forma (por default su alineación es vbAlignBottom).

El control Status Bar también puede desplegar y actualizar información de manera automática, por ejemplo:

  • Estado de las teclas CAPS LOCK, NUM LOCK, INSERT y SCROLL LOCK
  • Tiempo
  • Fecha

Además puede contener texto y bitmaps, se pueden desplegar mensajes de la aplicación en la barra de estado utilizando la propiedad Text.

Para agregar una barra de estado seleccione:

Del menú principal Project » Components » Microsoft Windows Common Controls 6.0

Dibuje un control Status Bar en la forma, seleccionelo y de clic al botón derecho del mouse para seleccionar la opción propiedades

El control Status Bar puede dividirse en paneles los cuales pueden ser referenciados por el índice que se les asigna de manera automática o en vez del índice numérico es posible escribir un nombre que lo identifique y que se utilizará para referenciar al panel, ejemplo:

nombreStatusBar.Panels(1).Text = "cadena de texto"

nombreStatusBar.Panels("nombreDescriptivo").Text = "cadena de texto"

Si la barra de estado sólo contendrá un panel se recomienda establecer su propiedad Style con el valor sbrSimple, para poder desplegar texto se utiliza la propiedad SimpleText:

nombreStatusBar.SimpleText = "cadena de texto"

Leer más...

Menús

Un menú consiste de varios elementos relacionados, algunos de los cuales son más visibles que otros, los elementos de un menú son:

  • Menu Bar, es una barra de herramientas especial en la parte superior de la pantalla, la cual contien las opciones que integra un menú, este elemento no se puede ocultar, pero es posible agregar o borrar opciones, en otras palabras es el menú principal.
  • Menu, contiene la lista de comandos que aparecen cuando se da clic a una opción del Menu Bar, en otras palabras es un submenú-principal.
  • Menu Item, tambien llamado command, hace referencia a una de las opciones listadas en un menú, cada menú debería contener al menos un command, en otras palabras son las opciones que integran un menú.
  • Submenu, un submenu o menú en cascada, es un menú que bifurca en otras opciones al seleccionar un item menu que contiene una flecha que apunta hacia abajo que indica que un nuevo menú podría aparecer cuando el usuario selecciona ese command.
  • Pop-Up Menu, es un menú sensitivo al contexto que tipicamente aparece cuando se da clic al botón derecho del mouse, este menú contiene comandos que son asociados con el objeto al que se dio clic.

    Existen 2 tipos de menús Pop-Up:

    1. System
    2. Custom

    Para crear un menú Pop-Up, se crea de igual forma a través del Menu Editor pero se selecciona la opción Visible para indicar que no estará visible, una vez creado el menú Pop-Up se invoca vía código:

     If Button = vbRightButton Then
    nombreForma.PopupMenu mnuNombreMenuPopUp
    End If

Visual Basic posee un editor para crear menús, para utilizarlo seleccione:

Del menú principal Tools » Menu Editor

Cuando este creando menús y requiera de un shortcut para indicar que la opción tiene esta capacidad antes de la letra que señala el shortcut escriba un ampersand (&).

Leer más...

Más sobre errores

Run-Time Errors: Errores en Tiempo de Ejecución

Run-Time Errors, aquellos errores imprevistos que ocurren durante la ejecución de una aplicación, por ejemplo si el usuario olvido insertar el medio de almacenamiento en la unidad lectora o si selecciona una entrada de archivo inválida.

Es posible prevenir estos errores en tiempo de ejecución a través de manejadores de errores que atrapan o interceptan errores y pueden corregir el problema, esperar una respuesta por parte del usuario que solucione el error o almacenar los datos antes de terminar la aplicación, los errores que pueden ser controlados son llamados Trappable Errors y le proceso de interceptar o atrapar un error se conoce como error trapping.

Manejador de Error (error handler) es una rutina para atrapar y responder a errores en la aplicación. Se recomienda agregar un manejador de errores a cualquier procedimiento donde se pueda anticipar la posibilidad de un error en tiempo de ejecución.

Cuando una aplicación ocurre desde el ambiente de desarrollo Visual Basic muestra un mensaje que permite entrar en modo de búsqueda de errores (Debug) o terminar la aplicación.

Si un error ocurre en tiempo de ejecución cuando la aplicación está corriendo como un archivo ejecutable Visual Basic muestra un mensaje de error y termina la aplicación.

El proceso de diseñar un manejador de errores involucra 3 pasos:

  1. Establecer o habilitar un error trap (proceso de atrapar un error) indicando a la aplicación donde bifucar cuando ocurra un error.

    Visual Basic habilita un error trap cuando ejecuta la sentencia On Error, el error trap permanece habilitado mientras el procedimiento contenido está activo. Sólo un error trap a la vez puede ser habilitado en cualquier procedimiento, por lo que un error trap debe residir en el procedimiento local, no es posible utilizar la sentencia On Error para bifurcar hacia otro procedimiento.

    Para deshabilitar un error trap utilice la sentencia On Error GoTo 0.

  2. Escribir una rutina de manejo de errores que responda a todos los errores anticipadamente.

    El primer paso en la escritura de una rutina de manejo de errores es agregar una etiqueta para marcar el principio del manejo de errores. La etiqueta deberia tener un nombre descriptivo y seguida de un dos puntos (:).

    Una convención es colocar el código de manejo de errores al final del procedimiento con una sentencia Exit Sub o Exit Function inmediatamente antes de la etiqueta, esto permite al procedimiento eliminar la ejecución del manejo de errores si no ocurren errores.

  3. Salir de la rutina de manejo de errores.

    es posible salir de una rutina de manejo de errores utilizando la sentencia Resume o Resume Next, la sentencia Resume podría ejecutar la línea de código que causa el error, mientras que la sentencia Resume Next podría ejecutar la línea de código siguiente a la línea de código que causa el error.

    Por lo general se podría utilizar Resume en cualquier momento que el manejador de errores pueda corregir el error y Resume Next cuando el manejador de errores no puede corregir el error.

  • Resume, regresa a la sentencia que causo el error, utilice esta sentencia para repetir una operación después de corregir el error.
  • Resume Next, regresa a la sentencia siguiente de una que causo el error.
  • Resume línea o etiqueta, regresa a una línea o número de línea especifica.

La sentencia On Error Resume Next causa que los errores sean ignorados, si un error ocurre en tiempo de ejecución, el proceso continua con la línea siguiente.

La sentencia On Error GoTo 0 deshabilita el error trap.

   Sub nombreProcedimiento()
On Error GoTo miManejadorDeErrores
'instrucciones
Exit Sub
miManejadorDeErrores:
'instrucciones
REsume[0]/Resume Next/Resume linea/Err.Raise:=número
End Sub

Objeto Err

El objeto Err contiene información acerca del error ocurrido, este objeto tiene propiedades y métodos que pueden utilizarse para checar que error ocurrio, para limpiar el valor del error o para causar un error.

Propiedades del Objeto Err

  • Number, entero que indica el último error ocurrido, en algunos casos el manejador de errores puede ser habilitado para corregir un error y continuar con el proceso sin interrumpir al usuario o notificar al usuario de un error y entonces tomar una acción basada en la respuesta del usuario.
  • Description, string que contiene una descripción del error ocurrido.
  • Source, contiene el nombre de la aplicación que genero el error.

El objeto Err tiene 3 propiedades adicionales.

  Private Sub abrirArchivo_Click()
On Error GoTo miManejadorErr
Open "c:\archivoInexistente.txt" For Input As #1
End
miManejadorErr:
Dim strErr
strErr = strErr & "Description : " & Err.Description & Chr(13)
strErr = strErr & "HelpContext : " & Err.HelpContext & Chr(13)
strErr = strErr & "Number : " & Err.Number & Chr(13)
strErr = strErr & "Source : " & Err.Source & Chr(13)
MsgBox strErr
Resume Next
End Sub

Métodos del Objeto Err

  • Clear, limpia un error cuando se establece el valor de Err.Number con 0, utilice este método cuando se manejen errores inline
  • Raise, causa un error, utilice este método para pasar un error de regreso al procedimiento que lo invoco. Si se requiere generar y atrapar errores propios, comience el esquema de numeración con 32767 y trabaje los números de forma descendente: Err.Raise 23000

Un manejador de errores Inline no contiene etiquetas o sentencias Resume.

Manejo de Errores Inline

Es posible escribir manejadores de errores Inline en vez de bifurcar al manejador de errores establecido, para ello:

  1. Incluir en el código la sentencia On Error Resume Next
  2. Evaluar el valor Err.Number después de cada sentencia que pueda generar un error
  3. Utilizar el método Err.Clear restablecer el número de error

Error Trapping

Existen 3 procesos generales para interceptar o atrapar un error:

  1. Break on All Errors, si se establece esta opción Visual Basic ignora cualquier sentencia On Error y continua en break mode si ocurre cualquier error en tiempo de ejecución. Esta opción es utilizada para buscar errores mientras se ejecuta la aplicación dentro del ambiente de desarrollo Visual Basic.
  2. Break in Class Module, si se establece esta opción cuando se busca un error en un proyecto ActiveX Component, causa que el componente ActiveX continue en Break mode antes que pasar el error de regreso a la aplicación cliente.
  3. Break on Unhandled Errors, cuando se establece esta opción, Visual Basic continua en Break mode sobre cualquier error que no tenga un manejador de error especifico.

Para establecer alguno de los procesos anteriores seleccione:

Del menún principal Options » General Tab » seleccionar uno de los procesos Error Trapping

Leer más...

Validación de datos

Validación de Datos

Es posible validar la entrada de datos, así como los datos mismos a través del uso de propiedades, métodos, eventos y funciones Visual Basic.

Función isNumeric

La función isNumeric regresa el valor True si el argumento es numérico, si el argumento no es numérico regresa el valor False.

    If isNumeric(txtNombre.Text) Then
'instrucciones
Else
'Error : Dato inválido, se requiere un valor numérico
End If

Consideraciones para los eventos del Teclado

La programación que responde a un evento se le conoce como Controlador, si esta programación responde a un evento de teclado es un Controlador de teclado, el cual puede reaccionar a nivel control, es decir, la programación es para un control específico o a nivel formulario en donde el formulario primero responde a los eventos del teclado.

Eventos del Teclado:

  1. KeyPress, al presionar una tecla correspondiente a un carácter ASCII.
  2. KeyDown, al presionar cualquier tecla.
  3. KeyUp, al dejar de presionar cualquier tecla.

Unicamente el objeto que tiene el enfoque puede recibir un evento del teclado.

Un formulario tiene el enfoque cuando este está activo y ningún otro control tiene el enfoque.

Si se establece la propiedad del formulario KeyPreview con el valor True, el formulario recibe todos los eventos del teclado para cada control antes de que el control los reconozca lo que provoca que al presionar una tecla determinada se produzca una misma acción sin importar que control tenga el enfoque en ese momento.

Utilice los eventos KeyDown y KeyUp para detectar condiciones que evento KeyPress no detecta:

  • Combinaciones [Caps Lock] + [Ctrl] + [Alt].
  • Teclas de dirección (izquierda, derecha, arriba y abajo).
  • [PgUp] , [PgDn], [Home], [Del]
  • Teclado numérico.
  • KeyPress unicamente responde a una tecla que se está presionando
  • Teclas de función no asignadas a comandos de menú.

Los eventos del teclado no se excluyen mutuamente, al presionar una tecla se disparan los eventos:

  • KeyDown y
  • KeyPress

Seguidos del evento:

  • KeyUp

Si se presiona una tecla que el evento KeyPress no detecta unicamente se dispara el el evento:

  • KeyDown, seguido de
  • KeyUp

Evento KeyPress

El evento KeyPress ocurre cuando un usuario proporciona un carácter ASCII estándar, pero no responde a teclas especiales como teclas de función, teclas de navegación, la tecla [Del], ya que no proporcionan caracteres ASCII estándar, utilice los eventos KeyDown y KeyUp para responder a este tipo de teclas.

Este evento también reconoce las teclas [Enter], [Tab] y [Bk sp].

Las teclas de función no provocan un evento KeyPress.

Eventos KeyUp y KeyDown

En cualquier momento hay una actividad del teclado y es registrada a través de los eventos KeyDown y KeyUp, cada uno de estos eventos provee un código de tecla que identifica que tecla fué presionada.

No hay garantía de que el evento KeyUp ocurra por cada evento KeyDown, si el usuario mantiene presionada una tecla se reciben múltiples eventos KeyDown y sólo un evento KeyUp, por ejemplo el siguiente código supone validar la entrada para aceptar sólo dígitos y borrar cualquier caracter que no sea dígito, pero si se mantiene presionada una tecla ocurren varios eventos KeyPress y sólo un evento KeyUp por lo que no permite borrar siempre los caracteres que no sean dígitos:

Dim val Private Sub txtNumero2_KeyPress(KeyAscii As Integer) val = txtNumero2.Text End Sub Private Sub txtNumero2_KeyUp(KeyCode As Integer, shift As Integer) If KeyCode <> 57 Then txtNumero2.Text = val End If End Sub

El argumento keyascii regresa un valor entero que corresponde a un código de carácter ASCII.

Keycode

A través del argumento Keycode es posible identificar el valor ASCII o la constante del código de tecla.

El siguiente código muestra el Keycode del caracter ingresado, pruebe cual es el resultado cuando se ingresa el caracter a o A.

Private Sub txtKeycode_KeyDown(KeyCode As Integer, shift As Integer) MsgBox KeyCode End Sub

Salida: Para a y A el Keycode es 65.

Para identificar si es a o A utilice el argumento shift

Las teclas de números y las teclas de signos de puntuación tienen los mismos códigos de tecla que el código ANSI del número en la tecla, por ejemplo 1 y ! es el valor que regresa Asc(1), por lo que si se requiere diferenciar entre 1 y ! es necesario utilizar el argumento shift.

Argumento shift

Es posible utilizar el argumento shift con los eventos KeyDown y KeyUp para determinar el estado de la tecla, por ejemplo si son mayúsculas:

Private Sub txtCompany_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKey_caracter_a_determinar And Shift = 1 Then MsgBox "caracter en mayúscula" End Sub

Chr

La función Chr(keyAscii) convierte un código carácter ASCII en el carácter correspondiente

Ucase, Lcase

Las funciones Ucase(string) y Lcase(string) convierten una cadena a mayúsculas o minúsculas respectivamente.

El siguiente código convierte los caracteres ingresados en el campo a minúsculas:

Private Sub txtLower_KeyPress(KeyAscii As Integer) KeyAscii = Asc(LCase(Chr(KeyAscii))) End Sub

El siguiente código convierte los caracteres ingresados en el campo a mayúsculas:

Private Sub txtUpper_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) End Sub

Nota: utilice el examinador de objetos ([F2]) para consultar las constantes de teclas (KeyCodeConstants).

Si requiere modificar el comportamiento predeterminado de una tecla simplemente asigne un valor distinto a KeyAscii:

Private Sub txtComportamiento_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 End Sub

El código anterior evita la reproducción del sonido que se produce cuando se pulsa la tecla enter cuando no hay ninún botón predeterminado en el formulario.

GotFocus, LostFocus y SetFocus

La habilidad para recibir las entradas del usuario a través del mouse o teclado recibe el nombre de foco (Focus). En Visual Basic una forma puede tener varias cajas de texto, pero sólo una caja de texto tiene el foco y puede recibir la entrada a través del teclado.

Los eventos GotFocus y LostFocus ocurren cuando un objeto recibe el foco o cuando pierde el foco. No todos los controles tienen la habilidad de recibir la entrada del usuario.

Para asignar el foco a un control se invoca el método SetFocus

Evento Validate

El evento Validate ocurre antes de que un control pierda el foco y sólo ocurre cuando la propiedad CausesValidation del control que recibe el foco es True.

El evento Validate también incluye el argumento Cancel el cual causa que el control mantenga el foco cuando su valor es True.

Private Sub txtNombre_Validate(Cancel As Boolean) If Not IsNumeric(txtNombre.Text) Then Cancel = True End If End Sub

Por default la propiedad CausesValidation tiene el valor True, si se cambia el valor a False no se logra el efecto deseado que es no permitir cambiar el foco a otro control hasta que se proporcione un valor válido para el control que se está evaluando.

Propiedad MaxLength

La propiedad MaxLength puede ser utilizada para establecer el número máximo de caracteres permitidos que pueden contener una caja de texto, el sistema emite un sonido (beep) cuando el usuario trata de escribir más caracteres que los especificados en la propiedad.

Por default el valor de la propiedad MaxLength tiene el valor 0 para no reestringir el número de caracteres a escribir. Es posible establecer esta propiedad en tiempo de diseño o ejecución.

Propiedad PasswordChar

La propiedad PasswordChar permite sustituir la entrada de caracteres de una caja de texto por un caracter especifico a fin de ocultar lo que escribe el usuario, lo cual es muy común para la entradas de contraseñas o claves. La propiedad Text contiene exactamente lo que el usuario escribio.

Propiedad Locked (Habilitado/Deshabilitado)

La propiedad Locked determina cuando el usuario puede editar la entrada de una caja de texto, si la propiedad se establece con el valor True el usuario puede ver el contenido de la caja de texto pero no puede editarlo, es decir, la propiedad Locked hace que una caja de texto sea sólo de lectura hasta que la propiedad cambie de valor programaticamente.

Propiedad Mask

La propiedad Mask define una mascara de entrada, la cual se puede establecer en tiempo de diseño o ejecución.

Esta propiedad en muy útil para aceptar entradas de datos que coincidan con el formato especifico de la mascara, este formato se compone de caracteres especificos para la entrada de mascaras, por ejemplo los caracteres numericos corresponden al caracter #, para caracteres alfabéticos se emplea el caracter ? suponga que desea que la entrada solo acepte 3 caracteres numéricos, para ello escriba:

La propiedad Mask corresponde a un control especial llamado "Microsoft Masked Edit Control 6.0", no esta contemplado en Toolbox por lo que es necesario agregar el control, para ello selecccione:

Opción project del menú » Components » Microsoft Masked Edit Control 6.0

nombreForma.nombreMaskEdBox.Mask = "###"

Para quitar la mascara del control, solamente la cadena vacía a la propiedad Mask

nombreForma.nombreMaskEdBox.Mask = ""

Propiedad Format de un Control MaskEdBox

La propiedad Format define el formato que se desea utilizar cuando se despliega e imprime el contenido de un control.

Propiedad ClipText de un Control MaskEdBox

Al especificar una propiedad Mask para un control MaskEdBox si se trata de desplegar el resultado contendra los caracteres de la mascara y lo que el usuario escribio, si sólo necesitamos obtener lo que el usuario escribio se obtiene a través de la propiedad ClipText, ejemplo:

Form1.mascara.Mask = "(#-#-#)" 'podria mostrar "(4-6-9)" MsgBox mascara.ClipText 'podria mostrar "469"

Propiedad AutoTab de un Control MaskEdBox

Una vez que el usuario proporciono la entrada necesaria en un control MaskEdBox es posible establecer la propiedad AutoTab con el valor True para indicar que de manera automática al terminar la entrada válida de datos se mueva al siguiente control.

Evento ValidationError de un Control MaskEdBox

Una vez que el usuario proporciono la entrada en un control MaskEdBox es posible utilizar el evento ValidationError para verificar que la entrada sea la correcta, por ejemplo el usuario puede no completar la entrada si omite escribir un caracter.

Propiedad Enabled

La propiedad Enabled nos permite habilitar o desahabilitar un control.

nombre_Control.enabled = False 'deshabilita el control

Recorrer los Controles Contenidos en una Forma

Es posible realizar un tipo de acción con cada uno de los controles que contiene una forma sin necesidad de conocer de antemano su propiedad Name o la cantidad de controles o su tipo, para ello empleamos la sentencia de control For Each y la función TypeOf, ejemplo:

Dim ctrl As Control Dim nCajasTexto Dim nMascaras Dim nEtiquetas Dim nBotones For Each ctrl In Form1.Controls If TypeOf ctrl Is TextBox Then nCajasTexto = nCajasTexto + 1 If TypeOf ctrl Is MaskEdBox Then nMascaras = nMascaras + 1 If TypeOf ctrl Is Label Then nEtiquetas = nEtiquetas + 1 If TypeOf ctrl Is CommandButton Then nBotones = nBotones + 1 'ctrl.nombrePropiedad = "valor" 'Es posible asignar valores a cada control Next MsgBox "Esta forma contiene " & CStr(nCajasTexto) & " cajas de texto" _ & Chr(13) & CStr(nMascaras) & " mascaras" _ & Chr(13) & CStr(nEtiquetas) & " etiquetas" _ & Chr(13) & CStr(nBotones) & " botones"

¿Los Datos Proporciondos son Correctos?

Otra forma de validar datos es checar la entrada de los mismos antes de continuar su proceso, para ello se válida dato por dato:

  Private Sub cmdProcesarDatos_Click()
Dim i, nPos
lblMsg.Caption = ""
If txtNombreUsr = "" Then
lblMsg.Caption = Chr(13) & "El nombre de usuario es requerido."
txtNombreUsr.SetFocus
Exit Sub
End If
For i = 0 To Len(txtNombreUsr.Text)
nPos = InStr(txtNombreUsr.Text, CStr(i))
If nPos > 0 Then
lblMsg.Caption = Chr(13) & "Nombre Usuario no puede contener números"
txtNombreUsr.SetFocus
Exit Sub
End If
Next
If Not IsNumeric(txtNumDepto.Text) Then
lblMsg.Caption = Chr(13) & "Número de Departamenteo sólo puede contener dígitos"
txtNumDepto.SetFocus
Exit Sub
End If
lblMsg.ForeColor = vbWhite
lblMsg.Caption = Chr(13) & "Procesando Datos, espere..."
End Sub
Leer más...

Referencia técnica

Referencia Técnica

Si requiere de ayuda técnica sobre Visual Basic, seleccione del menú principal:

View » Object Browser o la tecla [F2]

Por ejemplo seleccione para saber cuales son las constantes Visual Basic.

Leer más...

viernes, 8 de agosto de 2008

Ejemplos

ListBox : Standard Control

El Control Estándar ListBox despiega una lista de elementos de los cuales el usuario puede seleccionar uno o más elementos.

Existen 2 formas de agregar elementos a un ListBox:

  1. Seleccionar de la ventana de propiedades List y después de ingresar un elemento presionar las teclas [Ctrl]+[Enter]
  2. Por medio de código a través del método nombre_ListBox.addItem

Para eliminar elementos del control utilice el método nombre_ListBox.RemoveItem

Para obtener el valor del elemento seleccionado utilice nombre_ListBox.ListIndex

Para obtener el índice del elemento seleccionado utilice nombre_ListBox.Text

Para establecer la selección de más de un elemento utilice la propiedad nombre_ListBox.MultiSelect

ComboBox : Standard Control

El Control Estándar ComboBox provee más versatilidad que un control estándar ListBox, combinando las características de un control estándar TextBox y ListBox, además de que es posible que el usuario proporcione nuevos elementos para el control o seleccionar un elemento de la lista.

Para agregar los elementos que contendrá el control es posible hacerlo de 2 formas:

  1. Desde la ventana de propiedades seleccionar itemData.
  2. Desde el código a través del método addItem del control, ejemplo:
     nombre_ComboBox.AddItem "Rojo", 0
    nombre_ComboBox.AddItem "Amarillo", 1
    nombre_ComboBox.AddItem "Azul", 2

Para eliminar elementos del control utilice el método nombre_ComboBox.RemoveItem

Para obtener el valor del elemento seleccionado utilice nombre_ComboBox.ListIndex

Para obtener el índice del elemento seleccionado utilice nombre_ComboBox.Text

OptionButton : Standard Control

El Control Estándar OptionButton presenta un grupo de opciones de las cuales el usuario sólo puede seleccionar una.

Se recomienda crear un grupo de OptionButton's agregue un control Frame o PictureBox para contener al grupo de opciones.

La propiedad Value indica si está o no seleccionado el control.

Selección de Texto

Es posible seleccionar texto de algunos controles y para obtener el texto seleccionado se utiliza la propiedad SelText, para saber a partir de que posición comenzo la selección utilice SelStart y para obtener la cantidad de caracteres seleccionados o longitud de la selección utilice SelLength.

Recuerde que puede utilizar la sentencia With para trabajar sobre un mismo objeto.

Controles Estándar Avanzados

En Visual Basic los controles estándar avanzados son:

  1. DriveListBox, despliega una lista de todos los drives válidos del sistema del usuario.

    nombre_DirListBox.Path = nombre_DriveListBox.Drive

  2. DirListBox, despliega directorios y rutas.

    nombre_FileListBox.Path = nombre_DirListBox.Path

  3. FileListBox, despliega la lista de archivos del direcorio especificado por la propiedad path.

    nombre_Image.Picture = LoadPicture(nombre_FileListBox.Path + "\" + nombre_FileListBox.FileName)

  4. Timer, se utiliza para ejecutar código por intervalos de tiempo causados por el evento Timer.
    • Interval, propiedad expresada en milisegundos y representa un valor entre 1 y 65,535. 1,000 milisegundos es igual a 1 segundo.
    • Enabled, esta propiedad determina if el control Timer puede invocar el evento Timer en el tiempo especificado por la propiedad Interval.
         Private Sub nombreTimer_Timer()
      nombre_Label.Caption = Time 'La función time se ejecuta cada segundo
      End Sub

Fuente : Estilo

Es posible establecer el estilo que tendrá la fuente para ciertos controles:

    Dim LFont As New StdFont
LFont.Bold = True
LFont.Italic = True
LFont.Size = 20
LFont.Underline = True
LFont.Weight = 10
Set Label1.Font = LFont

Lo destacable en este ejemplo es la palabra clave Set cuya acción es precisamente aplicar las nuevas propiedades de la etiqueta, también lo anterior es posible por el uso del objeto StdFont.

Consulte que controles aceptan el objeto StdFont, por ejemplo los formularios e imagenes soportan una propiedad adicional FontTransparent la cual hace posible establecer un efecto de transparencia.

Print

Los formulario o cuadros de imagen tienen un método Print que es capaz de enviar texto a un formulario o cuadro de imagen o si desea enviar texto a una impresora utilice el método Print del objeto Printer.

Private Sub Form_Load()
Dim i As Integer
For i = 0 To 1000 Step 200
CurrentX = i
CurrentY = i
Print "Hello World!"
Next
End Sub

Nota: es importante que la propiedad AutoRedraw este activada para poder visualizar los mensajes, de otra manera no seran visibles.

Clipboard

Es posible enviar texto e imagenes al portapapeles (Clipboard), por ejemplo para enviar texto y recuperarlo escriba:

 Private Sub cmdTo_Click()
Clipboard.SetText txtSrc
End Sub
Private Sub cmdFrom_Click()
txtTarget = Clipboard.GetText()
End Sub

Si requiere enviar gráficos entonces utilice los métodos:

  • SetData
  • GetData

Es posible utilizar los comandos de Copiar, Cortar y Pegar para que funcionen con cualquier cuadro de texto que tenga el enfoque, para ello se emplea la propiedad ActiveControl del objeto Screen.

También es posible trabajar con otros formatos de datos para ello utilice las constantes de formatos:

  • vbCFLink
  • vbCFText
  • vbCFBitmap
  • vbCFMetafile
  • vbCFDIB
  • vbCFPalette
Leer más...

Tipos de controles

Existen 3 categorias de controles en Visual Basic:

Controles Intrínsecos o Standard

Estos controles están contenidos en Visual Basic, por ejemplo un CommandButton o TextBox, también son llamados controles intrínsecos y están siempre disponibles en ToolBox.

Los controles ActiveX y los Objetos Insertables se pueden quitar o agregar al cuadro de herramientas.

Controles ActiveX

Este tipo de controles están contenidos en archivos separados o independientes con extensión .ocx y pueden ser agregados a ToolBox.

Objetos Insertables

Estos controles son típicamente objetos OLE como un objeto de Excel WorkSheet y pueden ser agregados a ToolBox.

Leer más...

Break mode

Cuando se desarrolla una aplicación Visual Basic, principalmente se trabaja en 2 modos, en modo de diseño y de ejecución.

  1. Design Mode, donde el código es creado y editado, pero no es posible checar los resultados hasta que el código se ejecute.
  2. Run Mode, donde la ejecución del programa es checada pero no es posible realizar cambios al código.
  3. Break mode, donde es posible detener la operación de una aplicación y proporcionar una foto de las condiciones en cualquier momento, para ello es necesario establacer puntos de detención (break points), utilizar sentencias Stop, métodos Debug.Assert y Watch para expresiones.
  4. Para establecer un break point situese en la línea que desea que al ejecutarse el código se detenga en este punto y de clic en el área gris a la izquierda de la línea o simplemente pulse la tecla [F9].

    Para indicar que se detenga la ejecución del código en una línea especifica, pues escribir la sentencia Stop para ello, necesitara eliminar esta línea cuando las pruebas finalicen.

    Puede utilizar el método Debug.Assert para insertar un break point condicionalmente, ya que el método utiliza una expresión booleana para determinar cuando hacer funcionar el break point, sintaxis:

    Debug.Assert valorAexaminar <>

    Ejemplo:

        iCount = 0
    While iCount <= 5
    Debug.Assert iCount = 3
    MsgBox iCount
    iCount = iCount + 1
    Wend

    El objeto Debug tiene 2 propiedades: Assert para indicar un break point y print para mostrar en una ventana el valor de la condición que se evalua.

    El método Print permite escribir en la forma los valores que recibe como parámetros.

Leer más...

Tipos de errores

Generalmente los errores de programación caen en las siguientes cateforias:

  1. De Sintaxis, ocurren cuando el código se construye incorrectamente, por ejemplo se escribe mal una sentencia o se omite o se requiere de cierta puntución, o no se escriben estructuras completas como por ejemplo un If sin End If o un For sin Next.

    Para ayudar a minimizar este tipo de errores Visual Basic cuenta con la opcion Auto Syntax Check para habilitarla seleccione:

    Menú principal Tools » Options » Editor tab » Options » Auto Syntax Check

  2. En Tiempo de Ejecución, ocurren cuando una sentencia sintácticamente válida intenta una operación que es imposible de realizar, por ejemplo tratar de leer datos de un archivo inexistente o dividir entre 0.
  3. De lógica, ocurren cuando una aplicación no realiza lo esperado, este tipo de errores son especialmente dificiles de encontrar porque sintácticamente puede ser código válido y ejecutarse sin realizar ninguna operación inválida pero producir resultados incorrectos siendo la única forma de verificar su funcionamiento es probar y analizar los resultados.
Leer más...

Sentecnias de control

Las sentencias de control permiten evaluar condiciones y en base al resultado tomar la decisión de seleccionar entre varias alternativas posibles el flujo correcto.

If - Then

Se utiliza la sentencia If - Then cuando se necesita tomar una decisión dada la evaluación de una expresión para elegir más de 1 alternativa posible.

La sentencia If - Then se evalua cuando una condición es verdadera (True) o falsa (False).

Sintaxis:

   If condición Then cláusula 

El ejemplo anterior no requiere del uso de la sentencia End If, si sólo a continuación existe una línea de código, si es más de una línea de código utilice:

   If condición Then
[sentencias]
End If

If - Then - Else

La sentencia If - Then - Else es un concepto elaborado de la sentencia If - Then. Un bloque If - Then - Else permite definir 2 bloques de código y sólo un bloque se ejecutará dependiendo el resultado de una condición.

Sintaxis:

   If condición Then
[sentencias]
Else
[sentencias]
End If

If - Then - ElseIf

La sentencia If - Then - ElseIf permiten ejecutar 1 bloque de código de varios bloques posibles. Esta sentencia lógicamente es igual que la sentencia Select - Case.

Sintaxis:

   If condición1 Then
[sentencias]
ElseIf condición2 Then
[sentencias]
ElseIf condición3 Then
[sentencias]
Else
[sentencia por default] 'Si ninguna de las condiciones anteriores se cumple
End If

Select - Case

Se recomienda emplear la sentencia Select - Case en vez de utilizar una sentencia If - Then cuando esta tiene más de 2 condiciones a evaluar. La estructura de una sentencia Select - Case es similar a la estructura de la sentencia If - Then - ElseIf.

La sentencia Select - Case permiten al programa seleccionar más de 2 alternativas, donde la evaluación de la expresión se realiza sólo una vez y es comparado contra los múltiples valores posibles para determinar cual bloque de código es ejecutado.

Sintaxis:

   Select Case condicionAevaluar
[Case expresion1]
[sentencias]
[Case expresion2]
[sentencias]
[Case expresion3]
[sentencias]
[Case Else]
[sentenciasDefault]
End Select

Do - Loop

La estructura Do - Loop proporciona al programa la habilidad de ejecutar un bloque de código un número indeterminado de veces mientras se cumpla una condición.

Esta sentencia tiene 2 categorias:

  1. Donde la expresión es evaluada al final del ciclo, por lo que se asegura que el código se ejecuta al menos 1 vez.

    Do - Loop While

    La estructura Do - Loop While evalua la condición después de ejecutar el código y repetir su ejecución hasta que la evaluación de la condición sea false.

     Do
    [sentencias]
    Loop While [condición]

    Ejemplo:

        iCount = 0
    Do
    MsgBox iCount
    iCount = iCount + 1
    Loop While iCount < 0

    Do - Loop Until

    La estructura Do - Loop Until evalua la condición después de ejecutar el código y repetir su ejecución hasta que la evaluación de la condición sea True.

     Do
    [sentencias]
    Loop Until [condición]

    Ejemplo:

        iCount = 0
    Do
    MsgBox iCount
    iCount = iCount + 1
    Loop Until iCount > 0
  2. Donde la expresión es evaluada al principio del ciclo, sólo si se cumple la condición el código se ejecuta.

    Do While - Loop

    La estructura Do While - Loop evalua la condición antes de ejecutar el código. El código del bloque sólo es ejecutado si la evaluación de la condición es True y repite la ejecución hasta que la expresión sea evaluada como False.

    Emplee esta sentencia en aquellos casos donde no se conoce de antemano cuantas veces debe ejecutarse el bloque de código y entonces la condición determina cuando debera de pararse la ejecución del bloque de código.

     Do While condición
    [sentencias]
    Loop

    Ejemplo:

        iCount = 0
    Do While iCount < 0
    MsgBox iCount
    iCount = iCount + 1
    Loop

    Do Until - Loop

    La estructura Do Until - Loop evalua la condición antes de ejecutar el código. El código del bloque sólo es ejecutado si la evaluación de la condición es False y repite la ejecución hasta que la expresión sea evaluada como True.

     Do Until condición
    [sentencias]
    Loop

    Ejemplo:

        iCount = 0
    Do Until iCount = 0
    MsgBox iCount
    iCount = iCount + 1
    Loop

For - Next

La sentencia For - Next se emplea cuando se conoce anticipadamente cuantas veces deberá ejecutarse un bloque de código, esto es posible ya que se utiliza un contador que mantiene y controla el número de veces que se ejecuta el bloque.

Sintaxis:

   For counter = valorInicial To valorFinal [incremento positivo|negativo]
[sentencias]
Next[Counter]

For Each - Next

For Each es similar a For - Next a diferencia que repite un grupo de instrucciones por cada elemento de una colección de objetos, en vez de repetir las instrucciones un número especifico de veces.

Sintaxis:

   For Each elemento In grupo
[sentencias]
Next

Sentencia Exit

La sentencia Exit permite salir de un ciclo, procedimiento, función, su sintaxis es simple, después de escribir la sentencia Exit escriba el nombre de la sentencia de la cual desea salir, ejemplo:

   Exit For
Exit Do
Leer más...

Operadores de comparación y lógicos

En Visual Basic existen 6 operadores para realizar comparaciones entre valores:

OperadorDescripción
< Menor que
<= Menor o igual a
> Mayor que
>= Mayor o igual a
= Igual
<> No Igual o Diferente

Operadores Lógicos

Cuando Visual Basic compara 2 expresiones, regresa uno de dos valores posibles: True o False, pero Visual Basic no entiende True o False por lo que utiliza valores numéricos para representarlos, True o False son valores booleanos donde 0 es False y 1 es True.

En Visual Basic existen 6 operadores lógicos:

OperadorDescripción
And Cuando ambas expresiones son verdaderas
Or Evalua una de dos expresiones
Not Niega una expresión
Xor La expresión completa se considera verdadera, si las 2 expresiones evaluadas no son verdaderas o ambas son falsas
Eqv Ambas expresiones debe ser verdaderas o falsas para evaluar la expresión completa como verdadera
Imp La expresión completa es verdadera excepto cuando la primer expresión es verdadera y la segunda expresión es falsa
Leer más...

Funciones fecha, tiempo, cadenas de texto, RGB

En Visual Basic, los valores de Fechas y Tiempo, son almacenados internamente como números, desde la fecha January 1, 100 December 31 hasta January 1, 9999 December 31 o desde la hora 0:00:00 hasta 23:59:59.

Al utilizar números para representar Fechas y Tiempo, es posible realizar cálculos que involucren tiempo, por ejemplo para agregar 3 días a la fecha actual:

   Dim dtHoy As Date
dtHoy = Date()
Dim dtHoyMas3 as Date
dtHoyMas3 = dtHoy + 3
MsgBox CStr(dtHoy) + " - " + CStr(dtHoyMas3)

Funciones que extraen porciones de Fechas y Tiempo:

FunciónEjemplo
Year() Year(Now)
Month() Month(Now)
Day() Day(Now)
Weekday() Weekday(Now)
Hour() Hour(Now)
Minute() Minute(Now)
Second() Second(Now)
   MsgBox "Año: " + CStr(Year(Now)) + Chr(13) _
+ "Mes: " + CStr(Month(Now)) + Chr(13) _
+ "Día: " + CStr(Day(Now)) + Chr(13) _
+ "Día de la Semana: " + CStr(Weekday(Now)) + Chr(13) _
+ "Hora: " + CStr(Hour(Now)) + Chr(13) _
+ "Minuto: " + CStr(Minute(Now)) + Chr(13) _
+ "Segundo: " + CStr(Second(Now))

Funciones de conversión de Fechas y Tiempo:

FunciónEjemplo
DateSerial([year] [month] [day]) regresa un Variant(Date) del año, mes o día especificado
TimeSerial([hour] [minute] [second]) regresa un Variant(Time) de la hora, minuto o segundo especificado
DateValue() convierte un string a un Variant(Date)
TimeValue() convierte un string a un Variant(Date)
DateAdd() regresa un Variant(Date) que contien una fecha de la cual un intervalo de tiempo especifico es agregado
DateDiff() regresa un Variant(Long) especificando el intervalo de tiempo entre 2 fechas especificas
DatePart() regresa un Variant(Integer) que contiene la parte especifica de una fecha dada.

MsgBox DateSerial(Year(Now), Month(Now) + 1, 1) - 1 'Regresa el último día del mes actual

Días que faltan para terminar el mes
MsgBox DateDiff("d", Now, (DateSerial(Year(Now), Month(Now) + 1, 1) - 1))

Función Format

La función Format convierte un valor numérico en una cadena de texto y le proporciona control sobre la apariencia de la cadena.

La función Format provee de flexibilidad al desplegar formatos especificos para fechas y tiempo. En general la función Format acepta un valor numérico y lo convierte a un string en el formato especificado por el argumento que es enviado a la función, ejemplos:

    MsgBox Format(Now, "m/d/yy")
MsgBox Format(Now, "dd/m/yy")
MsgBox Format(Now, "dddd, mmmm dd, yyyy")
MsgBox Format(Now, "dddd, mmmm dd, yyyy. hh:mm AM/PM")
MsgBox Format(1123123123123#, "Currency")
FunciónDespliega
General Number Un número como es, sin separadores de miles.
Currency Un número, con separadores de miles.
Fixed Al menos un dígito a la izquierda y 2 a la derecha del separador decimal.
Percent Número multiplicado por 100 con un signo de por ciento (%) agregado a la derecha
General Date Una fecha o tiempo.
Long Date Una fecha de acuerdo al formato largo de la fecha del sistema.
Medium Date Una fecha de acuerdo al formato medio de la fecha del sistema.
Short Date Una fecha de acuerdo al formato corto de la fecha del sistema.
Long Time El tiempo de acuerdo al formato largo de Tiempo del sistema, horas, minutos y segundos.
Medium Time El tiempo en el formato de 12 horas utilizando horas y minutos y el tiempo designado A.M./P.M.
Short Time El tiempo usando el formato de 24 horas
Yes/No Usualmente 1 - Yes, 0 - No
True/False Usualmente 1 - True, 0 - False
On/Off Usualmente 1 - On, 0 - Off

Funciones para Manipular Cadenas de Texto

Visual Basic posee funciones para manipular cadenas de texto:

FunciónAcción
StrComp Compara 2 strings
Format, LCase,Ucase Convierte a Mayúsculas o Minúsculas
Space,String Crea un string repitiendo un caracter
Len Encuentra la longitud de un string
Format Formatea un string
LSet, RSet Justifica un string
InStr, InStrRev,Left,LTrim,Mid,Right,RTrim,Trim Manipula strings
StrConv Convierte strings

Funcion RGB

Un color se representa mediante un entero de tipo Long, por lo que para definir un color se puede utilizar la función RGB, todos los colores se pueden obtener a través de la combinación de 1 o varios colores básicos los cuales son rojo, verde y azul, la función RGB espera como parámetros los valores para cada uno de estos colores los cuales estarán comprendidos en el rango de 0 a 255, siendo el 0 la menor intensidad y 255 la mayor, de esta manera la función regresa un valor que puede ser asignado por ejemplo a un control cuya propiedad establezca el color.

 Private Sub Form_Load()
Dim LnIndice As Integer
For LnIndice = 0 To 255
cmbRed.AddItem CStr(LnIndice)
cmbGreen.AddItem CStr(LnIndice)
cmbBlue.AddItem CStr(LnIndice)
Next
cmbRed.ListIndex = 0
cmbGreen.ListIndex = 0
cmbBlue.ListIndex = 0
End Sub
Private Sub cmdRGB_Click()
Me.BackColor = RGB(cmbRed, cmbGreen, cmbBlue)
End Sub

Otra manera de establecer el color es mediante el empleo de números hexadecimales equivalentes al color deseado, &HBBGGRR&, donde BB representa la cantidad de azul, GG la cantidad de verde y RR la cantidad de rojo.

Leer más...

Paso de argumentos por referencia.

Significa que el valor del argumento enviado es una referencia al valor original, por lo que si modificamos el valor, se esta modificando el valor original.

Para especificar que el parametro enviado se pasa por referencia se precede la palabra reservada ByRef

Para especificar si un parametro es opcional se antecede la palabra clave Optional, con lo cual se indica que el parametro no es obligatorio.

En caso de que se desconozca el número de parámetros a enviar es posible indicarlo mediante la palabra reservada ParamArray lo cual significa que se acepta un número arbitrario de argumentos.

Argumentos con nombre

Los argumentos con nombre, es un método para escribir valores de argumentos.

Este método permite escribir en cualquier orden los argumentos, ya que se indica el nombre de la variable seguido de los simbolos dos puntos igual := y su valor. Esto permite definir cualquier parametro o todos.

Private Sub cmdDatos_Click()
datos sexo:=True, nombre:="Gerardo", telefono:=51
End Sub

Sub datos(nombre As String, telefono As Integer, sexo As Boolean)
MsgBox nombre
MsgBox telefono
MsgBox sexo
End Sub
Leer más...

miércoles, 6 de agosto de 2008

Más sobre tipos de datos y procedimientos

Tipos de Datos Definidos por el Usuario

Es posible combinar variables de diferentes tipos para crear tipos de datos definidos por el usuario (a esto en lenguaje C) se le conoce como estructuras), para ello se emplea la sentencia Type la cual deberá estar localizada en la sección General Ceclarations de un un módulo o forma, ejemplo:

   Private Type Empleado
intEdad As Integer
strNombre As String
dtFechaNacimientos As Date
curSalario As Currency
End Type

Si una se declara un tipo de dato definido por el usuario en una forma, la variable deberá ser private.

Para hacer referencia a una variable de tipo definido por el usuario se utiliza la notación de punto para acceder a los miembros de la estructura:

   Dim eNuevoEmpleado As Empleado
txtNombreEmpleado.Text = eNuevoEmpleado.strNombre

Conversión de Tipos de Datos

Visual Basic puede realizar algunas conversiones de Tipos de Datos de manera automática, como convertir algunos strings a enteros. La conversión automática puede producir resultados inesperados y como consecuencia el código puede ejecutarse lentamente.

Visual Basic brinda funciones especificas para la conversión de tipos de datos y eliminar errores en el código:

Tipo de ConversiónFunción
Boolean CBoll
Byte CByte
Currency CCur
Date CDate
Decimals CDec
Double CDbl
Integer CInt
Long CLng
Single CSng
String CStr
Variant CVar
Error CVErr

Para utilizar una función de conversión utilice la siguiente sintaxis:

CFuncion(valorAconvertir)

También existen funciones para determinar el tipo de dato de una variable, por ejemplo IsNumeric(), IsDate, etc.

Tipos de Procedimientos

Existen 2 formas de invocar un procedimiento sub:

  1. Call NombreProcedimiento(Arg1, Arg2)
  2. NombreProcedimiento Arg1, Arg2

Visual Basic tiene 3 principales Tipos de Procedimientos:

  1. Event, aquellos que son invocados automáticamente en respuesta de una acción del usuario o sistema o cuando es invocado por otra sentencia. Si un procedimiento de evento contiene un argumento no es posible cambiar el nombre del argumento, tampoco es posible agregar argumentos. Los procedimientos de eventos son sub-rutinas almacenadas en los módulos de forma y por default son privados.

    El nombre de un procedimiento de eventos se compone del nombre de la propiedad seguido de un underscore (_) y del nombre del evento:

    cmdOk_Click

    Lo anterior define un control command button llamado OK que responde al evento click, en general siguen la sintaxis:

     Private Sub controlName_eventName(arguments)
    'instrucciones
    End Sub

    Visual Basic crea automáticamente procedimientos para formas y controles. Se puede ver y editar el código para un procedimiento de evento en la ventana editora de código.

  2. General, son funciones o sub-rutinas que se crean en un módulo. Los procedimientos generales ayudan a dividir la complejidad del código de una aplicación en unidades más manejables. Si un procedimiento general es público puede ser llamado desde cualquier otro procedimiento del proyecto. Si el procedimiento es privado, sólo el procedimiento o función que puede llamarlo dentro del mismo módulo. El propósito general de los procedimientos generales es proveer modularidad y reutilizar código.

    Existen 2 tipos de procedimientos generales: procedimientos sub y procedimientos function.

     Sub nombreProcedimiento(Arg1 As Type, Arg2 As Type, Arg3 As Type, ...)
    'instrucciones
    End Sub

    Para invocar un procedimiento, sólo escriba su nombre:

    nombrePrecedimiento [Arg1, Arg2, Arg3, ...]

     Function nombreFuncion(Arg1 As Type, Arg2 As Type, Arg3 As Type, ...)
    'instrucciones
    nombreFuncion=[valorQueRegresa]
    End Function

    El valor de regreso de una función por default es Variant, pero se recomienda hacer código más eficiente empleando la palabra reservada As para especificar el tipo de dato que regresa una función.

  3. Property, son utilizados dentro de módulos de clase para asignar o acceder a los valores de las propiedades.
Tensai web
Leer más...

Arreglos dinamicos y estaticos VB6

Todos los elementos en un arreglo tienen el mismo tipo de dato, es posible declarar un arreglo de cualquier tipo de dato fundamental.
Visual Basic asigna espacio para cada índice por lo que no es necesario declarar la longitud necesaria del arreglo. Los índices de los arreglos en Visual Basic comienzan a partir del índice número: 0.
Por default el límite inferior de un arreglo es 0, para especificar un límite inferior distinto a 0 se emplea la palabra reservada To. Es posible establecer de forma automática el límite inferior de los arreglos a través de la sentencia Option Base en la sección de Declaraciones Generales de la forma o módulo.
En Visual Basic hay dos tipos de arreglos estáticos y dinámicos.
Un Arreglo Estático en Visual Basic es aquel que siempre permanece del mismo tamaño, es decir siempre contendrá el mismo número de elementos.
Los arreglos tienen un límite inferior y superior, con un arreglo individual de elementos contiguos dentro de estos límites.
Para declarar un arreglo estático se escribe el nombre del arreglo seguido y entre parántesis el límite superior. El límite superior no puede exceder el rango de los tipos de datos Long (-2,147,483,648 al 2,147,483,647), ejemplo:
Dim aAlumnos(19) As Integer 'Total de elementos a contener = 20
El mismo arreglo pero con ámbito Public:
Public aAlumnos(19) As Integer 'Total de elementos a contener = 20
Un Arreglo Dinámico en Visual Basic es aquel que puede cambiar el tamaño de los elementos que contiene en tiempo de ejecución.
Para declarar un arreglo de tipo dinámico se escribe el nombre del arreglo seguido y entre paréntesis ningún valor, ejemplo:
Dim adEmpleados()
Para cambiar el número de elementos, así como el límite superior e inferior en un arreglo dinámico se utiliza la sentencia Redim que es ejecutable.
El número de dimensiones en una arreglo dinámico no puede cambiar.
Redim adEmpleados(X+1)
Cada vez que es ejecutada la sentencia Redim los valores actualmente almacenados en el arreglo se pierden, ya que Visual Basic reestablece todos los elementos a su valor inicial por default.
Para cambiar el tamaño del arreglo sin perder los datos almacenados en este, se emplea la sentencia Redim con la palabra reservada Preserve.
Redim Preserve adAviones(UBound(adAviones) + 1)
Sólo es posible cambiar el límite superior de la última dimensión en un arreglo multidimensional, cuando se utiliza la palabra Preserve, si se cambia cualquiera de las otras dimensiones o el límite inferior de la última dimensión un error en tipo de ejecución ocurre.
Un Arreglo Multidimensional tiene una estructura lógica mediante la cual es posible contener más de 2 dimensiones, es decir, tener almacenados más de un vector de datos en una sóla estrucura de tipo arreglo.
Sintaxis:
Dim amEjeXY(99,99) as Integer
Public amEjeXY(1 To 99,1 To 99) as Integer
Dim am3D(10,20,30) as Integer
Leer más...

Variables y tipos de datos

Las variables almacenan valores que pueden cambiar durante la ejecución de la aplicación. Cuando se utiliza una variable en Visual Basic la memoria es reservada para albergar a la variable de esta manera la aplicación puede acceder y manipular el valor que contiene la variable.

Existen tipos de variables para almacenar diferentes tipos de datos.

La diferencia entre una variable y una constante es que el valor que contiene la constante permanece fijo y no puede ser cambiado en tiempo de ejecución, pues los valores de las constantes siempre se establecen en tiempo de diseño.

Sintaxis para declarar una constante:

[Public] [Private] Const nombreConstante [As type] = valor

En Visual Basic se utilizan las variables para almacenar valores temporalmente durante la ejecución de una aplicación.

Una variable se compone de el nombre de la variable que es utilizado para referirse al valor que contiene la variable y de un tipo de dato el cual determina el tipo de dato que la variable puede almacenar.

El nombre de una variable debe seguir las siguientes reglas:

  • Debe comenzar con un caracter alfabético.
  • No debe contener espacios.
  • No debe contener símbolos no permitidos como ., %, &, !, #, @, $.
  • Debe ser un nombre único dentro de un mismo ámbito.

Convenciones en el Nombre de las Variables

A manera de buenas prácticas de programación deben especificarse los estándares de programación a seguir, por lo que se pueden establecer convenciones a seguir para el nombre de las variables:

ObjetoPrefijo
Boolean bln
Byte byt
Currency cur
Date dt
Double dbl
Integer int
Long lng
Object Estándares
Single sng
String str
Variant var

Tipos de Datos

Las variables Visual Basic pueden almacenar diferentes tipos de datos:

  • Texto:
    1. String de longitud variable

      por ejemplo:

         Dim sNombreCompleto as String
    2. String de longitud fija

      por ejemplo:

         Dim sNombreCompleto as String * 50

      sNombreCompleto contendra siempre 50 caracteres (los caracteres faltantes completan con espacios en blanco)

  • Números:
    1. Integer
    2. Long
    3. Single
    4. Double
  • Boolean
  • Otros:
    1. Variant
    2. Object
    3. Currency
    4. Date

A direncia de otros lenguajes como Lenguaje C, algo importante y que es necesario tenerlo en cuenta es que Visual Basic no requiere especificar explicitamente un tipo de dato al declarar una variable sólo es necesario declarar la variable de manera generica y al ser generica por default las variables Visual Basic son de tipo Variant.

Variant, es un tipo de dato que puede almacenar cualquier tipo de valor, inluyendo, texto, números, objetos y null. Visual Basic determina y convierte los valores Variant.

Empty

Empty es un valor especial distinto de 0, para verificar si una variable contiene el valor Empty utilice la función IsEmpty(nombreVariable).

Por ejemplo cualquier variable declarada sin referencia con un tipo de dato asume por default el tipo de dato Variant y el contenido por default de Variant es Empty antes de asignarle un valor:

 Dim x
Private Sub Command4_Click()
MsgBox IsEmpty(x)
End Sub

Lo anterior regresa True

Es posible asignar el valor Empty a una variable que soporte este valor.s

Null

Null es un valor especial. Puede indicar datos desconocidos o faltantes, por ejemplo en bases de datos. Es posible utilizar la funcion IsNull(nombreVariable) para determinar si contiene el valor Null.

 Dim s As String
Private Sub cmdNull_Click()
MsgBox IsNull(s)
End Sub

Lo anterior regresa False

Dim : Declaración de Variables

Declaración implicita, son aquellas variables que no son declaradas pero si Visual Basic encuentra una declaración de variable le asigna por default el tipo Variant con el valor vacío (""). Una declaración de este tipo a veces es conveniente pero límita el control sobre las variables.

Declaración explicita, Para declarar una variable explícita se utiliza la sentencia Dim.

Sintaxis:

Dim nombreVariable [As tipoVariable]

Donde la cláusula As en la sentencia Dim permite especificar el tipo de dato cuando la variable es declarada, por ejemplo:

   Dim strUserName As String
Dim intUserDept As Integer

Una vez que las variables son creadas con la sentencia Dim, Visual Basic automáticamente inicializa las de tipo numérico con el valor 0 y cadenas de texto o variant con el valor vacío ("").

Sentencia Option Explicit

Ya que es posible declarar variables de manera implicita, esto puede causar errores lógicos al escribir incorrectamente el nombre de la variable, por ejemplo, suponga que declara de manera implicita la variable strUserPwd y después trata de hacer referencia a esta variable pero comete un error al escribir el nombre:

   strUserPwd = txtBoxUserPwd.Text
strUserLevel = strUserPdw + "A"

Visual Basic asume que strUserPdw es una nueva variable implicita, para prevenir esto, es posible que indicar a Visual Basic que todas las variables sean declaradas antes de ser usadas, para ello es necesario escribir la sentencia Option Explicit en las declaraciones generales de la sección de un módulo.

La sentencia Option Explicit instruye a Visual Basic para checar el módulo por cualquier variable que no sea declarada explicitamente y si una variable no es declarada un mensaje de error aparece "Variable not defined" para corregir el error.

Se recomienda siempre utilizar la sentencia Option Explicit.

Para colocar de manera automática la sentencia Option Explicit al inicio del código de cada módulo, selecccione:

Opción Tools del menú principal » Options » Editor tab » Require Variable Declaration.

Para colocar de manera manual la sentencia Option Explicit al inicio del código de cada módulo, selecccione de la ventana editora de código:

  1. Object list box » General
  2. Procedure list box » Declarations
  3. Escribir al inicio Option Explicit

Alcance de las Variables

El alcance de una variable se define como el ámbito de acción sobre la cual la variable actua y su comportamiento depende de como se defina.

Nivel Procedimiento

  • Privado, las variables son privadas del procedimiento en el que aparecen.
  • Público, No es posible declarar variables públicas dentro de un procedimiento.

Las variables a nivel procedimiento sólo se reconocen el el procedimiento en el que se han declarado y también reciben el nombre de variables locales declarandolas mediante la palabra reservada Dim es decir que existen mientras se ejecuta el procedimiento o Static que existen mientras se ejecuta la aplicación.

Nivel Módulo

  • Privado, las variables son privadas del módulo en el que aparecen.
  • Público, las variables están disponibles para todos los módulos.

Una variable a nivel módulo está disponible para todos los procedimientos del módulo, pero no está disponible para otros módulos o los procedimientos de otros módulos.

A nivel módulo no existe diferencia entre Private o Dim. Se recomienda declararlas como Private para diferenciarlas o contrastarlas con Public, haciendo el código más fácil de entender.

Si requerimos que una variable esté disponible para otros módulos se emplea la palabra clave Public para declarar la variable al inicio del módulo.

Es posible tener varios modulos donde cada módulo tiene un procedimiento con el mismo nombre y a su vez el modulo tiene declarada una variable también con el mismo nombre. En este caso para hacer una referencia correcta se escribe el nombre del módulo seguido de un punto y el nombre de la variable:

 mod1.AsignaNombre
mod1.sNombre
mod2.AsignaNombre
mod2.sNombre
mod3.AsignaNombre
mod3.sNombre

NOTA: Cuando se tienen variables con un mismo nombre pero distinto alcance, las variables más locales ocultan a las variables menos locales.

Si en el evento Load de una forma escribe MsgBox Top se hace referencia a la propiedad Top de la forma (NombreForma.Top).

Static

Para preservar el valor de una variable local se declara como Static :

 Private Sub cmdIncrementa_Click()
Cuenta
End Sub

Sub Cuenta()
Static Contador As Integer
Contador = Contador + 1
MsgBox Contador
End Sub

Const : Constantes

Declarar una constante (Cons) significa que el valor que contiene nunca cambiara mientras se ejecute la aplicación.

Poe ejemplo Visual Basic define varias constantes como valores predefinidos como es el caso de los colores: vbRed, vbBlue, vbBlack, etc.

 Const PI = 3.141592
Const YEAR as Integer = 1971

Es posible definir más de una constante en una sola línea, para ello se utiliza como separador el signo coma (;)

 Const PI = 3.141592, YEAR as Integer = 1971
Leer más...