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:

Code: Alles auswählen

GetAsyncKeyState_(#VK_TAB)
Dieser Windows-API Befehl gibt einen Wert ungleich null zurück, wenn TAB gedrückt wurde. Dann kannst du damit anstellen, was du willst. :wink:

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