Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi j-Taste abfangen? (https://www.delphipraxis.net/184560-j-taste-abfangen.html)

AlexII 6. Apr 2015 12:53

Delphi-Version: 7

j-Taste abfangen?
 
Hallo Jungs,

ich fange die j Taste wie folgt ab:

Delphi-Quellcode:
  if Key = 'j' then // mach was
Nun kann es aber sein, dass der User eine andere Belegung der Tastatur eingeschaltet hat, wie fange ich dann diese Taste ab? Läuft das nicht irgendwie über die ASCII-Tabelle?

Danke!

DeddyH 6. Apr 2015 12:55

AW: j-Taste abfangen?
 
Ein j bleibt ein j, und das hat einen festgelegten Wert im Zeichensatz.

AlexII 6. Apr 2015 13:05

AW: j-Taste abfangen?
 
Welcher ist das, wo kann man das nachschauen? Aber wenn die Belegung auf ne andere Sprache umgestellt wird, funktioniert das nicht mehr. Was mache ich dann?

bernau 6. Apr 2015 13:18

AW: j-Taste abfangen?
 
Due bekommst nicht die physikalische Taste übergeben, sondern der Buchstabe, der laut Ländereinstellung der Taste zugewiesen ist. Wenn durch eine andere Ländereinstellung, das "j" nicht mehr bei "j" ist, dann bekommst du den Buchstaben, der nun auf der "j"-Taste gemappt ist.

DeddyH 6. Apr 2015 13:18

AW: j-Taste abfangen?
 
Wenn Du das Tastaturlayout umstellst, stimmt zwar die Beschriftung der Tastatur ggf. nicht mehr mit den gesendeten Zeichen überein, diese bleiben aber nach wie vor dieselben. D.h. stellst Du z.B. auf Englisch (USA) um und drückst die y-Taste auf einer deutschen Tastatur, wird ein z gesendet und andersherum.

AlexII 6. Apr 2015 13:22

AW: j-Taste abfangen?
 
Ja das ist mit klar, aber wie reagiere ich auf die j-Taste in allen Sprachen? Ich meine mir ist egal welches Zeichen da gesendet wird, ich brauche die Taste... sobald die j-Taste gedrückt wird, die Sprache ist egal, reagiert mein Prog darauf.

bernau 6. Apr 2015 13:22

AW: j-Taste abfangen?
 
Vieleicht hilft folgender Thread. (Letzter Beitrag)

http://www.delphipraxis.net/154459-k...-erfahren.html

milos 6. Apr 2015 13:24

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296321)
Läuft das nicht irgendwie über die ASCII-Tabelle?

Nein ein normaler String in Delphi ist ein Unicode-String. (Ab Delphi 2009 soweit ich weiss, bei älteren ist es noch ein ASCII-String)
http://unicode-table.com/en/ Für die Unicode Tabelle
http://www.asciitable.com/ Die Ascii Tabelle
Edit: Sehe gerade du benutzt Delphi 7, in diesem Fall ists ein ASCII-String :)


Aber wie gesagt, ein "J" bleibt eigentlich ein "J".
z.B.
Auf der englischen Tastatur ist das "Y" wo bei uns das "Z" ist und umgekehrt.
Wenn jetz jemand mit einem englischen Tastatur layout bei sich auf das "Z" klickt, was bei dir jedoch das "Y" ist, wird trotzdem ein "Z" gesendet, da eben genau dafür die Tabelle und die Tastaturlayouts da sind.

Also wenn du ein "J" abfragen willst, egal welche Sprache er eingestellt hat, frag einfach das ganz normale "J" ab? Wo soll da das Problem sein? :D

Freundliche Grüsse

bernau 6. Apr 2015 13:28

AW: j-Taste abfangen?
 
Zitat:

Zitat von milos (Beitrag 1296328)
Also wenn du ein "J" abfragen willst, egal welche Sprache er eingestellt hat, frag einfach das ganz normale "J" ab? Wo soll da das Problem sein? :D

Kann ja sein, daß er eine deutsche Tastatur hat und damit rechnent, daß ggf. die Ländereinstellung geändert wird. Er will aber immer diese eine Taste ansprechen.

AlexII 6. Apr 2015 13:29

AW: j-Taste abfangen?
 
