Autor Beitrag
motion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 06.12.05 01:11 
Ich muss in einem Formular auf die TAB/shift-Tab Taste reagieren.
Leider kommen die TAB/Shift-Tab Tasten nicht im OnKeydown event an.
Auf Komponentenebene kann man diese Tasten ja schon abfangen durch

ausblenden Delphi-Quelltext
1:
Procedure CMWantspecialKey(var Msg : TWMKey); message CM_WANTSpecialKey;					


aber leider funzt das bei mir auf Formularebene nicht.
Gibt's da eine Chance, diese Tastendrücke auch im Formular zu fassen?
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Di 06.12.05 08:27 
im on OnKeyPressed event müsstest du sie kriegen 8)
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 06.12.05 09:34 
Ich hab's eben noch mal geprüft:
Im FormKeydown kommt kein TAB/shift-Tab an. Das Event feuert definitiv nicht.
azubi_20
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 593

WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
BeitragVerfasst: Di 06.12.05 11:51 
user profile iconazubi_20 hat folgendes geschrieben:
im OnKeyPressed event müsstest du sie kriegen 8)


nicht OnKeyDown :!:
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Di 06.12.05 15:03 
habe ich eben auch noch mal geprüft: Nein, auch das OnKeyPressed feuert nicht!
Selbst wenn "TForm.KeyPreview:=True" gesetzt ist, kommen die Tab/shift-Tabs dort nicht an.
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mi 07.12.05 04:14 
Hallo motion!

Da die Tab-Taste zur Navigation in den Elementen benutzt wird, kann es sein, daß der Tastendruck schon abgefangen ist und deshalb die Key-Ereignisse nicht aufgerufen werden. Verwende das OnExit-Ereignis und ermittle aus Sender (das Element, das verlassen wird) und ActiveControl (das Element, zu dem der Focus wechselt), ob die Shift mitgedrückt wurde oder nicht.

Wenn Du dann das ActiveControl auf den Sender setzt, verhinderst Du den Focuswechsel.

Gruß

Dietmar Brüggendiek
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Mi 07.12.05 09:35 
Hi Dietmar,
danke für den Tip, aber leider hilft der mir nicht weiter.
In dem betroffenen Formular habe ich eine dynamische Anzahl von Controls in einer TScollBox (können bis zu einige hundert werden), dort alle OnExits zu prüfen ist schwierig (wenn auch machbar).
Ausserdem würde diese Prüfung ja auch bei Anwender-Mouseclicks (von einem zum andren) bei der vorgeschlagenen Prüfung "True" ergeben, obwohl ich diese Funktion nur beim Tastendruck Tab/Shift-Tab brauche.
Oder mache ich da einen Gedankenfehler?
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Do 08.12.05 20:23 
Hallo motion!

Bei mir gab es bisher keinen Grund, die Tab-Taste abzufangen - deshalb war mein Vorschlag nicht geprüft. Mit der Maus hast Du natürlich recht.
Wird denn das Tab nicht im KeyDown der Scrollbox verarbeitet?

Als letzten Ausweg wird wohl nur ein Tastatur-Hook überbleiben. Das ist allerdings eine kritische Sache - Du kannst durch Fehler das System recht gründlich lahmlegen und auf die Performance drückt es auch.

Gruß

Dietmar Brüggendiek
motion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: Sa 10.12.05 00:19 
Ich muss einen Focus-Überlauf verhindern (Focus steht auf dem letzten Control. TAB soll dann NICHT mehr auf das erste Control springen. dito wenn der Anwender auf dem ersten Control steht und Shift-Tab drückt).

Damit die Keys Cursorup/down (vk_up und vk_down) sich wie Tab/shift-Tab verhalten, fange ich diese Keys ja schon ab und ersetze sie durch "SendMessage(MYForm.Handle, WM_NEXTDLGCTL, CtlDir, 0)", also durch WM_NEXTDLGCTL Messages.

Damit kriege ich dann meine eigenen vk_up/vk_down auch wunderbar gefangen und der Focus-Überlauf ist verhindert. Doof nur, das TAB/Shift-Tab selbst diese Messages nicht generieren, sondern irgendwelche andere. Ich hab's schon mit WinSight versucht aber noch nicht rausgekriegt, welche Meldungen denn nun von Tab/shift-Tab erzeugt werden.

Selbst die Meldungen cm_wantspecialkeys werden irgendwie von Tab/shift-Tab nicht ausgelöst.

Bin momentan etwas ratlos ...