AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

If Key = #107

Ein Thema von Luckner · begonnen am 16. Mai 2019 · letzter Beitrag vom 21. Mai 2019
Antwort Antwort
Seite 2 von 3     12 3      
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#11

AW: If Key = #107

  Alt 16. Mai 2019, 15:00
"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
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: If Key = #107

  Alt 16. Mai 2019, 16:54
"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.
Peter Below
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#13

AW: If Key = #107

  Alt 17. Mai 2019, 11:11
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.
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
148 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: If Key = #107

  Alt 17. Mai 2019, 11:37
Wie wär's mit
Messagebox(0, pChar(IntToStr(key)), 'Info', mb_ok) um zu sehen, ob und was ankommt?
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: If Key = #107

  Alt 17. Mai 2019, 12:14
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.
Peter Below
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#16

AW: If Key = #107

  Alt 17. Mai 2019, 13:40
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
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
481 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: If Key = #107

  Alt 19. Mai 2019, 20:57
Man sollte hier aber auch bedenken:

EIn Zeilenumbruch unter Windows ist NICHT #13 sondern die beiden Zeichen #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 #10 ). Auch macht es bei Stringverarbeitungen wie StringReplace einen Unterschied. Benutze auch hier lieber OnKeyDown bzw. OnKeyPress mit VK_RETURN . Da weißt du dann zu 100% sicher, dass es ein Enter ist.
Dennis
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#18

AW: If Key = #107

  Alt 19. Mai 2019, 22:20
Man sollte hier aber auch bedenken:

EIn Zeilenumbruch unter Windows ist NICHT #13 sondern die beiden Zeichen #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 #10 ). Auch macht es bei Stringverarbeitungen wie StringReplace einen Unterschied. Benutze auch hier lieber OnKeyDown bzw. OnKeyPress mit 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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#19

AW: If Key = #107

  Alt 20. Mai 2019, 07:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

AW: If Key = #107

  Alt 20. Mai 2019, 08:35
Keine natürlich!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 13:24 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