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? :roll:

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" :lol: 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" :lol: 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 :mrgreen:
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.