Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Abfangen von Funktionstasten (https://www.delphipraxis.net/13737-abfangen-von-funktionstasten.html)

Hansa 25. Dez 2003 19:24


Abfangen von Funktionstasten
 
Aus dem anderen Thread http://www.delphipraxis.net/internal...ct.php?t=15582 ist noch etwas offen geblieben:

Delphi-Quellcode:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var ZulZeichen : set of char;
begin
  ZulZeichen := [];
  with StringGrid1 do begin
    if Col = 1 then
      ZulZeichen := [#48..#57,#8,#13,#27,chr (VK_F9),chr (VK_F10)]
    else if Col = 4 then
      ZulZeichen := [#48..#57,#8,#13,#27,chr (VK_F3)];
    if not (key in ZulZeichen) then
      key := #0;
  end;
end;
Es sollen nur Zahlen und die Funktionstasten F3 bzw. F9 und F10 akzeptiert werden. Das mit dem VK_F9 usw. scheint aber so nicht zu gehen. Drücke ich F9 oder F10, so komme ich in der Prozedur erst gar nicht an. Wieso das ? Werden die immer am OnKeyPress vorbeigeschleust ? Das ganze wirkt sich zwar im Moment bei mir nicht aus, aber nur, weil ich auf der Suche nach der anderen Frage im OnKeyDown die Spalten auch abgefangen habe.

Es wäre besser, die Tasten selber abfragen zu können. Bei obigem Code werden übrigens auch x und y angenommen. Vielleicht ist das ein Ansatzpunkt.

[edit=sakura] SID aus URL entfernt. Mfg, sakura[/edit]

Leuselator 26. Dez 2003 11:26

Re: Abfangen von Funktionstasten
 
Liste der Anhänge anzeigen (Anzahl: 1)
das Probvlem ist das der Scancodes der Tastatur.
F9 und F10 z.B. haben die Scancodes 120 bzw. 121.
wenn Du diese mit chr() umwandelst, erhältst Du "x" bzw. "y" - daher Das oben geschilderte Verhalten.
Im Anhang findest Du (und der Rest der Gemeinde) ein PDF, welches ich mir angefertigt habe um den Spass vor Augen zu haben (ausdrucken und neben Bildschirm kleben :-)). In dieser Tabelle findest Du (fast) alles über die böse Tastatur :-)
Gruß
Edit: Ach so - obere Tabelle zeigt die Scancodes (die Werte, die im OnKeyDown/OnKeyUp ankommen),
die mittlere zeigt die mit chr() umgewandelten CHAR's und die untere die VirtualKeyCodes

Hansa 26. Dez 2003 12:10

Re: Abfangen von Funktionstasten
 
Thx, schöne Tabelle. Aber trotzdem : wie unterdrücke ich die Eingabe eines x und lasse gleichzeitig F10 zu :?: Wie du richtig sagst, geht das mit chr so nicht.

H4ndy 26. Dez 2003 12:13

Re: Abfangen von Funktionstasten
 
Wie würde es neu-deutsch heißen:
Das finde ich echt sozial von dir :D

Sowas hab ich schon immer gesucht, Danke!

Leuselator 26. Dez 2003 12:23

Re: Abfangen von Funktionstasten
 
muß erstmal Gans essen gehen - Antwort danach (wenn ich nicht 'nen Magenriss erleide :-))

Leuselator 26. Dez 2003 22:10

Re: Abfangen von Funktionstasten
 
Aua aua - das tat weh (Gans, viel)...

Also - ich mach es (mir) meist im OnKeyDown, denn dort sehe ich die Scancodes der Tasten und nicht ihre Umsetzung in Char und kann deshalb präzise differenzieren:
Delphi-Quellcode:
const
  cValidFKey    : set of Byte = [112..121];
  cValidCmdKey  : set of Byte = [8,13,33..40];
  cValidChrKey  : set of Byte = [8,13,33..40,45..46,48..57,65..90,96..105,186,192,219,222];
  cValidNumKey  : set of Byte = [8,13,33..40,45..46,48..57       ,96..105];
  cValidDateKey : set of Byte = [8,13,33..40,45..46,48..57       ,96..105,190];
implementation
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if not ((Key in cValidFKey) or (Key in cValidCmdKey) or (Key in cValidNumKey)) then begin
    sysutils.Beep;
    Key = $0;
  end;
end;
Gruß

Hansa 31. Dez 2003 11:02

Re: Abfangen von Funktionstasten
 
Das sieht plausibel aus. Leider funktioniert es nicht. Das OnKeyDown läßt alle Eingaben trotzdem durch.

Leuselator 11. Jan 2004 06:32

Re: Abfangen von Funktionstasten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm - lasse mich auch gerade ein bischen davon foppen. Also das setzen von Key:=0 im OnKeyDown verhindert nicht die Auslösung von OnKeyPress. Also muß man dort auch noch ansetzen. Habe Versuchsweise eine Komponente von TEdit abgeleitet und die Message WM_CHAR überschrieben. Dort kommt in Message.CharCode der übersetzte Wert von Key an, allerdings lösen nicht alle Tasten OnKeyPress aus.
[Edit]
Laut PSDK findet sich in den bits 16-23 von Message.KeyData der ScanCode. Dieser unterscheidet sich jedoch von den Werten von Key im OnKeyDown. Diese Werte finden sich in der untersten Tastaturschablone im Anhang.
[/Edit]

Lösung folgt sobald fertig. Bis dahin im Anhang aktualisierte und erweiterte Version der Tastaturtabelle :-)

Leuselator 11. Jan 2004 07:10

Re: Abfangen von Funktionstasten
 
Alsoooo:

Für Alle Tasten, die in der unteren Tabelle (siehe Anhang im vorangegangenen Post von mir) keine Zahlenwerte enthalten, wird kein OnKeyPress abgefeuert. Das bedeutet, das man sie im OnKeyDown mit Key := 0; wirksam abfangen kann. Abgesehen von Enter,Backspace und Escape lassen sich also alle Funktionstasten auf diese Weise unterbinden. Alles andere muß man im OnKeyPress klären. Dort kommen also wie schon bemerkt die übersetzten Scancodes als Zeichen an. Es macht also keinen Sinn dort Scancodes mit char(Scancode) als Prüfkriterium zu benutzen:
1. weil char(Scancode) <> Char(Ord(Zeichen)) (kann klappen-muß aber nicht-siehe Tabelle)
2. das erhoffte Abfangen von Funktions- & Steuertasten nicht klappt, da diese dort garnicht vorbeischauen
3. der Versuch mit char(Scancode) für VK_F3 z.B. dazu führt, dass "r" gefunden wird und man so bei nur erwünschten Ziffern z.B. einen eigentlich unerwünschten Buchstaben in die Suppe bekommt :-)

Mit diesen und Infos sollte jeder Interessent in der Lage sein, sich den 3 Posts weiter oben vorgeschlagenen Unsinn selbst zu richten :mrgreen:

Gruß

eddy 11. Jan 2004 18:16

Re: Abfangen von Funktionstasten
 
Hallo Hansa,

falls es noch nicht gelöst ist:

Code:
procedure TForm.DBGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (key = VK_F2) then ....;
  if (key = VK_F5) then ....;
end;
mfg
eddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Seite 1 von 2  1 2      

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