Ok... funktioniert bei mir aber nicht, sobald ich die Sprache umstelle gleicht die if-Abfrage dem False Wert. Schalte ich zurück auf Deutsch = klappt es wieder.

BadenPower 6. Apr 2015 13:43

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296330)
Ok... funktioniert bei mir aber nicht, sobald ich die Sprache umstelle gleicht die if-Abfrage dem False Wert. Schalte ich zurück auf Deutsch = klappt es wieder.

Hast Du Dir einmal anzeigen lassen, was für ein Zeichen ausgegeben wird?

Delphi-Quellcode:
ShowMessage(Key);

milos 6. Apr 2015 13:45

AW: j-Taste abfangen?
 
Du machst das schon im KeyPress-Event oder?
Habs gerade getestet, bei mir funktioniert dies mit Deutsch (Schweiz), Deutsch (Deutschland), Französisch (Schweiz) und Englisch (USA)

Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = 'j' then
    showmessage('test');
end;
Ist dein Formular im Fokus wenn du die Taste "J" drückst? Sollte eigentlich funktionieren.
Ob man die Tastenposition an der Tastatur abfragen kann, weiss ich nicht, könnte aber schwer werden mit Delphi.

Freundliche Grüsse

Dalai 6. Apr 2015 13:47

AW: j-Taste abfangen?
 
Was willst du eigentlich damit erreichen? Vielleicht gibt's ja einen anderen/besseren Weg, das zu lösen.

MfG Dalai

AlexII 6. Apr 2015 13:49

AW: j-Taste abfangen?
 
Zitat:

Zitat von BadenPower (Beitrag 1296332)
Zitat:

Zitat von AlexII (Beitrag 1296330)
Ok... funktioniert bei mir aber nicht, sobald ich die Sprache umstelle gleicht die if-Abfrage dem False Wert. Schalte ich zurück auf Deutsch = klappt es wieder.

Hast Du Dir einmal anzeigen lassen, was für ein Zeichen ausgegeben wird?

Delphi-Quellcode:
ShowMessage(Key);


Ein Fragezeichen kommt bei mir raus...

Muss allerdings sagen, dass das unter Lazarus mache... das konnte ich aber beim Erstellen des Threads nicht auswählen.

AlexII 6. Apr 2015 13:50

AW: j-Taste abfangen?
 
Zitat:

Zitat von milos (Beitrag 1296333)
Du machst das schon im KeyPress-Event oder?

Ja das ist es!

Captnemo 6. Apr 2015 13:51

AW: j-Taste abfangen?
 
Ich weiß jetzt auch nicht wirklich, was sich am "j" in den Tastaturlayouts verändern sollte. Ein J ist auch in USA, England, Schweiz, Frankreich immer noch ein J.
Beim Z oder Y würd ich's ja noch verstehen.

Vielleicht könnte ein bisschen Code vom TE das Mysterium aufklären.

Sir Rufo 6. Apr 2015 13:54

AW: j-Taste abfangen?
 
Zitat:

Zitat von Dalai (Beitrag 1296334)
Was willst du eigentlich damit erreichen? Vielleicht gibt's ja einen anderen/besseren Weg, das zu lösen.

MfG Dalai

Die Frage nach dem Kontext ist hier durchaus berechtigt.

Ich vermute mal es geht um den ersten Buchstabe für eine positive Bestätigung, die in deutsch Ja, in englisch Yes, in französisch Oui, in russisch Da, in ... ist.

Somit hätten wir also J, Y, O, D, ... je nach Landessprache ...

AlexII 6. Apr 2015 13:55

AW: j-Taste abfangen?
 
Ich wechsle auf eine kyrillische Sprache und da ist ein 'j' was anderes. Hier mein Code:

Delphi-Quellcode:
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = 'j' then
  begin
    if VolumeOnImage.Visible = True then VolumeOnImageClick(Self)
    else VolumeOffImageClick(Self);
  end;
end;
Ich möchte damit nur zwei Prozeduren aufrufen (Lautstärke ein/ausschalten), mehr nichts. Und ich habe mich für die j-Taste entschieden, da sie ne Markierung für blinde hat.

Dalai 6. Apr 2015 14:02

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296339)
Ich wechsle auf eine kyrillische Sprache und da ist ein 'j' was anderes.

Logisch.

Zitat:

