Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tastencode und Unicode (https://www.delphipraxis.net/188601-tastencode-und-unicode.html)

akurka 19. Mär 2016 16:37

Tastencode und Unicode
 
Hallo
Folgendes Problem :
Zeichen <,=,> eingelesen beim Form2.OnKeyDown haben den Code 226,48,228.
Gemäss Unicode müsten es aber 60,61,62 sein.

Leider kennt Delphi keinen VK_code für < oder > Tasten ich musste darum direkt mit dem Tastencode arbeiten. Beispiel :

im OnKeyDown wird "DownTaste := Key" bei der Taste < gedrückt,
(DownTaste :word).
anschliessend dann
Buffer := chr(DownTaste); (auch Buffer:= chr(ord(DownTaste))liefert den
gleichen Resultat).
in der Ausgabeprocedur wird mit Form2.Canvas.TextOut(X,Y,Buffer) das Zeichen in der Grafik ausgegeben

Angezeigt werden in der Graphik mit Form2.Canvas.TextOut für z.Bsp
< : ein a(mit circumflex), was dem UniCode entspricht, gewünscht wäre aber eine Anzeige von < .

Ein Wechsel von CharSet im OI hat keine Auswirkung.
Alle anderen Zeichen werden korrekt eingelesen und auch in der Graphik
korrekt angezeigt.
Auch ein Versuch mit OnKeyPress (liefert direkt ein Char) hat nichts gebracht.

Hat jemand eine Idee wo das Problem liegt ?
vielen Dank in voraus.

p80286 20. Mär 2016 09:14

AW: Tastencode und Unicode
 
Was bringt Dich auf die Idee, Tastaturcodes hätten irgendetwas mit dem verwendeten Zeichensatz zu tun?
Es handelt sich um einen Numerischen Wert, der, wenn man weiß welches Zeichen zugeordnet werden soll, in ein entsprechendes Zeichen oder eine Zeichenfolge, übersetzt wird. Diese Aufgabe übernimmt im allgemeinen der Tastaturtreiber.

Gruß
K-H

P.S.
Und mehrere Tastencodes können auch nur zu einem Zeichen führen.

akurka 20. Mär 2016 09:42

AW: Tastencode und Unicode
 
Hallo K-H
ja gerade hier habe ich ein Problem un das ganze zu verstehen.

Wenn ich ein Zeichen mit OnKeyPress einlese und anschlieesend anzeige
erhalte ich für den Tastendruck von < auch das < auf der Anzeige.

Anderenfalls mit OnKeyDown eingelesene Taste < ergibt ein Code der
dem a(mit circumflex)= 226 was dem UTF-8 in der CodeTabelle entspricht.
Dagegen entspricht < dem Wert 60 in der UTF-8 Tabelle ????

Also nahm ich an, dass OnKeyDown mit Unicode arbeitet und OnKeyPress mit
dem ANSI CODESET arbeitet. Vermutlich ist aber meine Annahme fasch ?!

Ja nun, was ist das für ein Wert das der OnKeyDown liefert und für was ist es überhaupt gut wenn der Tastaturcode teilweise mit dem geliefertem Wert nicht übereinstimmt ?
Genau hier habe ich ein Verständnis Problem.
Gruss Anton

p80286 20. Mär 2016 10:20

AW: Tastencode und Unicode
 
Was Dir geliefert wird ist zunächst einmal die Nummer der Taste! Ich habe länger schon nicht mehr mit damit gearbeitet, darum solltest Du Dir onKeydown/onKeypressed/onKeyup(?) einmal genau anschauen, vor allem was wann zurück gegeben wird.
Hilfreich ist u.U.:https://de.wikipedia.org/wiki/Keycode

Gruß
K-H

P.S.
<> ist eine Taste! Du mußt auch den Shiftstate auswerten!

HolgerX 20. Mär 2016 10:34

AW: Tastencode und Unicode
 
Hmm..

Die Tastatur kennt KEIN UniCode !!

OnKeyDown und OnKeyUp liefert 'Virtual Keys' also einen Identifer für die physikalische Taste auf der Tastatur!

Anhand dieses Key-Wertes in Kombination mit dem Shiftstate wird daraus ein Char.

http://delphi.about.com/od/adptips2006/qt/vkey2char.htm
http://www.mods.com.au/budapi_docs/V...ey%20Codes.htm

Anzumerken sei noch, das der 'Virtual Key' bereits schon seitens des OS aus dem RAW-Key errechnet wurde.
Denn gerade, wenn mit 'Alt gr' + Numpad ein Buchstaben-Code eingegeben wird, werden für ein Char/Key mehre Tasten gedrückt!
Welcher Char nun auf welcher Taste liegt, ist über das Tastatur-Layout (Spracheinstellungen) definiert.

Uwe Raabe 20. Mär 2016 10:37

AW: Tastencode und Unicode
 
Zitat:

Zitat von p80286 (Beitrag 1333393)
Was Dir geliefert wird ist zunächst einmal die Nummer der Taste!

Das ist nicht ganz richtig. Die Zahl entspricht vielmehr dem Virtual-Key Code gemäß dieser Tabelle: Virtual-Key Codes

p80286 20. Mär 2016 10:45

AW: Tastencode und Unicode
 
:oops: Zu lange nicht mehr gebraucht :oops:

Gruß
K-H

nahpets 20. Mär 2016 10:58

AW: Tastencode und Unicode
 
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
Delphi-Quellcode:
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.

akurka 21. Mär 2016 08:17

AW: Tastencode und Unicode
 
Hallo mitenand

@nahpets
Besten Dank für die ausführiche Antwort.
Das erklärt mir einiges.

Nun habe ich das Problem mit den < und > Zeichen jetzt so gelöst:

für alle (druckbare)Zeichen benütze ich OnKeyPress für die
Steuertasten gibt es den VK Code, hier benütze ich OnKeyDown.
Und das funktioniert problemlos so lang ich die Deutsche/SwissG Tastatur benütze.

Das komische ist, dass in der Tabelle von "Virtual Key Codes"
(von Uwe Raabe geliefert) nur die Taste < = VK_OEM 102 existiert,
dagegen für die Taste > gibt es kein VK Code
(nur der s.g. OEM Speicher ??).Un dabei sind des Tasten die man sehr oft benützt.

Besten Dank an Alle für Euere Beiträge.
Gruss Anton

HolgerX 21. Mär 2016 09:30

AW: Tastencode und Unicode
 
Hmm..

< > Unterscheidung wurde doch erklärt :

Zitat:

Zitat von nahpets (Beitrag 1333397)
...
Bei meinem Rechner hat die Taste für die Zeichen < und >, die ja auf einer Taste liegen, die Nummer 226.

...

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.


akurka 21. Mär 2016 10:05

AW: Tastencode und Unicode
 
ja das ist mir jetzt auch klar, nun mit dem OnKeyPress funktionieren tasten < und > ohne Probleme.
Und für z.Bsp Back Taste kann ich im OnKeyDown VK_BACK benützen, das klappt und der Aufwand hält sich in Grenzen.
Gruss Anton

DeddyH 21. Mär 2016 14:30

AW: Tastencode und Unicode
 
Backspace ist #8 IIRC, das müsste auch im OnKeyPress ermittelbar sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz