Computerwissenschaften

Tastaturereignisse in Delphi verstehen und verarbeiten

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ück, runter, rauf, drück …

Delphi-Anwendungen können zwei Methoden zum Empfangen der Eingabe von der Tastatur verwenden. Wenn ein Benutzer etwas in eine Anwendung eingeben muss, können Sie diese Eingabe am einfachsten erhalten, indem Sie eines der Steuerelemente verwenden, 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 von 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 möglicherweise drückt.

Hier sind diese Ereignisse:

OnKeyDown – wird aufgerufen, wenn eine 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

 

Tastaturhandler

Alle Tastaturereignisse haben einen Parameter gemeinsam. Der Parameter Key ist die Taste auf der Tastatur und wird verwendet, um den Wert der gedrückten Taste als Referenz zu übergeben. Der Shift- Parameter (in den Prozeduren OnKeyDown und OnKeyUp ) gibt an, ob die Umschalt-, Alt- oder Strg-Taste mit dem Tastenanschlag kombiniert sind.

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

 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) ;
...
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState) ;
...
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char) ;

Um zu reagieren, wenn der Benutzer Tastenkombinationen oder Gaspedaltasten drückt, z. B. die mit Menübefehlen gelieferten, 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 TImage , TPaintBox , TPanel und TLabel können keinen Fokus erhalten. Im Allgemeinen können von TGraphicControl abgeleitete Komponenten keinen Fokus erhalten. Darüber hinaus können Komponenten, die zur Laufzeit unsichtbar sind ( TTimer ), keinen Fokus erhalten.

 

OnKeyDown, OnKeyUp

Die Ereignisse OnKeyDown und OnKeyUp bieten die niedrigste Tastaturantwort. Sowohl OnKeyDown- als auch OnKeyUp- Handler können auf alle Tastaturtasten reagieren, einschließlich Funktionstasten und Tasten in Kombination mit den Umschalt- , Alt- und Strg- Tasten.

Die Tastaturereignisse schließen sich nicht gegenseitig aus. Wenn der Benutzer eine Taste drückt, werden sowohl das OnKeyDown- als auch das OnKeyPress- Ereignis generiert. Wenn der Benutzer die Taste loslässt , wird das  OnKeyUp- Ereignis generiert. Wenn der Benutzer eine der Tasten drückt, die OnKeyPress nicht erkennt , tritt nur das  OnKeyDown- Ereignis auf, gefolgt vom  OnKeyUp- Ereignis.

Wenn Sie eine Taste gedrückt halten, tritt das OnKeyUp- Ereignis auf, nachdem alle OnKeyDown- und OnKeyPress- Ereignisse aufgetreten sind.

 

OnKeyPress

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

 

Schlüssel- und Umschaltparameter

Da der Schlüsselparameter als Referenz übergeben wird, kann der Ereignishandler den Schlüssel so ändern , dass die Anwendung einen anderen Schlüssel als am Ereignis beteiligt sieht. Auf diese Weise können Sie die Art der Zeichen einschränken, die der Benutzer eingeben kann, um beispielsweise zu verhindern, dass Benutzer Alphatasten eingeben.

 if Key in ['a'..'z'] + ['A'..'Z'] then Key := #0 

Die obige Anweisung prüft, ob der Parameter Key aus zwei Sätzen besteht: Kleinbuchstaben (dh a  bis z ) und Großbuchstaben ( AZ ). In diesem Fall weist die Anweisung Key den Zeichenwert Null zu , um jegliche Eingabe in die Edit- Komponente zu verhindern , beispielsweise wenn sie den geänderten Schlüssel empfängt.

Bei nicht alphanumerischen Tasten können virtuelle WinAPI- Tastencodes verwendet werden, um die gedrückte Taste zu bestimmen. Windows definiert spezielle Konstanten für jede Taste, die der Benutzer drücken kann. Beispielsweise ist VK_RIGHT der virtuelle Schlüsselcode für den Rechtspfeil .

Um den Schlüsselstatus einiger spezieller Schlüssel wie TAB oder PageUp abzurufen , können wir den Windows-API-Aufruf GetKeyState verwenden . Der Tastenstatus gibt an, ob die Taste nach oben, unten oder umgeschaltet ist (ein oder aus – abwechselnd bei jedem Drücken der Taste).

 if HiWord(GetKeyState(vk_PageUp)) <> 0 then
ShowMessage('PageUp - DOWN')
else
ShowMessage('PageUp - UP') ;

In den Ereignissen OnKeyDown und OnKeyUp ist Key ein vorzeichenloser Word-Wert, der einen virtuellen Windows-Schlüssel darstellt. Um den Zeichenwert von Key zu erhalten , verwenden  wir die Chr- Funktion. Im OnKeyPress- Ereignis ist Key ein Char- Wert, der ein ASCII-Zeichen darstellt.

Sowohl OnKeyDown- als auch OnKeyUp- Ereignisse verwenden den Shift-Parameter vom Typ TShiftState , ein gesetztes Flag , 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 (Ctrl) // ssCtrl
KeyDown (Ctrl+A) //ssCtrl + 'A'
KeyPress (A)
KeyUp (Ctrl+A)

 

Weiterleiten von Tastaturereignissen an das Formular

Um Tastenanschläge auf Formularebene abzufangen, anstatt sie an die Komponenten des Formulars zu übergeben , setzen Sie die KeyPreview- Eigenschaft des Formulars auf True (mithilfe des Objektinspektors ). Die Komponente sieht das Ereignis weiterhin, aber das Formular hat die Möglichkeit, es zuerst zu behandeln, um beispielsweise das Drücken einiger Tasten zuzulassen oder zu verbieten.

Angenommen, Sie haben mehrere Bearbeitungskomponenten in einem Formular und die Form.OnKeyPress- Prozedur sieht folgendermaßen aus:

 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char) ;
begin
if Key in ['0'..'9'] then Key := #0
end;

Wenn eine der Edit-Komponenten den Fokus hat  und die  KeyPreview- Eigenschaft eines Formulars False ist, wird dieser Code nicht ausgeführt. Mit anderen Worten, wenn der Benutzer die presst 5 Taste, die 5 wird Zeichen in der fokussierten Komponente bearbeiten erscheinen.

Wenn die KeyPreview jedoch auf True gesetzt ist, wird das OnKeyPress- Ereignis des Formulars ausgeführt, bevor die Edit-Komponente die gedrückte Taste sieht. Wenn der Benutzer die Taste 5 gedrückt hat, weist er der Taste erneut den Zeichenwert Null zu, um eine numerische Eingabe in die Edit-Komponente zu verhindern.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.