AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tastencode und Unicode

Ein Thema von akurka · begonnen am 19. Mär 2016 · letzter Beitrag vom 21. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#1

Tastencode und Unicode

  Alt 19. Mär 2016, 17:37
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.
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#2

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 10:14
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.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#3

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 10:42
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
Anton Kurka
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#4

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 11:20
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!
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (20. Mär 2016 um 11:23 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#5

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 11:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.797 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 11:37
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#7

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 11:45
Zu lange nicht mehr gebraucht

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Tastencode und Unicode

  Alt 20. Mär 2016, 11: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
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#9

AW: Tastencode und Unicode

  Alt 21. Mär 2016, 09:17
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
Anton Kurka
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
909 Beiträge
 
Delphi 6 Professional
 
#10

AW: Tastencode und Unicode

  Alt 21. Mär 2016, 10:30
Hmm..

< > Unterscheidung wurde doch erklärt :

...
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf