Seite 1 von 1

Combobox - Bindevent

Verfasst: 17.03.2015 12:37
von shim
Hallo!

Der aus einer editierbaren Combobox ausgewählte Wert kann nicht mit getgadgettext() ausgelesen werden.
Stattdessen erhält man die vorangegangenen Wert.

Arbeitet man nicht mit Bindevent() funktioniert alles wie es sollte.

Code: Alles auswählen

Procedure event()
  If EventGadget()=2
    If EventType()=#PB_EventType_Change
      Debug "Is this >"+GetGadgetText(2)+"< the selected item? yes|no"
    EndIf
  EndIf
EndProcedure

BindEvent(#PB_Event_Gadget, @event())

If OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(2, 10, 70, 250, 21, #PB_ComboBox_Editable)
  For a = 1 To 5
    AddGadgetItem(2, -1,"ComboBox item " + Str(a))
  Next
  Repeat     
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Combobox - Bindevent

Verfasst: 17.03.2015 13:11
von Bisonte
da fehlt ein + vor GetGadgetText(2) ....

Aber nichtsdestotrotz, das Ergebnis ist anscheinend erst beim 2. "Change" Event zu sehen.

Wobei ich jetzt mal die PB Version 5.31 meine... solltest du immer bei Bugmeldungen dazuschreiben,
sonst sucht man sich 'nen Wolf ;)

Besser noch in die Signatur !

Re: Combobox - Bindevent

Verfasst: 17.03.2015 13:15
von Kiffi
Bisonte hat geschrieben:Aber nichtsdestotrotz, das Ergebnis ist anscheinend erst beim 2. "Change" Event zu sehen.
bei mir nicht. Da kommt es sofort beim ersten Event:
Debugger hat geschrieben:Is this >1< the selected item? yes|no
Is this >12< the selected item? yes|no
Is this >123< the selected item? yes|no
Grüße ... Peter (5.31 / x86)

Re: Combobox - Bindevent

Verfasst: 17.03.2015 13:39
von NicTheQuick
Bei funktioniert es auch korrekt.

Gibt es hier auch einen Fehler bei dir?

Code: Alles auswählen

Procedure event()
	Debug "Is this >"+GetGadgetText(2)+"< the selected item? yes|no"
EndProcedure

If OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ComboBoxGadget(2, 10, 70, 250, 21, #PB_ComboBox_Editable)
	BindGadgetEvent(2, @event(), #PB_EventType_Change)
	For a = 1 To 5
		AddGadgetItem(2, -1,"ComboBox item " + Str(a))
	Next
	Repeat     
	Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Combobox - Bindevent

Verfasst: 17.03.2015 13:54
von Ligatur
hallo,
Ich glaube ihr habt das ein wenig missverstanden, tippt man Text in das Gadget ein funktioniert alles korrekt, wählt man aber ein Item aus der Liste aus so tritt das erwähnte Verhalten auf.
Dies ist aber kein Fehler von PB, das Ereignis EventChange triit schon dann auf wenn ein Element aus der Liste gewählt wurde und nicht wenn sich der Text des Gadgets ändert, und der Zeitpunkt dieses Ereignisses ist logischerweise bevor der Text ins Textfeld eingetragen wird. Das kann man aber so leicht umgehen:

Code: Alles auswählen

Procedure event()
  If EventGadget()=2
    erg.s = GetGadgetItemText(2, GetGadgetState(2))
    Debug "Is this >" + erg +"< the selected item? yes|no"
  EndIf
EndProcedure


If OpenWindow(0, 0, 0, 270, 180, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ComboBoxGadget(2, 10, 70, 250, 21, #PB_ComboBox_Editable)
  BindEvent(#PB_Event_Gadget, @event(), 0, 2, #PB_EventType_Change)
  For a = 1 To 5
    AddGadgetItem(2, -1,"ComboBox item " + Str(a))
  Next
  Repeat     
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Will man allerdings unterscheiden ob der Text im Textfeld sich geändert hat oder ein anders Element gewählt wurde so glaube ich nicht, daß das über Bindevent möglich ist, da müsste man denke ich mit einem Windowcallback arbeiten.

Re: Combobox - Bindevent

Verfasst: 17.03.2015 14:45
von NicTheQuick
Ich glaube schon, dass ich das richtig verstanden habe. Ich habe nämlich bei meinem Test nichts getippt, sondern nur die Einträge angeklickt.
Wann nun das Event kommt und wann sich tatsächlich der Text im Gadget ändert, kann sich aber von Betriebssystem zu Betriebssystem unterscheiden. Vielleicht geht es deswegen bei mir korrekt, aber bei deiner Windows-Version gibt es diesen Fehler.

Re: Combobox - Bindevent

Verfasst: 17.03.2015 17:15
von shim
Also: 5.31 Windows

Es scheint also bei manchen Systemen zu funktionieren, bei anderen nicht. Komisch ist das schon, da der gleich Code ja OHNE das editable-Flag problemlos funktioniert.

Ob nun Bug oder kein Bug, das Verhalten ist nicht durchgängig auf allen Systemen gleich. Allein das würde ich mal grob gesagt als nicht ganz in Ordnung empfinden, zumal es sich um "normale" PB-Befehle handelt.

Es gibt natürlich eine Lösung, indem man mit setgadetstate(getgadgetstate()) den ausgewählten zum aktuellen Eintrag erhebt, aber aus meiner Sicht ist das eher eine Krücke.