Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   If Key = #107 (https://www.delphipraxis.net/200696-if-key-%3D-107-a.html)

Luckner 16. Mai 2019 14:14

If Key = #107
 
Hallo,
habe eine Abfrage gebastelt, die jedoch nur teilweise funktioniert.
Delphi-Quellcode:
if Key = #13 then //RETURN-Taste
begin
  ShowMessage('Bin hier 1');
  usw.
end
else if Key = #107 then //+-Taste auf dem Num-Block.
begin
  ShowMessage('Bin hier 2');
  usw.
end
Die Return-Taste funktioniert, die Plus-Taste jedoch nicht. Nach der Recherche dürfte jedoch #107 für die +-Taste korrekt sein. Oder doch nicht. Ich bitte um Hilfe.

Danke, Luckner

DieDolly 16. Mai 2019 14:20

AW: If Key = #107
 
Nach meinem Test ist + die 43 und - die 45. Egal ob Nummernblock oder nicht.

Delphi-Quellcode:
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
 ShowMessage(Ord(Key).ToString);
end;

jsp 16. Mai 2019 14:21

AW: If Key = #107
 
Versuch mal

Delphi-Quellcode:
..........
else if Key = VK_Add then //+-Taste auf dem Num-Block.
begin
  ShowMessage('Bin hier 2');
  usw.
end
Gruss, Jörn

DieDolly 16. Mai 2019 14:22

AW: If Key = #107
 
VK_ADD ist auch die 107. + ist aber laut Windows 10 Bildschirmtastatur die 43.

Uwe Raabe 16. Mai 2019 14:23

AW: If Key = #107
 
Im OnKeyPress kommt lediglich das +-Zeichen an. Willst du den Tastencode, dann musst du das im OnKeyDown machen.

Neutral General 16. Mai 2019 14:26

AW: If Key = #107
 
Der Unterschied ist, das eine ist der Virtuelle Tastencode, das andere der ASCII-Wert des Zeichens.
Im KeyPress bekommt man die ASCII-Werte in KeyDown/KeyUp bekommt man die virtuellen Tastencodes.

Im KeyPress kann man dementsprechend einfach abfragen:
Delphi-Quellcode:
if Key = '+' then
  ...
Im KeyDown/KeyUp:
Delphi-Quellcode:
if Key = VK_ADD then
  ...

DieDolly 16. Mai 2019 14:29

AW: If Key = #107
 
Zitat:

Zitat von Neutral General (Beitrag 1432352)
Der Unterschied ist, das eine ist der Virtuelle Tastencode, das andere der ASCII-Wert des Zeichens.
Im KeyPress bekommt man die ASCII-Werte in KeyDown/KeyUp bekommt man die virtuellen Tastencodes.

Im KeyPress kann man dementsprechend einfach abfragen:
Delphi-Quellcode:
if Key = '+' then
  ...
Im KeyDown/KeyUp:
Delphi-Quellcode:
if Key = VK_ADD then
  ...

Ich kann ihm oder ihr da nur den Tipp geben auf 43 und 45 zu prüfen. Es gibt nichts schlimmeres als ein Programm, was auf einen Nummernblock angewiesen ist.
Es gibt tatsächlich Leute, die haben und wollen keinen Nummernblock :thumb:

Neutral General 16. Mai 2019 14:33

AW: If Key = #107
 
Zitat:

Zitat von DieDolly (Beitrag 1432353)
Ich kann ihm oder ihr da nur den Tipp geben auf 43 und 45 zu prüfen. Es gibt nichts schlimmeres als ein Programm, was auf einen Nummernblock angewiesen ist.

Ist jetzt nicht wirklich so als könnte er sich das aussuchen.
Wenn er im KeyDown auf 43/45 abprüft funktioniert es weder mit noch ohne Nummernblock.
Umgekehrt bringt VK_ADD im KeyPress nichts.

Zitat:

Zitat von DieDolly (Beitrag 1432353)
Es gibt tatsächlich Leute, die haben und wollen keinen Nummernblock :thumb:

Natürliche Selektion :duck:
Ohne Numblock geht gar nicht :?

Luckner 16. Mai 2019 14:47

AW: If Key = #107
 
Danke für die Hinweise. 43/45 in KeyPress funktionieren nicht. Ebenfalls '+' nicht. Warum funktioniert #13 in KeyPress so gut?

Luckner

Neutral General 16. Mai 2019 14:48

AW: If Key = #107
 
Zitat:

Zitat von Luckner (Beitrag 1432357)
Danke für die Hinweise. 43/45 in KeyPress funktionieren nicht. Ebenfalls '+' nicht. Warum funktioniert #13 in KeyPress so gut?

Luckner

Habs probiert, funktioniert.
Ggf. "KeyPreview" der Form auf true setzen?

Luckner 16. Mai 2019 15:00

AW: If Key = #107
 
