![]() |
Abfangen von Funktionstasten
Aus dem anderen Thread
![]()
Delphi-Quellcode:
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.
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 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] |
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 |
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.
|
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! |
Re: Abfangen von Funktionstasten
muß erstmal Gans essen gehen - Antwort danach (wenn ich nicht 'nen Magenriss erleide :-))
|
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:
Gruß
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; |
Re: Abfangen von Funktionstasten
Das sieht plausibel aus. Leider funktioniert es nicht. Das OnKeyDown läßt alle Eingaben trotzdem durch.
|
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 :-) |
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ß |
Re: Abfangen von Funktionstasten
Hallo Hansa,
falls es noch nicht gelöst ist:
Code:
mfg
procedure TForm.DBGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin if (key = VK_F2) then ....; if (key = VK_F5) then ....; end; eddy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr. |
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-2025 by Thomas Breitkreuz