Delphi-Quellcode:
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = 'j' then
  begin
    if VolumeOnImage.Visible = True then VolumeOnImageClick(Self)
    else VolumeOffImageClick(Self);
  end;
end;

Klar, dass das nicht funktioniert, denn du vergleichst mit einem j in ANSI-Codierung, so wie er in deinem Quelltext steht.

Zitat:

Ich möchte damit nur zwei Prozeduren aufrufen (Lautstärke ein/ausschalten), mehr nichts. Und ich habe mich für die j-Taste entschieden, da sie ne Markierung für blinde hat.
Und du meinst, das wäre bei jedem Tastaturlayout so? AFAIK ist das J nicht bei jedem Layout an derselben Stelle, die Markierung für Blinde aber schon (immer in der mittleren Zeile, mittig platziert).

MfG Dalai

Captnemo 6. Apr 2015 14:03

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296339)
Ich wechsle auf eine kyrillische Sprache und da ist ein 'j' was anderes.

Na, das ändert die Sachlage ja schon mal erheblich.

Wenn du mit deinem Kyrillischen Tastaturlayout auf das J drückst, kommt beim Programm logischerweise kein J an, somit hat das abfragen auf J auch keinen Sinn mehr.

Prüfe im Debugger welches Zeichen kommt, und prüfe in der IF-Abfrage auf dieses Zeichen.

DeddyH 6. Apr 2015 14:04

AW: j-Taste abfangen?
 
Dann lass Dir doch einfach ausgeben, was im kyrillischen Tastaturlayout bei 'j' herauskommt.

BadenPower 6. Apr 2015 14:14

AW: j-Taste abfangen?
 
Zitat:

Zitat von DeddyH (Beitrag 1296342)
Dann lass Dir doch einfach ausgeben, was im kyrillischen Tastaturlayout bei 'j' herauskommt.

Das nützt ihm allerdings nur bedingt, denn er möchte ja in jeder Sprache bzw. mit jedem Tastaturlayout beim Druck auf die gleiche Taste die Funktionen aufrufen, egal welches Zeichen die Taste sendet.


Das heisst, dass er im KeyPress-Event ermitteln muss, welche Sprache/Tastaturlayout eingestellt ist und welches Zeichen diese Taste sendet.

AlexII 6. Apr 2015 14:15

AW: j-Taste abfangen?
 
Zitat:

Zitat von DeddyH (Beitrag 1296342)
Dann lass Dir doch einfach ausgeben, was im kyrillischen Tastaturlayout bei 'j' herauskommt.

Das wird ein 'o' ausgegeben mit showmessage(key) wird aber ein '?', voll komisch. Aber das ist eine halbfertige Lösung, da ich das auch für andere nicht germanische Sprachen schreibe.

milos 6. Apr 2015 14:17

AW: j-Taste abfangen?
 
Ich denke wenn du alle Tastaturlayouts unterstützen willst, wäre es am besten wenn du das Layout beim anzeigen und beim ausblenden der Form anpasst und du trotzdem nur mit einem Layout arbeiten kannst.

Also...

Bei FormShow wird das Tastaturlayout auf deutsch gesetzt. Somit kannst du ein einfaches "j" abfragen und jeder wird bei der Taste mit dem Strich, wo bei uns das normale "j" ist, ein "j" schicken.

Dieser Code setzte das Layout auf das Deutsche Layout.
Delphi-Quellcode:
var kbCOde : LongWord;
kbString : Array[0..9] of char;
begin
// The following line is the translation of the MAKELANGID
// macro explained in the WIN32 developper's reference help.
// if you start with "LoadKeyBoardLayout" then click the hyperlink
// to MAKELANGID. You will see all the constant I've used here.
// No more "magic numbers" like 409 or 419.

kbCode := (SUBLANG_DEFAULT shl 10) or LANG_GERMAN;

// The line below is to switch to a french canadian keyboard
//kbCode := (SUBLANG_FRENCH_CANADIAN shl 10) or LANG_FRENCH;

//Convert the binary code to an Hex string;
StrPCopy(kbString, IntToHex(kbCode, 8));

// Switch the keyboard know
LoadKeyboardLayout(@kbString, KLF_ACTIVATE);
end;
Quelle: http://www.delphipages.com/forum/sho...57&postcount=3

Wenn das ausgeführt wurde, kannst du ein einfaches J abfragen.