"KeyPreview" der Form auf true gesetzt. #43 und '+' in KeyPress ausprobiert. Geht nicht.
Schreibe das ganze für "KeyDown" um. Möglicherweise funktioniert es dort.

Luckner

peterbelow 16. Mai 2019 16:54

AW: If Key = #107
 
Zitat:

Zitat von Luckner (Beitrag 1432360)
"KeyPreview" der Form auf true gesetzt. #43 und '+' in KeyPress ausprobiert. Geht nicht.
Schreibe das ganze für "KeyDown" um. Möglicherweise funktioniert es dort.

Luckner

Welches Control hat den Fokus? Wenn das keine Zeichen haben will kriegt es auch keine, auch wenn der Anwender sich die Finger wund tippt.:wink:

Luckner 17. Mai 2019 11:11

AW: If Key = #107
 
Zitat:

Welches Control hat den Fokus? Wenn das keine Zeichen haben will kriegt es auch keine, auch wenn der Anwender sich die Finger wund tippt.
Auf #13 reagiert das Programm sofort.

TomyN 17. Mai 2019 11:37

AW: If Key = #107
 
Wie wär's mit
Delphi-Quellcode:
Messagebox(0, pChar(IntToStr(key)), 'Info', mb_ok)
um zu sehen, ob und was ankommt?

peterbelow 17. Mai 2019 12:14

AW: If Key = #107
 
Zitat:

Zitat von Luckner (Beitrag 1432397)
Zitat:

Welches Control hat den Fokus? Wenn das keine Zeichen haben will kriegt es auch keine, auch wenn der Anwender sich die Finger wund tippt.
Auf #13 reagiert das Programm sofort.

Ein Control kann entscheiden, welche Tastendrücke es haben will, sieh Dir mal die Microsoft-Dokumentation zu WM_GETDLGCODE an. Die VCL benutzt diese Message, um das Control mit Fokus höflich zu fragen, ob es die anstehenden Tastatur-Message überhaupt haben will oder nicht. Dabei gibt es aber eine Sonderbehandlung für ein paar Tasten wie Tab oder Enter/Return. Deshalb kann #13 funktionieren, andere Zeichen aber nicht.

Falls Du einigermaßen Englisch lesen kannst und 'ne Stunde Zeit hast kannst Du dir ja mal diesen Artikel ansehen: A Key's Odyssey. Der erklärt die Verarbeitung von Tastaturaktionen in der VCL.

Delphi.Narium 17. Mai 2019 13:40

AW: If Key = #107
 
Zitat:

Zitat von Luckner (Beitrag 1432347)
Hallo,
habe eine Abfrage gebastelt, die jedoch nur teilweise funktioniert.
Delphi-Quellcode:
if Key = #13 then //RETURN-Taste
begin
  ShowMessage('Bin hier 1');
  usw.
end
else if Key = #107 then //+-Taste auf dem Num-Block.
begin
  ShowMessage('Bin hier 2');
  usw.
end
Die Return-Taste funktioniert, die Plus-Taste jedoch nicht. Nach der Recherche dürfte jedoch #107 für die +-Taste korrekt sein. Oder doch nicht. Ich bitte um Hilfe.

Danke, Luckner

+ auf dem Num-Block hat den Wert 107 (Word) und nicht #107 (Char), #107 ist das kleine k.

Wenn man eine nummerischen Wert für eine Taste ermittelt hat, aber in einer Abfrage ein Zeichen benötigt, so kann man nicht einfach vor den nummerischen Wert ein # setzen, auch dann nicht, wenn das vom Compiler dann so "geschluckt" wird.

Der nummerische Wert der Taste k ist übrigens 75, dies ist aber nicht der Ascii-Wert des auf der Taste befindlichen Zeichens k, zumal diese Taste ja durchaus das K liefern könnte.

Wenn Du auf die Taste + vom Num-Block abfragen willst, so musst Du dazu entweder das Ereignis On...KeyUp oder das Ereignis On...KeyDown verwenden. In diesen beiden Ereignisse muss Du jedoch die Entertaste mit 13 abfragen und nicht mit #13, wie im Ereignis On...KeyPress.

Der abzufragende Wert in den Ereignissen ist bei einigen wenigen Tasten (fast) gleich, so dass man #13 äquivalent zu 13 verwenden kann, bei der Tabulatortaste mit #9 bzw. 9 geht das auch, aber beim überwiegenden Teil der Tasten passt das schlicht und einfach nicht.

Bau Dir mal ein Programm, das im OnKeyUp diesen Quelltext enthält:
Delphi-Quellcode:
procedure Tform1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
         s : String;
         s2 : String;
