Limitar la Captura de un Entry
En ocasiones es necesario limitar lo que el usuario se
encuentra capturando en un campo de texto, por lo que en este
artículo vamos a capturar los eventos de
introducción de texto y limitarlos a solo aceptar
numéricos.Para comenzar es necesario abrir MonoDevelop (este ejemplo se realizó con la versión 0.11) y crear una solución nueva, para ello vamos al menú "Archivo" y pulsar sobre la opción "Nuevo Proyecto...", seleccionamos "Proyecto Gtk# 2.0" y le ponemos un nombre, por ejemplo "EntradasTeclado".
Va a ser necesario usar las habilidades de MonoDevelop en el diseño de formularios. Asi que para ello abriremos el "MainWindow.cs" y pulsamos sobre el botón "Diseñador". Usaremos 3 "widgets" en total, dos "Label" y un "Entry", los cuales acomodaremos con un "vbox" de dos filas, y en la primera fila anidaremos un "hbox" de dos columnas.
Para este ejemplo les deje un "Espaciado" de 10 pixeles.
Después agregamos los widgets que vamos a usar en el ejemplo:
Label
Nombre del widget: "Texto1"
Etiqueta: "Tecla Pulsada:"
Label
Nombre del widget: "miTecla"
Etiqueta: ""
Entry
Nombre del widget: "miTexto"
Texto: ""
Lo cual debería quedar mas o menos así:
A continuación es necesario seleccionar el widget "Entry" e ir a las "Propiedades del componente" y en "Señales" buscar el evento "KeyPressEvent", para nombrar un nuevo "Handler", por ejemplo: "miTexto_KeyPressEvent"
Esto va a generar automáticamente el siguiente código:
protected virtual void miTexto_KeyPressEvent(object o, Gtk.KeyPressEventArgs args)
{
}
Ya por último, y para terminar con el diseñador de formularios, seleccionamos el widget llamado "miTecla" y pulsamos sobre el botón "Asociar a campo", y haremos lo mismo con el widget llamado "miTexto", esto es para que se declaren los widgets en nuestro código fuente de la siguiente forma:
protected Gtk.Entry miTexto; protected Gtk.Label miTecla;
Ok, ahora es tiempo de empezar a programar sobre el evento "miTexto_KeyPressEvent"
[GLib.ConnectBefore ()] protected virtual void miTexto_KeyPressEvent(object o, Gtk.KeyPressEventArgs args)
{ miTecla.Text = args.Event.Key.ToString();
string misDigitos = "0123456789";
if (Array.IndexOf(misDigitos.ToCharArray(), Convert.ToChar(args.Event.Key)) == -1 && args.Event.Key != Gdk.Key.BackSpace){
args.RetVal = true;
}
}
La primera linea "GLib.ConnectBefore()" es para conectar el manejador del evento antes que el evento predeterminado.
En nuestro "Label" veremos las teclas que se están pulsando en ese momento por medio de "args.Event.Key".
Ahora viene lo interesante, "misDigitos" no es mas que un "string" con los caracteres permitidos a capturar. Esto quiere decir que lo que estoy tratando de hacer es que solo se pueda escribir números en el campo "Entry".
Después viene la evaluación, para ello usaremos un "Array.IndexOf" sobre "misDigitos", esto nos devolverá la posición del carácter evaluado sobre la cadena partiendo de "0", en caso de no encontrar el carácter, esa función nos devolverá un "-1". Por otra parte es necesario habilitar la posibilidad de borrar los caracteres introducidos, por lo que adelante se revisa si la tecla pulsada no es un "BackSpace".
En caso de que la tecla pulsada no este dentro de los caracteres permitidos o que sea un BackSpace, entonces entrará y ejecutará un "args.RetVal" a verdadero, con ello la tecla pulsada no será capturada en el "Entry".
La ejecución se verá mas o menos de la siguiente forma:
Se puede ir revisando que tecla se va pulsando y su conversión a "Char" por medio de la siguiente linea dentro de "miTexto_KeyPressEvent".
Console.WriteLine("Tecla Presionada: {0} Char: {1}", args.Event.Key, Convert.ToChar(args.Event.Key));
Y por supuesto esto solo es un ejemplo, pero básicamente es posible declarar en "misDigitos" cualquier carácter que queremos aceptar, por ejemplo "abcd012345.-", etc.
Espero este artículo sea de utilidad. Saludos!!!
El proyecto y código relacionado de este artículo están disponibles en el siguiente archivo.
| Adjunto | Tamaño |
|---|---|
| EntradasTeclado.tar.gz | 5.07 KB |
