BindGadgetEvent mit Parameter übergeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Ameisen23
Beiträge: 50
Registriert: 19.10.2013 12:04

BindGadgetEvent mit Parameter übergeben

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

Re: BindGadgetEvent mit Parameter übergeben

Beitrag von ts-soft »

Nein, sollte auch nicht nötig sein, alle Event() Funktionen enthalten die notwendigen Werte.
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
Benutzeravatar
Ameisen23
Beiträge: 50
Registriert: 19.10.2013 12:04

Re: BindGadgetEvent mit Parameter übergeben

Beitrag 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!
Benutzeravatar
Bisonte
Beiträge: 2467
Registriert: 01.04.2007 20:18

Re: BindGadgetEvent mit Parameter übergeben

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: BindGadgetEvent mit Parameter übergeben

Beitrag 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()




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

Re: BindGadgetEvent mit Parameter übergeben

Beitrag 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!
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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: BindGadgetEvent mit Parameter übergeben

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

Re: BindGadgetEvent mit Parameter übergeben

Beitrag 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()
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

Re: BindGadgetEvent mit Parameter übergeben

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

Re: BindGadgetEvent mit Parameter übergeben

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