Seite 1 von 2
TAB-Taste im Combobox-Gadget abfangen
Verfasst: 21.10.2006 12:03
von Thomas Kühn
Hallo,
ich suche nach einer Moeglichkeit, die TAB-Taste in einem Combobox-Gadget (mit #PB_ComboBox_Editable) abzufangen, um darauf reagieren zu koennen.
Es soll also kein Weiterspringen zum naechsten Gadget durchgefuehrt werden, sondern ich moechte zu einem beliebigen Gadget springen.
Kann mir da jemand einen Tipp geben?
Gruss
Thomas
Verfasst: 21.10.2006 14:58
von AND51
Du hast ins falsche Unterforum gepostet, "Allgemein" wäre richtig gewesen.
Wenn du das mit einem Callback erledigen willst, ok. Dazu habe ich aber keine Lösung. Ich würds auf die Schnelle so machen:
Dieser Windows-API Befehl gibt einen Wert ungleich null zurück, wenn TAB gedrückt wurde. Dann kannst du damit anstellen, was du willst.

Verfasst: 21.10.2006 16:09
von Kaeru Gaman
wenn du es damit löst, musst du allerdings bedenken,
dass der fokus zum zeitpunkt deiner reaktion bereits gewechselt HAT,
d.h. das aktuelle gadget ist nicht das betreffende Combobox,
wenn TAB im Combobox gedrückt wurde.
wenn du das per Callback löst, sollte das problem nicht bestehen.
auch ich hab keinen callback-code zur hand... kollege kommt gleich..

Verfasst: 21.10.2006 18:05
von Thomas Kühn
Hi,
mit meinem Callback bekomme ich nur #CBN_KillFocus hin.
Hier mein Beispiel:
Code: Alles auswählen
Procedure Callback(hwnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_COMMAND
;1. Combobox: Ich bekomme ein Killfocus mit der TAB-Taste ODER beim Wechseln mit der Mouse z. B. ins Gadget 2
If (wParam>>16) = #CBN_KILLFOCUS And lParam = GadgetID(1)
SetActiveGadget(0) ;1. Button
EndIf
EndSelect
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
;1. Button
ButtonGadget(0, 10, 10, 100, 25, "Button 1")
;1. Combobox
ComboBoxGadget(1, 10, 70, 250, 100, #PB_ComboBox_Editable)
AddGadgetItem(1, -1, "ComboBox editable...") : AddGadgetItem(1, -1, "ComboBox editable...")
;2. Combobox
ComboBoxGadget(2, 10, 100, 250, 100)
For a = 1 To 5 : AddGadgetItem(2, -1,"ComboBox item " + Str(a)) : Next a
SetWindowCallback(@Callback())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Nun entsteht ein KillFocus ja nicht nur mit der Tab-Taste (z. B. auch beim Wechseln in ein anderes Fenster) und das ist mein Problem.
Gibt es da noch etwas zum Ausprobieren?
Verfasst: 21.10.2006 18:27
von ts-soft
Vielleicht den Tabstyle entfernen, mit diesem Code von GPI:
Code: Alles auswählen
Procedure GadgetNoTabJump(GadgetID); - Deactivate the possible to jump to the gadget with tab
;Needed, because i don't want a jump with tab
Style=GetWindowLong_(GadgetID,#GWL_STYLE)
SetWindowLong_(GadgetID,#GWL_STYLE,Style&((-1)-#WS_TABSTOP))
ProcedureReturn GadgetID
EndProcedure
und im Callback bei
#CBN_EDITCHANGE auf Chr(9) prüfen.
Verfasst: 21.10.2006 20:19
von Thomas Kühn
Das Ausschalten des Tabstyle funktioniert leider nicht bei einer Combobox mit #PB_ComboBox_Editable.
Verfasst: 21.10.2006 20:26
von ts-soft
Thomas Kühn hat geschrieben:Das Ausschalten des Tabstyle funktioniert leider nicht bei einer Combobox mit #PB_ComboBox_Editable.
Code: Alles auswählen
Procedure GadgetNoTabJump(GadgetID); - Deactivate the possible to jump to the gadget with tab
;Needed, because i don't want a jump with tab
Style=GetWindowLong_(GadgetID,#GWL_STYLE)
SetWindowLong_(GadgetID,#GWL_STYLE,Style&((-1)-#WS_TABSTOP))
ProcedureReturn GadgetID
EndProcedure
If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
ComboBoxGadget(0, 10, 10, 250, 100, #PB_ComboBox_Editable)
AddGadgetItem(0, -1, "ComboBox editable...")
GadgetNoTabJump(GadgetID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
bei mir gehts
Verfasst: 21.10.2006 21:03
von Thomas Kühn
Probier mal ein 2. Gadget hinzuzufuegen, dann solltest Du sehen, dass es nicht funktioniert
Parallel habe ich Deinen Vorschlag, es mit dem Aendern des Tabstyles zu probieren auch bei einer Combobox ohne #PB_ComboBox_Editable getestet. Ich bekomme im Callback mit #CBN_EDITCHANGE kein Ereignis zum Weiterverarbeiten.
Verfasst: 21.10.2006 21:28
von ts-soft
Geht wirklich nicht
Besorge Dir EasyVent.pbi:
http://www.purebasic.fr/english/viewtopic.php?t=21136
Code: Alles auswählen
XIncludeFile "EasyVENT.pbi"
Procedure TabEvent(*sender.PB_Sender)
If *sender\wParam = #VK_TAB
Debug "Hallo"
ProcedureReturn 0
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
RemoveKeyboardShortcut(0, #PB_Shortcut_All)
ComboBoxGadget(0, 10, 10, 250, 100, #PB_ComboBox_Editable)
AddGadgetItem(0, -1, "ComboBox editable...")
SetEventHandler(GadgetID(0), #OnKeyUp, @TabEvent())
ComboBoxGadget(1, 10, 40, 250, 100)
For a = 1 To 5 : AddGadgetItem(1, -1,"ComboBox item " + Str(a)) : Next a
SetGadgetState(1, 2) ; wir setzen (beginnend bei 0) den dritten Eintrag als aktiven
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Gruß
Thomas
Verfasst: 22.10.2006 11:07
von Thomas Kühn
Hi Thomas,
danke fuer die Info. Werde ich in meinem Code mal ausprobieren!
Da alle Tab-Shortcuts ausgeschalten werden, muss ich dann fuer jedes Gadget das Tab-Handling einbauen, oder?
Gruss
Thomas