Grundlegendes zu und Verarbeitung von Tastaturereignissen in Delphi

Tastaturereignisse sind zusammen mit Mausereignissen die Hauptelemente der Interaktion eines Benutzers mit Ihrem Programm.

Im Folgenden finden Sie Informationen zu drei Ereignissen, mit denen Sie die Tastenanschläge eines Benutzers in einer Delphi-Anwendung erfassen können: OnKeyDown, OnKeyUp und OnKeyPress.

Runter, rauf, drücken, runter, rauf, drücken ...

Delphi-Anwendungen können zwei Methoden zum Empfangen von Eingaben über die Tastatur verwenden. Wenn ein Benutzer etwas in eine Anwendung eingeben muss, können Sie diese Eingabe am einfachsten über eines der Steuerelemente empfangen, das automatisch auf Tastendrücke reagiert, z. B. Bearbeiten.

Zu anderen Zeiten und für allgemeinere Zwecke können wir jedoch Prozeduren in einem Formular erstellen, die drei Ereignisse verarbeiten, die von Formularen und jeder Komponente erkannt werden, die Tastatureingaben akzeptiert. Wir können Ereignishandler für diese Ereignisse schreiben, um auf jede Taste oder Tastenkombination zu reagieren, die der Benutzer zur Laufzeit drückt.

Hier sind diese Ereignisse:

OnKeyDown - Wird aufgerufen, wenn eine beliebige Taste auf der Tastatur gedrückt wird
OnKeyUp - wird aufgerufen, wenn eine Taste auf der Tastatur losgelassen wird
OnKeyPress - Wird aufgerufen, wenn eine Taste gedrückt wird, die einem ASCII-Zeichen entspricht

Tastatur-Handler

Allen Tastaturereignissen ist ein Parameter gemeinsam. Das Schlüssel Parameter ist die Taste auf der Tastatur und wird verwendet, um den Wert der gedrückten Taste als Referenz zu übergeben. Das Verschiebung Parameter (in der OnKeyDown und OnKeyUp Prozeduren) gibt an, ob die Umschalt-, Alt- oder Strg-Taste mit dem Tastenanschlag kombiniert ist.

Der Parameter Sender verweist auf das Steuerelement, mit dem die Methode aufgerufen wurde.

 Verfahren TForm1.FormKeyDown (Absender: TObject; var Stichwort; Shift: TShiftState);… Verfahren TForm1.FormKeyUp (Absender: TObject; var Stichwort; Shift: TShiftState);… Verfahren TForm1.FormKeyPress (Absender: TObject; var Schlüssel: Char); 

Wenn der Benutzer auf Tastenkombinationen oder Zugriffstasten reagiert, z. B. bei Menübefehlen, müssen keine Ereignishandler geschrieben werden.

Was ist Fokus??

Fokus ist die Fähigkeit, Benutzereingaben über die Maus oder die Tastatur zu empfangen. Nur das Objekt mit dem Fokus kann ein Tastaturereignis empfangen. Außerdem kann zu einem bestimmten Zeitpunkt nur eine Komponente pro Formular in einer laufenden Anwendung aktiv sein oder den Fokus haben.

Einige Komponenten, wie z TBild, TPaintBox, TPanel und TLabel kann den Fokus nicht erhalten. Im Allgemeinen werden Komponenten abgeleitet von TGraphicControl können den Fokus nicht erhalten. Zusätzlich Komponenten, die zur Laufzeit unsichtbar sind (TTimer) kann den Fokus nicht erhalten.

OnKeyDown, OnKeyUp

Das OnKeyDown und OnKeyUp Ereignisse bieten die geringste Tastaturreaktion. Beide OnKeyDown und OnKeyUp Handler können auf alle Tastaturtasten reagieren, einschließlich Funktionstasten und Tasten in Kombination mit Verschiebung, Alt, und Strg Schlüssel.

Die Tastaturereignisse schließen sich nicht gegenseitig aus. Wenn der Benutzer eine Taste drückt, werden beide Tasten OnKeyDown und OnKeyPress Ereignisse werden generiert, und wenn der Benutzer die Taste loslässt, wird die OnKeyUp Ereignis wird generiert. Wenn der Benutzer eine der Tasten drückt, die OnKeyPress erkennt nicht, nur die OnKeyDown Ereignis eintritt, gefolgt von der OnKeyUp Veranstaltung.

Wenn Sie eine Taste gedrückt halten, wird die OnKeyUp Ereignis tritt nach all dem ein OnKeyDown und OnKeyPress Ereignisse sind aufgetreten.

