88 Stimmen

Delphi/Lazarus: Ist die ALT, SHIFT oder STRG-Taste gedrückt?

Tutorial von Stefan Trost | Letztes Update am 11.01.2023 | Erstellt am 28.11.2013

Manchmal möchten wir in einem Tastatur-Event, in einem Maus-Event oder auch an einer beliebigen anderen Stelle in unserem Programm überprüfen, ob der Nutzer gerade eine oder auch mehrere der Tasten ALT, ALT GR, SHIFT oder STRG gedrückt hält. Um dies in Erfahrung zu bringen, hilft uns der ShiftState.

Im folgenden möchten wir uns sowohl anschauen, wie man den ShiftState in Standard-Events der Tastatur oder der Maus abfragen und nutzen kann als auch in Erfahrung bringen, wie dies außerhalb der Standard-Events funktioniert. Zuletzt möchten wir uns darüber hinaus ansehen, wie wir den ShiftState im Zusammenhang mit anderen Tasten nutzen können, um Tastenkombinationen abzufragen:

ShiftState in Standard-Events

Am einfachsten ist die Abfrage der gedrückten Modifikator-Tasten in einer Standardprozedur von Delphi oder Lazarus, die uns bereits eine Variable mit dem ShiftState zur Verfügung stellt. Dies ist zum Beispiel in den Standard-Events OnMouseDown (Maus wird gedrückt), OnMouseUp (Maus wird losgelassen), OnMouseMove (Maus wird bewegt), OnMouseWheel (Mausrad wird bewegt), OnKeyDown (Taste wird gedrückt) oder OnKeyUp (Taste wird losgelassen) der Fall.

Schauen wir uns dazu ein kleines Beispiel an:

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('Linke Maustaste');
  if ssRight       in Shift then ShowMessage('Rechte Maustaste');
  if ssMiddle      in Shift then ShowMessage('Mittlere Maustaste');
  if ssDoubleClick in Shift then ShowMessage('Doppelklick');
end;

Hier haben wir beispielsweise das OnKeyUp-Event für ein Edit-Feld gesetzt. Automatisch haben wir dabei die Variablen Key und Shift zur Verfügung, aus denen wir abfragen können, welche normale Taste gedrückt wurde (Key) und welche Spezialtaste dabei gehalten wurde oder welche besondere Aktion ansonsten aktiv war (Shift).

So ist es neben dem Halten von ALT, SHIFT, CTRL und ALT GR mit ShiftState auch möglich, zum Beispiel heraus zu finden, ob gerade die linke Maustaste oder die rechte Maustaste gehalten wurde oder ob doppelt mit der Maus geklickt wurde. Im Beispielcode fragen wir einige dieser Zustände ab und geben dem Nutzer eine Nachricht aus, die über den aktuellen Zustand informiert.

ShiftState in eigener Prozedur

Wenn wir eine eigene Prozedur oder Funktion schreiben, stellt uns Delphi oder Lazarus natürlich nicht automatisch die Variable "Shift" zur Verfügung. Dennoch ist es möglich, uns selbst eine solche Variable anzulegen.

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

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

Dazu deklarieren wir uns einfach eine beliebige Variable vom Typ TShiftState. Nennen wir sie einfach currentShiftState wie in unserem Beispielcode. Mit der Funktion GetKeyShiftState können wir den aktuellen ShiftState abfragen und dann anschließend einfach damit arbeiten, wie wir es auch schon im ersten Beispiel gemacht haben.

ShiftState in Kombination mit andere Tasten

Natürlich können wir die Abfrage des ShiftStates auch mit der Abfrage anderer Tasten kombinieren und so auf das Drücken von Tastenkombinationen prüfen. Auch dazu ein kleines Beispiel:

procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin    
  if (Shift = [ssCtrl]) and (key = ord('A')) then begin
    ShowMessage('STRG + A wurde geklickt');
  end;

  if (ssShift in Shift) and (ssAlt in Shift) then begin
    ShowMessage('Die SHIFT- und die ALT-Taste werden gehalten')
  end;
end;

Zunächst prüfen wir hier ob der Nutzer die Tastenkombination STRG + A gedrückt hat, indem wir nicht nur auf Shift = ssCTRL prüfen sondern auch ob gleichzeitig die A-Taste gedrückt wurde, indem wir den Wert von Key auswerten. Da Key vom Typ Word ist, müssen wir "A" dafür zunächst in einen Zahlenwert umwandeln (wir könnten auch direkt auf 65 prüfen).

Anschließend prüfen wir, ob sowohl die SHIFT-Taste als auch die ALT-Taste gleichzeitig gehalten werden.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Delphi: Systemweiter HotKey

Tutorial | 3 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.