begin
  s := '';
  if ssShift in Shift then s := s + 'Umsch + ';
  if ssAlt in Shift then s := s + 'Alt + ';
  if ssCtrl in Shift then s := s + 'Strg + ';
  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 + ';
  s2 := IntToStr(TextToShortCut(AnsiReplaceText(s + Chr(Key),' ','')));
  s := Trim(s);
  s := ReverseString(s);
  if Copy(s,1,1) = '+' then s := Trim(Copy(s,2,Length(s)));
  s := ReverseString(s);
  if s = '' then s := '<leer>';
  Caption := 'Key = ' + IntToStr(Key) + '  -   Shift = ' + s + '  -   ShortCut für Menüs = ' + s2;
end;
Es zeigt Dir in der Caption des Formulares dann die gedrückte Tastenkombination mit den in OnKeyUp abzufragenden Werten an. Das Formular kannst Du auf die Größe der Caption reduzieren.

Der Quelltext ist werde noch ästhetischen oder sonstwie besonderen Kriterien geschrieben, Effektivität ist auch keine Anforderung gewesen, sondern einfach nur: tut was er soll ;-)

Dennis07 19. Mai 2019 20:57

AW: If Key = #107
 
Man sollte hier aber auch bedenken:

EIn Zeilenumbruch unter Windows ist NICHT
Delphi-Quellcode:
#13
sondern die beiden Zeichen
Delphi-Quellcode:
#13#10
, die nacheinander gedrückt werden!


Das mag ja in 99% der Fälle keinen Unterschied machen, aber in dem einen Prozent kann es das durchaus. Besonders bei Text, der von Linux-oder MacOS-Plattformen kommt (dort ist der Zeilenumbruch nämlich nur
Delphi-Quellcode:
#10
). Auch macht es bei Stringverarbeitungen wie
Delphi-Quellcode:
StringReplace
einen Unterschied. Benutze auch hier lieber
Delphi-Quellcode:
OnKeyDown
bzw.
Delphi-Quellcode:
OnKeyPress
mit
Delphi-Quellcode:
VK_RETURN
. Da weißt du dann zu 100% sicher, dass es ein Enter ist.

Andreas13 19. Mai 2019 22:20

AW: If Key = #107
 
Zitat:

Zitat von Dennis07 (Beitrag 1432562)
Man sollte hier aber auch bedenken:

EIn Zeilenumbruch unter Windows ist NICHT
Delphi-Quellcode:
#13
sondern die beiden Zeichen
Delphi-Quellcode:
#13#10
, die nacheinander gedrückt werden!


Das mag ja in 99% der Fälle keinen Unterschied machen, aber in dem einen Prozent kann es das durchaus. Besonders bei Text, der von Linux-oder MacOS-Plattformen kommt (dort ist der Zeilenumbruch nämlich nur
Delphi-Quellcode:
#10
). Auch macht es bei Stringverarbeitungen wie
Delphi-Quellcode:
StringReplace
einen Unterschied. Benutze auch hier lieber
Delphi-Quellcode:
OnKeyDown
bzw.
Delphi-Quellcode:
OnKeyPress
mit
Delphi-Quellcode:
VK_RETURN
. Da weißt du dann zu 100% sicher, dass es ein Enter ist.

Besser, Du verwendest gleich die vorderfinierte Konstante System.sLineBreak

Delphi-Quellcode:
System.pas
...
const
   sLineBreak = {$IFDEF POSIX} _AnsiChr(#10) {$ENDIF}
       {$IFDEF MSWINDOWS} _AnsiStr(#13#10) {$ENDIF};
...
Gruß
Andreas

Delphi.Narium 20. Mai 2019 07:51

AW: If Key = #107
 
Die Unterscheidung der Zeikenübrüche mit #13 und #13#10 ist ja durchaus richtig und wichtig, nur welche Auswirkungen hat das auf die Abfrage von Tastatureingaben?

p80286 20. Mai 2019 08:35

AW: If Key = #107
 
Keine natürlich!

Gruß
K-H

Delphi.Narium 20. Mai 2019 09:11

AW: If Key = #107
 
eben, warum dann der Hinweis?

Luckner 20. Mai 2019 12:52

AW: If Key = #107
 
Hallo Delphi.Narium und Andere,

habe die Abfrage unter "On...KeyDown" eingebaut und es funktioniert. Danke für den Hinweis auf #.

Gruß, Luckner

Dennis07 21. Mai 2019 15:30

AW: If Key = #107
 
Zitat:

Zitat von Andreas13 (Beitrag 1432563)
Besser, Du verwendest gleich die vorderfinierte Konstante System.sLineBreak

Richtig, aber nur bei der Stringverarbeitung und nicht bei KeyChars. ;)

p80286 21. Mai 2019 18:26

AW: If Key = #107
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1432582)
eben, warum dann der Hinweis?

Weil es noch genügend Mitleser gibt, die ein Zeilenende synonym zu der "Warzentaste" (ich liebe diese Siemensbezeichnung!) verwenden.
Wenn ein Tastendruck ein Zeichen produziert, ist immer der Tastaturtreiber daran schuld.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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