Así que partamos de un formulario como este
Y sobre este formulario trabajemos los siguientes puntos:
1. Crear el formulario con el label "Nombre" y el textbox "PideNombre"
2. Pinchar el label y Copiar. Luego Pegar, Ubicar el label debajo de 'Nombre y ponerle ' 1º Apellido'
3. Pinchar el textbox PideNombre y Copiar. Luego Pegar. Ubicar el textbox debajo de Pidenombre, Llamarle PideApe1
4. Repetir el mismo proceso para cada objeto hasta conseguir el formulario propuesto. Los nombres de los textboxes son PideNombre, PideApe1,PideApe2,PideDireccion,PidePoblacion,PideCPostal, PideTelefono,PideFax.
Ahora ya tenemos el formulario de pruebas. El siguiente paso va a ser revisar los contenidos. Como los contenidos de estos textboxes van a ir a campos de una tabla pondremos la propiedad maxlength de cada uno de ellos conforme a la longitud del campo que corresponda.
Ahora que ya tenemos puestas las longitudes el siguiente paso es comprobarlas pulsaciones válidas.
Los textboxes Nombre, Ape1,Ape2,Poblacion tienen las mismas características. Deben admitir letras y espacios pero no números. Les ponemos a todos la propiedad group="letras"
Los textboxes PideTelefono y PideFax son iguales. Ambos deben permitir guardar dígitos y espaciosl. Les ponemos a los dos la propiedad group="telef"
El textbox PideCpostal es único porque solo puede contener dígitos sin espacios ni nada. No le pongo group
El textbox PideFecha es único porque debe contener dígitos y caracteres "/-.". No le pongo group.
Para comprobar las pulsaciones de teclas dispongo del evento keypress que se dispara al pulsar una tecla y del evento keyrelease que se dispara al soltarla. Yo voy a usar el evento keypress para evaluar la tecla pulsada y decidir si es correcta en ese lugar.
gambas tiene unas funciones muy prácticas para saber lo que son estas teclas. Son las siguientes
Comprobación de caracteres
Pero existen algunos problemillas porque en español por ejemplo existe la Ñ que estas funciones codificadas para el ingles no lo consideran una letra.
Así pues basándome en estos pequeños problemillas me he creado yo un módulo de comprobación de teclado que es muy sencillito pero soluciona estas cosas. Llamo a esta clase TEC y tiene el siguiente contenido
Función Esletra que devuelve true si una pulsación es letra o false si no lo es
Si Isletter devuelve true es que es letra. Si no lo es pregunta a ver si es Ñ mediante esta funcion
Así que en resumidas cuentas cuando llamo a Esletra mira a ver si es letra y si no lo es mira a ver si es ñ y si alguna de las dos circunstancias se dan devuelve true
Tengo también otra rutinita que comprueba si una pulsación es un caracter alfa. Esto es todas las letras (incluída ñ), signos de puntuación y espacio. No incluye números.
y tengo otra sencillita para saber si la pulsación es válida para una petición de fechas
También tengo otra función corrientita para saber si la pulsación es de borrado de caracter
Y otra para saber si la pulación se corresponde a flechas del teclado
Así que ahora que os he mostrado estas rutinitas tan simples veremos como programamos los eventos keypress
El keypress de Pidefecha
Para admitir únicamente caracteres válidos para una fecha
sub Pidefecha_keypress()
DIM var AS Boolean = TRUE
SELECT CASE var
CASE TEC.EsFecha(Key.text) 'válida si es fecha
CASE TEC.EsBorrar(Key.code) 'válida si es tecla de borrar
CASE TEC.Esflecha(Key.code) 'válida si es tecla de mover el curor
CASE ELSE
STOP EVENT 'cualquier otra anular pulsación
END SELECT
DIM var AS Boolean = TRUE
SELECT CASE var
CASE TEC.EsFecha(Key.text) 'válida si es fecha
CASE TEC.EsBorrar(Key.code) 'válida si es tecla de borrar
CASE TEC.Esflecha(Key.code) 'válida si es tecla de mover el curor
CASE ELSE
STOP EVENT 'cualquier otra anular pulsación
END SELECT
end
[/code]
El keypress para el nombre, apellidos, dirección y poblacion
sub letras_keypress()
DIM var AS Boolean = TRUE
SELECT CASE var
CASE TEC.EsAlfa(Key.text) 'admitir letras, puntuación, números y espacio
CASE IsDigit(Key.text) 'admitir dígitos
CASE IsSpace(Key.text) 'no es necesario porque esalfa ya admite espacios pero para que se vea
CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
CASE ELSE
STOP EVENT
END SELECT
end
DIM var AS Boolean = TRUE
SELECT CASE var
CASE TEC.EsAlfa(Key.text) 'admitir letras, puntuación, números y espacio
CASE IsDigit(Key.text) 'admitir dígitos
CASE IsSpace(Key.text) 'no es necesario porque esalfa ya admite espacios pero para que se vea
CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
CASE ELSE
STOP EVENT
END SELECT
end
Este evento se aplica a todos los objetos que tengan group "letras" y por tanto a nombre, ape1, ape2, direccion y poblacion
El keypress de telefono y fax
sub telef_keypress()
DIM var AS Boolean = TRUE
SELECT CASE var
CASE IsDigit(Key.text) 'admitir dígitos
CASE IsSpace(Key.text) 'admitir espacos
CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
CASE ELSE
STOP EVENT 'anular las demás
END SELECT
end
DIM var AS Boolean = TRUE
SELECT CASE var
CASE IsDigit(Key.text) 'admitir dígitos
CASE IsSpace(Key.text) 'admitir espacos
CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
CASE ELSE
STOP EVENT 'anular las demás
END SELECT
end
este evento se dispara en todos los objetos que tengan por group telef
El Keypress del PideCPostal
Este control debe admitir únicamente dígitos sin espacios ni nada
Ahora ya tenemos controladas las pulsaciones de todo el formulario.
Destacar el control en el que está el foco
A mi me gusta que al ponerme en un textbox o lo que sea para escribir este se destaque de los demás. Para ello utilizo el evento gotfocus y el lostfocus que se disparan cuando se obtiene y se pierde el foco
Hagamos lo mismo para los controles nombre, ape1, ape2,direccion y poblacion. Como hay varios utilizaré el método LAST
y los del teléfono
Movimiento del ratón
Esto no suelo hacerlo pero ya puestos pues lo cuento. También se puede hacer que se destaquen objetos cuando el ratón pasa sobre ellos o deja de pasar. Son los eventos ENTER y LEAVE
y los del teléfono
Respecto a los botones
El botón Cancelar debería quitarlo todo así que le pongo un código tan simple como este
Y el botón de Grabar debería comprobar que los datos son correctos y en su caso grabar en una tabla "Datos". Para saber si son datos correctos comprueba que la fecha sea una fecha válida y que se haya metido un nombre y un primer apellido
sub Grabar_click
DIM Cn AS NEW Connection, Rs AS Result, Valido AS Boolean
Valido = ComprobarDatos
IF valido THEN
Cn = Conectar()
Rs = Cn.Create("Datos")
rs!nombre = PideNombre.Text
rs!ape1 = PideApe1.Text
rs!ape2 = pideape2.text
rs!telefono = PideTelefono.Text
rs!pidefax = PideFax.Text
rs!poblacion = PidePoblacion.Text
rs!PideCPostal = PideCPostal.Text
rs!pidefecha = PideFecha.Text
rs.update
ME.close
endif
end
DIM Cn AS NEW Connection, Rs AS Result, Valido AS Boolean
Valido = ComprobarDatos
IF valido THEN
Cn = Conectar()
Rs = Cn.Create("Datos")
rs!nombre = PideNombre.Text
rs!ape1 = PideApe1.Text
rs!ape2 = pideape2.text
rs!telefono = PideTelefono.Text
rs!pidefax = PideFax.Text
rs!poblacion = PidePoblacion.Text
rs!PideCPostal = PideCPostal.Text
rs!pidefecha = PideFecha.Text
rs.update
ME.close
endif
end
Y la función que comprueba es la siguiente
private function ComprobarDatos() as boolean
dim Valor as boolean=true
if not isdate(PideFecha.text) then 'si no es fecha
valor=false
endif
if not pideNombre.text or not valor then 'si hubo error antes o no hay un nombre
valor=false
endif
if not pideApe1.text or not valor then 'si hubo error antes o no hay un ape1
valor=false
endif
return valor
end
dim Valor as boolean=true
if not isdate(PideFecha.text) then 'si no es fecha
valor=false
endif
if not pideNombre.text or not valor then 'si hubo error antes o no hay un nombre
valor=false
endif
if not pideApe1.text or not valor then 'si hubo error antes o no hay un ape1
valor=false
endif
return valor
end
Todo esto es muy básico pero son las cosas que dan dolores de cabeza cuando se empieza y lo pongo en parte para animar a la gente a que se anime a probar gambas y en parte porque no puedo dormir.