El teclado

No abordaremos en este punto el acceso "básico" o "de bajo nivel" al mismo, aunque es posible con funciones como rawKeySym que permite acceder a los códigos del teclado directamente y cazar desde teclas como Insert/Pause/Print Screen hasta el girar de la rueda de los ratones.

La importancia de conocer la funcionalidad del lenguaje de cara a este periférico es por que este es una pieza fundamental desde la invención de los ordenadores hasta hoy, quizá cuando tengamos interfaces aurales la cosa cambien, pero mientras ... Un usuario experto en una aplicación es más efectivo y flexible en su modo de actuar con el teclado que con el ratón en una aplicación predominantemente de entrada de datos. Si la componente de trabajo visual es tan importante, le aconsejo que pruebe una tableta gráfica o una pantalla táctil para dos dimensiones, para 3D ... Bueno, ahí ya ni entro.

Podemos construir un breve entretenimiento sobre las funciones del teclado para ver cómo actúa añadiendo un campo de texto no editable para mostrar resultados y junto al siguiente código perteneciente a la única tarjeta de la pila:

#
# Tarjeta
#
on keyUp quinCaracter
  put "Soltat:" && quinCaracter & return after fld "eixida"
end keyUp

on keyDown quinCaracter
  if (the altKey is "down") then put "Alt + " after fld "eixida"
  if (the shiftKey is "down") then put "Shf + " after fld "eixida"

  put "Pulsat:" && quinCaracter & "  " after fld "eixida"
end keyDown

Este código nos permitirá "cazar al vuelo" las pulsaciones del teclado, como en el caso del ratón tanto cuando se pulsa una tecla (la que sea) como cuando se suelta, se generarán los eventos de keyUp y keyDown. Estos eventos reciben un parámetro que es el caracter que ha sido pulsado o soltado. A partir de ahí podemos manipular el mismo. Nosotros nos limitaremos a mostrar un mensaje indicativo del evento que ha sido generado.

Con el tiempo el campo de texto se llenará de mensajes y dejaremos de verlos. Vamos a introducir un botón que limpie el contenido del campo de texto y así volveremos a ver aparecer ñlos mensajes y, claro, aunque podamos utiilzar el ratón vamos a facilitar que se pueda utilizar sin levantar las manos del teclado.

Hemos visto ya (apareció en la la sección de nombre Paso 12: comprobar el orden de tabulación en Capítulo 1) cómo introducir el orden de navegación por los controles dispuestos en el interfaz y como se puede utilizar el tabulador (Tab) para ir pasando de uno a otro. Esto es cómo, de una manera sencilla y eficaz, se puede hacer pase el "foco" de un control a otro sin, por supuesto, activarlos. Ya situados sobre el botón deseado, al pulsar la tecla Enter se genera el mismo evento que si se hubiese pulsado con el ratón sobre ese control.

Así pues, ya conocemos cómo movernos con el tabulador y cómo asignar a los botones los nemónicos (véase la Figura 5-7a, que muestra la caja de propiedades del botón y el valor asignado al campo Mnemonic de la pestaña Name) y los aceleradores (en la Figura 5-7b, esta vez en la pestaña de Accelerators se encuentran Accelerator Key, Accelerator Modifiers y Accelerator Text ) de teclado.

Sugerencia: Como curiosidad, decir que se puede preguntar por el estado de teclas especiales como se ha hecho en el ejemplo anterior con la tecla de mayúsculas (Shift) con las variantes: altKey/ metaKey/optionKey, capsLockKey, controlKey/commandKey (Ctrl Unix/Win o command en MacOS).

Figura 5-7. Ejemplos de la ejecución de funciones relacionadas con el teclado.

ab

cd

Importante: Una cosa a recordar es que la ejecución de un evento consume el mismo, así que lo que hagamos dentro estas de funciones de bajo nivel de acceso al teclado pueden romper la secuencia habitual. Un ejemplo de ampliación de la funcionalidad de MetaCard para aceptar caracteres acentuados lo veremos en la la sección de nombre Creando un nuevo comportamiento: campo de texto y caracteres acentuados en Capítulo 6. Aquí vamos a eliminar que llegue una tecla al usuario, nunca se verá el mensaje de que se suelta la tecla b. Para ello modificamos el primer evento como se muestra a continuación:

on keyUp quinCaracter
  if (quinCaracter is "a")
  then  put "Soltat:" && toLower(quinCaracter) & return after fld "eixida"
  else   if (quinCaracter is not "b" or quinCaracter is not "B") then\
                put "Soltat:" && quinCaracter & return after fld "eixida"
end keyUp

Compruebe qué sucede si en uno (o los dos, no lo voy a decir) de estos eventos de un campo de texto editable consumimos el caracter y no lo "dejamos pasar".

Cierto es que las únicas teclas que suelo monitorizar son las flechas del cursor (con el evento arrowkey que recibe un parámetro que puede ser una de las cadenas de carácteres: "up", "down", "left" y "right". Pero puede hacer algo sencillo utilizando las propiedades:

Veremos otras posibilidades, como la utilización de la orden type, al hablar de un campo de texto en la la sección de nombre Efectos con el texto en Capítulo 7.

Ahora echaremos un vistazo a otros mensajes de interés a la hora de trabajar con campos de texto por lo que nos informan de la manipulación de sus contenidos en tiempo de ejecución. Lo siguiente hace referencia a la realización de acciones ante teclas frecuentes como return, enter o escape que, respectivamente, se traducen en los eventos returnInField, enterInField y escapeKey. Veamos un ejemplo donde se han utilizado estas acciones para ver cómo se pueden utilzar en el código. Dada una pila como la de la Figura 5-8, se ha de implementar:

Figura 5-8. Ejemplo de pila para poner en práctica los eventos de pulsación de teclas.