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
- ShiftState in eigener Prozedur
- ShiftState in Kombination mit andere Tasten
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.
Über den Autor
Software 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
Mehrere Texte gleichzeitig ersetzen
Tutorial | 0 Kommentare
Firefox: 15 nützliche Tastaturkürzel, die niemand kennt
Artikel | 0 Kommentare
jQuery: Tasten auf Tastatur Aktion zuweisen (Keyboard Event)
Tipp | 0 Kommentare
Delphi/Lazarus: STRG+C in Memo oder Edit abfangen und Zwischenablage manipulieren
Tutorial | 0 Kommentare
Delphi/Lazarus: Mit STRG+A in ListView alles markieren
Tipp | 0 Kommentare
Delphi/Lazarus: Markierte Items aus ListBox mit ENTF-Taste löschen
Tipp | 0 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.