viernes, 22 de agosto de 2008

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

0 comentarios: