Comprensión y procesamiento de eventos de teclado en Delphi

Los eventos del teclado, junto con los eventos del mouse, son los elementos principales de la interacción del usuario con su programa..

A continuación hay información sobre tres eventos que le permiten capturar las pulsaciones de teclas de un usuario en una aplicación Delphi: OnKeyDown, OnKeyUp y OnKeyPress.

Abajo, Arriba, Prensa, Abajo, Arriba, Prensa ...

Las aplicaciones de Delphi pueden usar dos métodos para recibir la entrada del teclado. Si un usuario tiene que escribir algo en una aplicación, la forma más fácil de recibir esa entrada es usar uno de los controles que responde automáticamente a las pulsaciones de teclas, como Editar.

Sin embargo, en otros momentos y para fines más generales, podemos crear procedimientos en un formulario que maneje tres eventos reconocidos por formularios y por cualquier componente que acepte la entrada del teclado. Podemos escribir controladores de eventos para que estos eventos respondan a cualquier tecla o combinación de teclas que el usuario pueda presionar en tiempo de ejecución.

Aquí están esos eventos:

OnKeyDown - se llama cuando se presiona cualquier tecla del teclado
OnKeyUp - se llama cuando se suelta cualquier tecla del teclado
OnKeyPress - se llama cuando se presiona una tecla correspondiente a un carácter ASCII

Controladores de teclado

Todos los eventos del teclado tienen un parámetro en común. los Llave El parámetro es la tecla del teclado y se usa para pasar por referencia del valor de la tecla presionada. los Cambio parámetro (en el OnKeyDown y OnKeyUp procedimientos) indica si las teclas Mayús, Alt o Ctrl se combinan con la combinación de teclas.

El parámetro Remitente hace referencia al control que se usó para llamar al método.

 procedimiento TForm1.FormKeyDown (Remitente: TObject; var Clave: Palabra; Shift: TShiftState);… procedimiento TForm1.FormKeyUp (Remitente: TObject; var Clave: Palabra; Shift: TShiftState);… procedimiento TForm1.FormKeyPress (Remitente: TObject; var Clave: Char); 

Responder cuando el usuario presiona teclas de acceso directo o acelerador, como las que se proporcionan con los comandos de menú, no requiere escribir controladores de eventos.

¿Qué es el enfoque??

El foco es la capacidad de recibir información del usuario a través del mouse o el teclado. Solo el objeto que tiene el foco puede recibir un evento de teclado. Además, solo un componente por formulario puede estar activo, o tener el foco, en una aplicación en ejecución en un momento dado.

Algunos componentes, como TImage, TPaintBox, TPanel y TLabel No puede recibir el foco. En general, componentes derivados de TGraphicControl no pueden recibir el foco. Además, los componentes que son invisibles en tiempo de ejecución (TTimer) no puede recibir el foco.

OnKeyDown, OnKeyUp

los OnKeyDown y OnKeyUp Los eventos proporcionan el nivel más bajo de respuesta del teclado. Ambos OnKeyDown y OnKeyUp los manejadores pueden responder a todas las teclas del teclado, incluidas las teclas de función y las teclas combinadas con Cambio, Alt, y Ctrl llaves.

Los eventos del teclado no son mutuamente excluyentes. Cuando el usuario presiona una tecla, tanto el OnKeyDown y OnKeyPress se generan eventos, y cuando el usuario suelta la clave, el OnKeyUp se genera el evento Cuando el usuario presiona una de las teclas que OnKeyPress no detecta, solo el OnKeyDown se produce el evento, seguido de OnKeyUp evento.

Si mantiene presionada una tecla, el OnKeyUp evento ocurre después de todo el OnKeyDown y OnKeyPress eventos han ocurrido.

OnKeyPress

OnKeyPress devuelve un carácter ASCII diferente para 'g' y 'G', pero OnKeyDown y OnKeyUp no distinga entre mayúsculas y minúsculas alfa.

Parámetros clave y de cambio

Desde el Llave el parámetro se pasa por referencia, el controlador de eventos puede cambiar Llave para que la aplicación vea una clave diferente como involucrada en el evento. Esta es una forma de limitar los tipos de caracteres que el usuario puede ingresar, como evitar que los usuarios escriban teclas alfabéticas.

 Si Llave en ['a' ... 'z'] + ['A' ... 'Z'] luego Clave: = # 0 

La declaración anterior verifica si el Llave El parámetro está en la unión de dos conjuntos: caracteres en minúscula (es decir. un mediante z) y mayúsculas (ARIZONA) Si es así, la instrucción asigna el valor de carácter de cero a Llave para evitar cualquier entrada en el Editar componente, por ejemplo, cuando recibe la clave modificada.

Para las teclas no alfanuméricas, los códigos de teclas virtuales WinAPI se pueden usar para determinar la tecla presionada. Windows define constantes especiales para cada tecla que el usuario puede presionar. Por ejemplo, VK_RIGHT es el código de tecla virtual para la tecla de flecha derecha.

Para obtener el estado clave de algunas teclas especiales como LENGÜETA o Página arriba, podemos usar el GetKeyState Llamada API de Windows. El estado de la tecla especifica si la tecla está arriba, abajo o activada (activada o desactivada, alternando cada vez que se presiona la tecla).

 Si HiWord (GetKeyState (vk_PageUp)) 0 luego ShowMessage ('Re Pág - ABAJO') más ShowMessage ('Re Pág - ARRIBA'); 

En el OnKeyDown y OnKeyUp eventos, Llave es un valor de Word sin signo que representa una clave virtual de Windows. Para obtener el valor de carácter de Llave,usamos el Chr función. En el OnKeyPress evento, Llave es un Carbonizarse valor que representa un carácter ASCII.

Ambos OnKeyDown y OnKeyUp los eventos usan el parámetro Shift, de tipo TShiftState, un conjunto de banderas para determinar el estado de las teclas Alt, Ctrl y Shift cuando se presiona una tecla.

Por ejemplo, cuando presiona Ctrl + A, se generan los siguientes eventos clave:

 KeyDown (Ctrl) // ssCtrl KeyDown (Ctrl + A) // ssCtrl + 'A' KeyPress (A) KeyUp (Ctrl + A) 

Redirigir eventos de teclado al formulario

Para atrapar las pulsaciones de teclas en el nivel del formulario en lugar de pasarlas a los componentes del formulario, configure el formulario KeyPreview propiedad a True (utilizando el Inspector de objetos) El componente todavía ve el evento, pero el formulario tiene la oportunidad de manejarlo primero, para permitir o no presionar algunas teclas, por ejemplo.

Supongamos que tiene varios componentes de edición en un formulario y el Form.OnKeyPress el procedimiento se ve así:

 procedimiento TForm1.FormKeyPress (Remitente: TObject; var Clave: Char); empezar Si Llave en ['0' ... '9'] luego Clave: = # 0 final; 

Si uno de los componentes Editar tiene el Atención, y el KeyPreview la propiedad de un formulario es False, este código no se ejecutará. En otras palabras, si el usuario presiona el 5 5 clave, la 5 5 el carácter aparecerá en el componente de edición enfocado.

Sin embargo, si el KeyPreview se establece en True, entonces el formulario OnKeyPress El evento se ejecuta antes de que el componente Editar vea la tecla presionada. De nuevo, si el usuario ha presionado el 5 5 clave, luego asigna el valor de carácter cero a Clave para evitar la entrada numérica en el componente Editar.