Thema: Delphi Tastencode und Unicode

Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#8

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 10:58
Im OnKeyPress bekommst Du das Zeichen geliefert, das aktuell der gedrückten Taste zugeordnet ist.

Die Taste, die auf einer deutschen Tastatur das Z liefert, ist auf einer englischen Tastatur mit dem Y belegt.
Wenn Du nun z. B. die Spracheinstellung der Tastatur von Deutsch auf Englisch änderst, wirst Du im OnKeyPress beim Drücken der Z-Taste (der deutschen Tastatur) ein Y bekommen. Andersherum bekommst Du, mit einer deutschsprachigen Einstellung der Tastatur, auf einer englischen Tastatur beim Drücken der Y-Taste ein Z.

In OnKeyDown und OnKeyUp bekommst Du jedoch nicht das Zeichen geliefert, dass der Tastaturbeschriftung entspricht, sondern schlicht und einfach die Nummer das Taste, die gedrückt wurde. Eine Übereinstimmung von Tastennummer und Zeichen kann möglich sein, ist aber nicht zwingend.

Bei meinem Rechner hat die Taste für die Zeichen < und >, die ja auf einer Taste liegen, die Nummer 226.

Zustätzlich wird auch noch TShiftState geliefert. Mögliche Werte sind hier TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); Hiervon können 0 bis 7 Werte, in beliebiger Kombination, geliefert werden.
Willst Du also in OnKeyDown und/oder OnKeyUp wissen, ob < oder > gedrückt wurden, so musst Du abfragen, ob Key = 226 ist.
Willst Du zwischen < und > unterscheiden können, so musst Du abfragen, ob Shift = ssShift ist. Ist dem so, dann wurde als Eingabe > gemeint. Ist ssShift jedoch "leer" so wurde als Eingabe < gemeint.
Da die Taste aber auch noch die Belegung für | hat, musst Du ggfls. auch noch abfragen, ob Shift ssAlt enthält. Wird also als Key 226 geliefert und Shift ist gleich ssAlt, so wurde als Eingabe | gemeint.

Bei einer anderen Spracheinstellung der Tastatur kann das Ergebnis natürlich vollkommen anders sein.

Hier kannst Du Dir eine Reihe von Tastaturlayouts anschauen: http://www.uni-regensburg.de/EDV/Misc/KeyBoards/

Miniprogrämmelchen zur Anzeige der getätigten Tastaturkombinationen:
Delphi-Quellcode:
unit fmKeyPreviewUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

type
  TfmKeyPreview = class(TForm)
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  fmKeyPreview: TfmKeyPreview;

implementation

{$R *.dfm}

procedure TfmKeyPreview.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
         s : String;
begin
  s := '';
  if ssShift in Shift then s := s + 'Shift + ';
  if ssAlt in Shift then s := s + 'Alt + ';
  if ssCtrl in Shift then s := s + 'Ctrl + ';
  if ssLeft in Shift then s := s + 'Left + ';
  if ssRight in Shift then s := s + 'Right + ';
  if ssMiddle in Shift then s := s + 'Middle + ';
  if ssDouble in Shift then s := s + 'Double + ';
  Caption := s + IntToStr(Key);
end;

end.
  Mit Zitat antworten Zitat