Combobox - Bindevent

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
shim
Beiträge: 65
Registriert: 12.09.2004 23:09

Combobox - Bindevent

Beitrag 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
Zuletzt geändert von shim am 17.03.2015 17:18, insgesamt 1-mal geändert.
Windows 8.1 Pro 64 Bit | PB 5.31 x86
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Combobox - Bindevent

Beitrag 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 !
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Combobox - Bindevent

Beitrag 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)
Hygge
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Combobox - Bindevent

Beitrag 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
Bild
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Re: Combobox - Bindevent

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Combobox - Bindevent

Beitrag 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.
Bild
shim
Beiträge: 65
Registriert: 12.09.2004 23:09

Re: Combobox - Bindevent

Beitrag 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.
Windows 8.1 Pro 64 Bit | PB 5.31 x86
Antworten