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:
- KeyPress, al presionar una tecla correspondiente a un carácter ASCII.
- KeyDown, al presionar cualquier tecla.
- 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:
Seguidos del evento:
Si se presiona una tecla que el evento KeyPress
no detecta unicamente se dispara el el evento:
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