TAB-Taste im Combobox-Gadget abfangen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

TAB-Taste im Combobox-Gadget abfangen

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

Beitrag von Thomas Kühn »

Das Ausschalten des Tabstyle funktioniert leider nicht bei einer Combobox mit #PB_ComboBox_Editable.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

Beitrag 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
Antworten