22 Votos

Delphi/Lazarus: ¿Está presionada la tecla ALT, SHIFT o CTRL?

Tutorial de Stefan Trost | 22/02/2024 a las 22:54

A veces, queremos verificar en un evento de teclado, en un evento de mouse o en cualquier otro lugar arbitrario de nuestro programa, si el usuario está presionando una o más de las teclas ALT, ALT GR, SHIFT o CTRL en ese momento. Para descubrir esto, el ShiftState nos ayuda.

A continuación, nos gustaría ver cómo consultar y utilizar ShiftState en eventos estándar del teclado o mouse, así como cómo funciona fuera de los eventos estándar. Finalmente, también queremos ver cómo podemos usar ShiftState junto con otras teclas para comprobar combinaciones de teclas:

ShiftState en Eventos Estándar

La forma más fácil de consultar las teclas modificadoras pulsadas es utilizar un procedimiento estándar en Delphi o Lazarus, que ya nos proporciona una variable de ShiftState. Este es el caso, por ejemplo, con los eventos predeterminados OnMouseDown (se presiona el botón del mouse), OnMouseUp (se suelta el mouse), OnMouseMove (se mueve el mouse), OnMouseWheel (se mueve la rueda del mouse), OnKeyDown (se presiona una tecla) o OnKeyUp (se suelta la tecla).

Veamos un breve ejemplo:

procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if ssAlt         in Shift then ShowMessage('ALT');
  if ssShift       in Shift then ShowMessage('SHIFT');
  if ssCtrl        in Shift then ShowMessage('STRG');
  if ssAltGr       in Shift then ShowMessage('ALT GR');
  if ssLeft        in Shift then ShowMessage('Tecla Izquierda del Ratón');
  if ssRight       in Shift then ShowMessage('Tecla Derecha del Ratón');
  if ssMiddle      in Shift then ShowMessage('Tecla Central del Ratón');
  if ssDoubleClick in Shift then ShowMessage('Doble Clic');
end;

Aquí, por ejemplo, hemos configurado el evento OnKeyUp para un campo Edit (TEdit). Automáticamente quedan disponibles las variables Key y Shift de las cuales podemos recuperar qué tecla normal se presionó (variable Key) y qué tecla especial se presionó durante la pulsación de la tecla (variable Shift).

Además de saber si el usuario mantiene presionada la tecla ALT, SHIFT, CTRL o ALT GR, usando Shift State también es posible obtener información sobre el mouse (por ejemplo: ¿está presionado el botón derecho o izquierdo del mouse o si hay un doble clic?). En el código anterior verificamos algunos de estos estados y enviamos un mensaje al usuario que informa sobre el estado actual.

ShiftState en un Procedimiento Propio

Al escribir nuestro propio procedure o function, por supuesto, Delphi o Lazarus no pone a disposición automáticamente la variable "Shift". Sin embargo, todavía es posible recuperar el estado de Shift actual.

procedure MyOwnProcedure;
var
  currentShiftState: TShiftState;
begin    
  currentShiftState := GetKeyShiftState;

  if ssShift in currentShiftState then ShowMessage('SHIFT');
end;

Simplemente declaramos una variable del tipo TShiftState. Llamémoslo currentShiftState como en nuestro código de ejemplo. Con la función GetKeyShiftState, podemos solicitar el estado del Shift actual y almacenarlo en nuestra variable. Después de eso, podemos trabajar con él como lo hicimos en el primer ejemplo.

ShiftState en Combinación con otras Teclas

Por supuesto, también podemos combinar la consulta del Shift State con la consulta de otras teclas y así comprobar si se presionan combinaciones de teclas. Echemos un vistazo a otro pequeño ejemplo:

procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin    
  if (Shift = [ssCtrl]) and (key = ord('A')) then begin
    ShowMessage('Se hizo clic en CTRL + A');
  end;

  if (ssShift in Shift) and (ssAlt in Shift) then begin
    ShowMessage('Se mantienen presionadas las teclas SHIFT y ALT')
  end;
end;

Primero, verificamos si el usuario presionó el atajo de teclado CTRL + A no solo verificando Shift para ssCTRL sino también si la tecla A fue presionada al mismo tiempo al evaluar la variable Key. Dado que Key es del tipo Word, primero tenemos que convertir "A" en un valor numérico (también podríamos verificar directamente para 65).

A continuación comprobamos si se mantienen pulsadas al mismo tiempo tanto la tecla SHIFT como la tecla ALT.

ResponderPositivoNegativo

Sobre el Autor

AvatarPuede encontrar software de Stefan Trost en la pagina es.sttmedia.com. ¿Necesita un software individual según sus propios requisitos? Escribenos: es.sttmedia.com/contacto
Ver Perfil

 

Temas Relacionados

Aviso Importante

Por favor tenga en cuenta: Las contribuciones publicadas en askingbox.com son contribuciones de los usuarios y no deben reemplazar el asesoramiento profesional. No son verificados por independientes y no reflejan necesariamente la opinión de askingbox.com. Aprende más.

Participar

Haga su propia pregunta o escriba su propio artículo en askingbox.com. He aquí cómo.