Das bei dem Kyrillischem Layout ein ? gesendet wird liegt wohl am ascii string.

AlexII 6. Apr 2015 14:36

AW: j-Taste abfangen?
 
@milos

Ok... aber damit zwinge ich den User dazu, noch nen blinden, eine andere Belegung in meinem Prog zu nutzen... so wie ich das verstehe, oder?

himitsu 6. Apr 2015 14:40

AW: j-Taste abfangen?
 
Ein 'j' im KeyPress bleibt immer ein 'j', egal was für ein Tastaturlayout aktiv ist, oder ob ein Input-Method-Editor (IME) dazwischen klemmt.

Bei OnKeyDown/OnKeyUp ist das was Anderes. Die Taste 'j' löst natürlich immernoch den TastenCode 'J' aus, aber ob das am Ende wirklich ein 'j' wird, ist was Anderes.

> ScanCode > KeyCode > Char

milos 6. Apr 2015 14:41

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296351)
@milos

Ok... aber damit zwinge ich den User dazu, noch nen blinden, eine andere Belegung in meinem Prog zu nutzen... so wie ich das verstehe, oder?

Genau.

Was ich nicht ganz verstanden habe. Willst du das Programm im Hintergrund laufen lassen? Wenn ja wäre mein Vorschlag keine Option dafür. Wenn aber das Programm geöffnet werden muss könnte man es versuchen, denn du könntest das Layout wieder zurück setzen wenn das Forumlar den Fokus verliert.

AlexII 6. Apr 2015 14:45

AW: j-Taste abfangen?
 
Zitat:

Zitat von himitsu (Beitrag 1296352)
Ein 'j' im KeyPress bleibt immer ein 'j', egal was für ein Tastaturlayout aktiv ist, oder ob ein Input-Method-Editor (IME) dazwischen klemmt.

In Lazarus aber nicht, wenn ich auf kyrillisch ändere ist Key bei allen Buchstaben ein '?', verstehe ich nicht wieso. Ich meine ShowMessage(Key) gibt ein '?' aus.

Stimmt vllt mit meiner if-Abfrage irgendwas nicht, da ein 'j' ist bei mir nicht immer ein 'j'.

milos 6. Apr 2015 15:23

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296354)
Zitat:

Zitat von himitsu (Beitrag 1296352)
Ein 'j' im KeyPress bleibt immer ein 'j', egal was für ein Tastaturlayout aktiv ist, oder ob ein Input-Method-Editor (IME) dazwischen klemmt.

In Lazarus aber nicht, wenn ich auf kyrillisch ändere ist Key bei allen Buchstaben ein '?', verstehe ich nicht wieso. Ich meine ShowMessage(Key) gibt ein '?' aus.

Stimmt vllt mit meiner if-Abfrage irgendwas nicht, da ein 'j' ist bei mir nicht immer ein 'j'.

Wie wäre es, wenn wir dir schon versuchen zu helfen, du dir wenigstens die antworten gründlich durchliest, damit unsere Zeit die wir für dich aufopfern nicht umsonst gewesen ist?

Ich habe dir schon gesagt was sehr wahrscheinlich der Grund ist wieso du ein '?' bekommst.
Die Antwort lautet "ASCII-String" der nur 128 verschiedene Zeichen beinhalten kann. (Und standardmässig wir bestimmt kein kyrillisch unterstützt)
Ich weiss leider nicht wie du das Problem lösen kannst, ansätze wären jedoch herauszufinden ob du das ganze mit Unicode machen kannst oder die ASCII strings auch auf Kyrillisch umstellen kannst. Weitere ansätze wüsste ich nicht mehr.

Viel erfolg!
Freundliche Grüsse

hathor 6. Apr 2015 15:24

AW: j-Taste abfangen?
 
Die j-Taste hat den Scancode 74:

Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=74 then Winapi.Windows.Beep(2000,50);
end;

AlexII 6. Apr 2015 15:34

AW: j-Taste abfangen?
 
Zitat:

Zitat von hathor (Beitrag 1296356)
Die j-Taste hat den Scancode 74:

Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=74 then Winapi.Windows.Beep(2000,50);
end;

Wo hast Du den Scancode her?

AlexII 6. Apr 2015 15:36

AW: j-Taste abfangen?
 
