Seite 1 von 2
BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 17:29
von Ameisen23
Schönen Sonntag,
man(n) kann Events an Gadgets binden:
Code: Alles auswählen
Procedure ButtonHandler()
Debug "Button click event on gadget #" + EventGadget()
EndProcedure
OpenWindow(0, 100, 100, 200, 50, "Click test", #PB_Window_SystemMenu)
ButtonGadget(0, 10, 10, 180, 30, "Click me")
BindGadgetEvent(0, @ButtonHandler())
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Kann man auch irgendwie Parameter übergeben?

Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 17:40
von ts-soft
Nein, sollte auch nicht nötig sein, alle Event() Funktionen enthalten die notwendigen Werte.
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 17:59
von Ameisen23
Danke für die Antowrt aber und weiter? Was ist das für eine Argumentation? Nur weil du das nicht brauchst heisst es doch nicht das alle anderen es auch nicht brauchen! Sonst hätte ich doch den Thread nicht erstellt wenn ich es nicht brauche! Überleg doch bitte bevor du was schreibst! Ich will gerne was übergeben und die Events brauche ich nicht.
Wenn ich dich frage ob du mir Geld leihen könntest damit
ich Bier kaufen kann dann kannst du doch auch nicht sagen "nein ich brauche kein Bier"

Du warst echt eine tolle Hilfe aber trotzdem danke!
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 18:53
von Bisonte
Ameisen23 hat geschrieben:Danke für die Antowrt aber und weiter? Was ist das für eine Argumentation? Nur weil du das nicht brauchst heisst es doch nicht das alle anderen es auch nicht brauchen! Sonst hätte ich doch den Thread nicht erstellt wenn ich es nicht brauche! Überleg doch bitte bevor du was schreibst! Ich will gerne was übergeben und die Events brauche ich nicht.
Gaaaanz ruhig.
BindEvent() oder BindGadgetEvent() <- sagt eigentlich der Name schon, ist zum reagieren auf Events gedacht. Wenn ein Event anliegt, führe die übergebene Prozedur aus.
Übergeben kann man nichts, es sei denn du generierst EIGENE Events und sendest sie mit PostEvent(), wobei du dort Daten anhängen kannst.
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:02
von edel
Man kann sich ja was eigenes zusammen bauen.
Code: Alles auswählen
Prototype OnEvent(gadget, uData)
Structure EventDataInfo
GadgetID.i
GadgetNR.i
Callback.OnEvent
uData.i
EndStructure
Global NewMap GadgetEventData.EventDataInfo()
Procedure RemoveOldEventData()
ForEach GadgetEventData()
If Not IsGadget(GadgetEventData()\GadgetNR)
DeleteMapElement(GadgetEventData())
ElseIf Not GadgetID(GadgetEventData()\GadgetNR) = GadgetEventData()\GadgetID
DeleteMapElement(GadgetEventData())
EndIf
Next
EndProcedure
Procedure OnGadgetEvent()
Protected GadgetID.i
Protected GadgetNR.i
Protected Key.s
Protected Event.i
RemoveOldEventData()
GadgetNR = EventGadget()
GadgetID = GadgetID(GadgetNR)
Event = EventType()
Key = Str(GadgetID) + #PB_All
If FindMapElement(GadgetEventData(), Key)
GadgetEventData(Key)\Callback(GadgetNR, GadgetEventData(Key)\uData)
EndIf
Key = Str(GadgetID) + Event
If FindMapElement(GadgetEventData(), Key)
If GadgetEventData(Key)\Callback
GadgetEventData(Key)\Callback(GadgetNR, GadgetEventData(Key)\uData)
EndIf
EndIf
EndProcedure
Procedure MyBindGadgetEvent(Gadget, Callback, Event, uData)
Protected GadgetID.i
Protected GadgetNR.i
Protected Key.s
GadgetNR = Gadget
GadgetID = GadgetID(GadgetNR)
Key = Str(GadgetID) + Event
GadgetEventData(Key)\GadgetID = GadgetID
GadgetEventData(Key)\GadgetNR = GadgetNR
GadgetEventData(Key)\Callback = Callback
GadgetEventData(Key)\uData = uData
BindGadgetEvent(Gadget, @OnGadgetEvent(), Event)
EndProcedure
Macro BindGadgetEvent(Gadget, Callback, Event, uData = 0)
MyBindGadgetEvent(Gadget, Callback, Event, uData)
EndMacro
;------------------------------------------
;------------------------------------------
;------------------------------------------
;------------------------------------------
Procedure OnGadget(gadget, uData)
Debug "" + gadget +":"+ uData
EndProcedure
Procedure Main()
Protected Window
Protected Gad1
Protected Gad2
Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
If Window
ButtonGadget(0, 10, 10, 180, 25, "hm?")
ListViewGadget(1, 10, 35, 180, 150)
BindGadgetEvent(0, @OnGadget(), #PB_All, 555)
BindGadgetEvent(1, @OnGadget(), #PB_All, 444)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure:End Main()
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:27
von ts-soft
Ameisen23 hat geschrieben:Danke für die Antowrt aber und weiter? Was ist das für eine Argumentation? Nur weil du das nicht brauchst heisst es doch nicht das alle anderen es auch nicht brauchen! Sonst hätte ich doch den Thread nicht erstellt wenn ich es nicht brauche! Überleg doch bitte bevor du was schreibst! Ich will gerne was übergeben und die Events brauche ich nicht.
Wenn ich dich frage ob du mir Geld leihen könntest damit
ich Bier kaufen kann dann kannst du doch auch nicht sagen "nein ich brauche kein Bier"

Du warst echt eine tolle Hilfe aber trotzdem danke!
Man müßte ja bereits vor dem Ereignis Wissen, was man übergibt, also bei der definition, so wie in
dem Beispiel von edel. Ist also irgendwie nicht besonders nützlich
PS: Nein ich brauche kein Bier und Pflaum mich nicht an, wenn Du sinnlose Fragen stellst!
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:38
von edel
Sinnlos war die Frage ueberhaupt nicht. Nicht umsonst kann man bei vielen GTK Funktionen auch etwas mitgeben, und das hier schon erwaehnte PostEvent kann es ja auch.
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:47
von NicTheQuick
Man kann auch mittels 'SetGadgetData()' Daten in einem Gadget speichern. Wenn man dieses Gadget dann mit 'BindGadgetEvent()' an eine Procedure koppelt, kann man innerhalb der Procedure mit 'GetGadgetData(EventGadget())' die Daten wieder auslesen. Man braucht da also kein kompliziertes Framework außenrum.
///Edit:
Hab mal kurz edels Beispiel angepasst:
Code: Alles auswählen
Procedure OnGadget()
gadget = EventGadget()
uData = GetGadgetData(gadget)
Debug "" + gadget +":"+ uData
EndProcedure
Procedure BindGadgetEvent_(GadgetID.i, *Callback, EventType.i, userData.i)
SetGadgetData(GadgetID, userData)
BindGadgetEvent(GadgetID, *Callback, EventType)
EndProcedure
Macro BindGadgetEvent(GadgetID, Callback, EventType, userData)
BindGadgetEvent_(GadgetID, Callback, EventType, userData)
EndMacro
Procedure Main()
Protected Window
Protected Gad1
Protected Gad2
Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
If Window
ButtonGadget(0, 10, 10, 180, 25, "hm?")
ListViewGadget(1, 10, 35, 180, 150)
BindGadgetEvent(0, @OnGadget(), #PB_All, 555)
BindGadgetEvent(1, @OnGadget(), #PB_All, 444)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure:End Main()
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:51
von ts-soft
Wenn man den Wert bei der Definition kennt, brauch man ihn nicht mitgeben sondern definiert ihn
im Callback.
Wenn man mehrfach Bind und Unbind ausführt, macht man es eben, wie NicTheQuick es vorschlägt.
Re: BindGadgetEvent mit Parameter übergeben
Verfasst: 12.01.2014 19:55
von NicTheQuick
ts-soft hat geschrieben:Wenn man den Wert bei der Definition kennt, brauch man ihn nicht mitgeben sondern definiert ihn
im Callback.
Es muss ja nicht immer eine Konstante sein. Zum Beispiel nutze ich "SetGadgetData()" gerne um bestimmte Objekte, die die Rohdaten des Gadgets beinhalten, an das Gadget zu binden. Oder wenn man dynamisch Gadgets generiert, die den gleichen Typ haben, aber unterschiedliche Inhalte, dann macht es durchaus Sinn benutzerspezifische Daten zu übergeben. Allerdings macht das dann pro BindEvent tatsächlich wenig Sinn. Es müsste dann schon pro Gadget sein.
Ich habe bei meinem Post zuvor übrigens noch was hinzugefügt.