OnKeyPress

OnKeyPress gibt ein anderes ASCII-Zeichen für 'g' und 'G' zurück, aber OnKeyDown und OnKeyUp Unterscheiden Sie nicht zwischen Groß- und Kleinbuchstaben.

Key- und Shift-Parameter

Seit der Schlüssel Wenn der Parameter als Referenz übergeben wird, kann sich der Ereignishandler ändern Schlüssel so dass die Anwendung einen anderen Schlüssel als an dem Ereignis beteiligt ansieht. Auf diese Weise können Sie die Arten von Zeichen einschränken, die der Benutzer eingeben kann, um beispielsweise zu verhindern, dass Benutzer Alphatasten eingeben.

 wenn Schlüssel im ['a'… 'z'] + ['A'… 'Z'] dann Schlüssel: = # 0 

Die obige Anweisung prüft, ob die Schlüssel Parameter ist in der Vereinigung von zwei Sätzen: Kleinbuchstaben (d. h. ein durch z) und Großbuchstaben (A-Z). In diesem Fall weist die Anweisung den Zeichenwert Null zu Schlüssel um eine Eingabe in die Bearbeiten Komponente, wenn sie beispielsweise den geänderten Schlüssel erhält.

Bei nicht alphanumerischen Tasten können die virtuellen Tastencodes von WinAPI verwendet werden, um die gedrückte Taste zu bestimmen. Windows definiert spezielle Konstanten für jede Taste, die der Benutzer drücken kann. Beispielsweise, VK_RIGHT ist der virtuelle Tastencode für die rechte Pfeiltaste.

Um den Schlüsselstatus einiger spezieller Schlüssel wie zu erhalten TAB oder PageUp, wir können das benutzen GetKeyState Windows API-Aufruf. Der Tastenstatus gibt an, ob die Taste auf, ab oder umgeschaltet ist (ein oder aus - bei jedem Tastendruck abwechselnd)..

 wenn HiWord (GetKeyState (vk_PageUp)) 0 dann ShowMessage ('Bild-auf-Ab') sonst ShowMessage ('PageUp-UP'); 

In dem OnKeyDown und OnKeyUp Veranstaltungen, Schlüssel ist ein vorzeichenloser Word-Wert, der einen virtuellen Windows-Schlüssel darstellt. Um den Zeichenwert von zu erhalten Schlüssel,wir nehmen das Chr Funktion. In dem OnKeyPress Veranstaltung, Schlüssel ist ein Verkohlen Wert, der ein ASCII-Zeichen darstellt.

Beide OnKeyDown und OnKeyUp Ereignisse verwenden den Shift-Parameter vom Typ TShiftState, a setzt Flags, um den Status der Tasten Alt, Strg und Umschalt zu bestimmen, wenn eine Taste gedrückt wird.

Wenn Sie beispielsweise Strg + A drücken, werden die folgenden Schlüsselereignisse generiert:

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

Tastaturereignisse in das Formular umleiten

Legen Sie die Formulare fest, um Tastenanschläge auf Formularebene abzufangen, anstatt sie an die Formularkomponenten zu übergeben KeyPreview Eigenschaft auf True (mit der Objektinspektor). Die Komponente sieht das Ereignis weiterhin, aber das Formular hat die Möglichkeit, es zuerst zu behandeln, um beispielsweise das Drücken bestimmter Tasten zuzulassen oder zu untersagen.

Angenommen, Sie haben mehrere Bearbeitungskomponenten in einem Formular und die Form.OnKeyPress Vorgang sieht so aus:

 Verfahren TForm1.FormKeyPress (Absender: TObject; var Schlüssel: Char); Start wenn Schlüssel im ['0'… '9'] dann Schlüssel: = # 0 Ende; 

Wenn eine der Edit-Komponenten die Fokus, und die KeyPreview Die Eigenschaft eines Formulars ist False. Dieser Code wird nicht ausgeführt. Mit anderen Worten, wenn der Benutzer die Taste drückt 5 Schlüssel, der 5 Das Zeichen wird in der fokussierten Bearbeitungskomponente angezeigt.

Wenn jedoch die KeyPreview ist auf True gesetzt, dann ist das Formular OnKeyPress Das Ereignis wird ausgeführt, bevor die Edit-Komponente die gedrückte Taste sieht. Nochmals, wenn der Benutzer die Taste gedrückt hat 5 key, dann weist es Key den Zeichenwert Null zu, um eine numerische Eingabe in die Edit-Komponente zu verhindern.