Zitat:

Zitat von milos (Beitrag 1296355)
Wie wäre es, wenn wir dir schon versuchen zu helfen, du dir wenigstens die antworten gründlich durchliest, damit unsere Zeit die wir für dich aufopfern nicht umsonst gewesen ist?

Verzeih, aber ich registriere das sehr wohl... habe gerade daran gebastelt. :thumb:

AlexII 6. Apr 2015 15:44

AW: j-Taste abfangen?
 
Ich hab's ... das macht es. :thumb:

Delphi-Quellcode:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=74 then //...
end;

Vielen vielen dank an alle! Auch wenn ich nicht alles anwenden konnte, so habe ich mit eurer Hilfe viel gelernt. :thumb:

hathor 6. Apr 2015 15:45

AW: j-Taste abfangen?
 
Zitat:

Zitat von AlexII (Beitrag 1296358)
Wo hast Du den Scancode her?

https://de.wikipedia.org/wiki/Scancode

Zitat:
Um aber beim für den Vertrieb in vielen Ländern geplanten IBM PC nicht in jeder länderspezifischen Tastaturvariante andere Codes generieren zu müssen, wurde jeder Taste eine Nummer zugeordnet, der sog. Scancode. Dem Scancode wurde dann erst im Rechner vom Tastaturtreiber ein ASCII-Code zugeordnet. Für den Scancode wurden die Tasten einfach nach ihrer Lage auf der Tastatur reihenweise von links nach rechts durchnummeriert, im Gegensatz zum ASCII-Code, der der alphabetischen Anordnung folgt.

-----------------------
Kleine Änderung:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.KeyPreview:= true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
caption := IntToStr(Key); // so bekommt man den Scancode
if key=74 then Winapi.Windows.Beep(2000,50);
end;

himitsu 6. Apr 2015 16:19

AW: j-Taste abfangen?
 
Delphi-Quellcode:
Ord('J') = 74 = $4F
VK_xxx - Virtual-Keycode

Dejan Vu 6. Apr 2015 17:14

AW: j-Taste abfangen?
 
Ich frag nur vorsichtshalber: Scancode = (Virtual)KeyCode?

Ich meine ja, aber dann passt das nicht mit der Aussage, das die Tasten einfach durchnummeriert wurden.
Wenn 'J' die 74. Taste ist (was stimmen mag) und gleichzeitig (rein zufällig) Ord('J')=74 ist (was stimmt), dann müsste ja das 'A' (ord('A')=65) 9 Tasten links vom 'J' sein, was jetzt wiederum nicht ganz richtig ist.

himitsu 6. Apr 2015 17:49

AW: j-Taste abfangen?
 
Nein.

ScanCode ist der Code der Taste, (Z = Z und Y = Y)
KeyCode der Code nach übersetzung des KeyboardLayouts (z.B. Z und Y, je Sprache)
und Char, SysChar usw. ist es ganz am Ende, z.B. nach einem eventuellen IME.

Luckie 6. Apr 2015 19:08

AW: j-Taste abfangen?
 
Du willst keinen bestimmten Buchstaben abfangen, sondern die dritte Taste von Links in der zweiten Reihe. Oder wie?

Dejan Vu 6. Apr 2015 21:26

AW: j-Taste abfangen?
 
Zitat:

Zitat von himitsu (Beitrag 1296377)
ScanCode ist der Code der Taste, (Z = Z und Y = Y)
KeyCode der Code nach übersetzung des KeyboardLayouts (z.B. Z und Y, je Sprache)

Gut. Du vergleichst also den Scancode im OnKeyDown mit den VK_XXXX-Konstanten. Und VK bedeutet hier 'Virtual KEY-Code'.
Zitat:

Zitat von himitsu (Beitrag 1296369)
Delphi-Quellcode:
Ord('J') = 74 = $4F
VK_xxx - Virtual-Keycode

Ich bin verwirrt.

himitsu 6. Apr 2015 22:06

AW: j-Taste abfangen?
 
Aus MSDN-Library durchsuchenWM_KEYDOWN und WM_KEYUP kommt der Virtual-KeyCode als Key bei OnKeyDown und OnKeyUp an.

Und jetzt geh mal in deine Windows.pas, such nach den VK_-Codes und sieh dir den Kommentar bei Code 65 bis 90 an. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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