BindGadgetEvent an eine Structur Binden ??

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

BindGadgetEvent an eine Structur Binden ??

Beitrag von silbersurfer »

Hi Leute,

Ich habe mir einen kleinen Container für ImageGadget zusammen gebaut.
Wo unter anderen automatisch Scrollobars mit eingefügt werden ähnlich wie ScrollArea.

das Klappt alles soweit auch gut jetzt aber zu meinen Problem ?
Ich wollte die Scrollbars mit BindGadgetEvent an eine Procedure Heften was auch Klappt
Hier mal ein kurzer Code ausschnitt der das verdeutlichen soll

Wie kann Ich jetzt aber dort den event von der Structur ermitteln ?
oder der Procedure mitteilen das der Event von einer Structur kommt, Ich hoffe Ihr versteht was Ich meine
z.b wenn Ich 3-4 Imageboxen habe, was alles Klappt er gibt alle Events aus nur wie Prüfe Ich diese
gruss Silbersurfer

Code: Alles auswählen

EnableExplicit

Structure Slider
	Slider.i
	Pos.f :Sichtbar.f : Min.f : Max.f : Size.i
EndStructure

Structure Image
	Image.i
	x.i : y.i : Width.i : Hight.i
EndStructure

Structure GadgetImage
	Gadget.i : Window.i : flags.i
	x.i : y.i : Width.i : Hight.i
	Image.Image
	SliderH.slider : SliderV.slider
EndStructure

Define TestImageGadget.GadgetImage


Procedure GadgetImageSlider()
	Debug EventGadget()
EndProcedure	



If OpenWindow(0,0,0,800,600,"Test Grafik ausgaben !",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	TestImageGadget\SliderH\Slider=ScrollBarGadget(#PB_Any,0,0,800,16,0,500,100)
	BindGadgetEvent(TestImageGadget\SliderH\Slider,@GadgetImageSlider())
EndIf 




Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
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 an eine Structur Binden ??

Beitrag von ts-soft »

Shared?
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: 8809
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 an eine Structur Binden ??

Beitrag von NicTheQuick »

Wenn ich 'Shared' oder 'Global' vermeiden möchte, nutze ich dafür sehr gerne 'SetGadgetData()'.

Code: Alles auswählen

EnableExplicit

Structure Slider
	Slider.i
	Pos.f :Sichtbar.f : Min.f : Max.f : Size.i
EndStructure

Structure Image
	Image.i
	x.i : y.i : Width.i : Hight.i
EndStructure

Structure GadgetImage
	Gadget.i : Window.i : flags.i
	x.i : y.i : Width.i : Hight.i
	Image.Image
	SliderH.slider : SliderV.slider
EndStructure

Define TestImageGadget.GadgetImage
TestImageGadget\Gadget = 123


Procedure GadgetImageSlider()
	Protected *testImageGadget.GadgetImage = GetGadgetData(EventGadget())
	If (*testImageGadget)
		Debug "TestImageGadget\Gadget = " + *testImageGadget\Gadget
		Debug EventGadget()
	EndIf
EndProcedure   



If OpenWindow(0, 0, 0, 800, 600, "Test Grafik ausgaben !", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	TestImageGadget\SliderH\Slider = ScrollBarGadget(#PB_Any, 0, 0, 800, 16, 0, 500, 100)
	SetGadgetData(TestImageGadget\SliderH\Slider, @TestImageGadget)
	BindGadgetEvent(TestImageGadget\SliderH\Slider, @GadgetImageSlider())
EndIf


Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: BindGadgetEvent an eine Structur Binden ??

Beitrag von silbersurfer »

@NicTheQuick
Wenn ich 'Shared' oder 'Global' vermeiden möchte, nutze ich dafür sehr gerne 'SetGadgetData()'.
Ja genau sowas meinte Ich.

Aber wie bekomme Ich das in einer Procedure eingebunden
Hier ist meine Procedure zum erstellen eines ImageGadgets Mit Scrollbar
Da Ja dort auch *this\Gadget = ImageGadget(#PB_Any,x,y,b,h,0) eine 'pb_any Nummer generiert

Code: Alles auswählen

Procedure NewImageGadget(Window,*this.GadgetImage,x,y,b,h,img=0,scroll=0)
	With *this
		\Gadget=ImageGadget(#PB_Any,x,y,b,h,0)
		\Window=Window
		\x=x
		\y=y
		\Width=b
		\hight=h
		If scroll
			\Width=b-20
			\Hight=h-20
			NewSlider(\SliderH,\x,\Hight+2,\Width,16,\Width,0,0)
			SetGadgetData(\SliderH\Slider,*this) ;<<<<<<<<<<<<<<< ???????????????
			BindGadgetEvent(\SliderH\Slider, @ImageGadgetSlider())
			NewSlider(\SliderV,\Width+2,\y,16,\Hight,\Hight,0,1)
			BindGadgetEvent(\SliderV\Slider, @ImageGadgetSlider())
		EndIf 
		If Img
			\Image\Image=CreateImage(#PB_Any,\Width,\Hight,32)
			\Image\Width=\Width
			\Image\Hight=\Hight
			\Image\x=0
			\Image\y=0
			SetGadgetState(\Gadget,ImageID(\Image\Image))
		EndIf 	
	EndWith	
	ProcedureReturn *this
EndProcedure	
Zuletzt geändert von silbersurfer am 26.08.2014 17:34, insgesamt 1-mal geändert.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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 an eine Structur Binden ??

Beitrag von NicTheQuick »

Ohne eine vollständigen Code, kann ich es dir nicht mit Gewissheit beantworten. Aber so sieht das schon mal ziemlich gut aus.
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: BindGadgetEvent an eine Structur Binden ??

Beitrag von silbersurfer »

@NicTheQuick
Ohne eine vollständigen Code, kann ich es dir nicht mit Gewissheit beantworten
Ja Ich werde Mal den Teil als Lauffähiges Stück hier Posten
Wenn Ich das mache wie in meinen Code schnipsel
SetGadgetData(\SliderH\Slider,*this) ;<<<<<<<<<<<<<<< ???????????????
dann bekomme Ich aber wieder eine Zahl die Ich nicht eindeutig abfragen kann, da Ich Diese durch #Pb_any zugewiesen bekommen habe
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: BindGadgetEvent an eine Structur Binden ??

Beitrag von silbersurfer »

So hier jetzt nochmal das Stück Lauffähig

Code: Alles auswählen

EnableExplicit

Structure Slider
	Slider.i
	Pos.f :Sichtbar.f : Min.f : Max.f : Size.i
EndStructure

Structure Image
	Image.i
	x.i : y.i : Width.i : Hight.i
EndStructure

Structure GadgetImage
	Gadget.i : Window.i : flags.i
	x.i : y.i : Width.i : Hight.i
	Image.Image
	SliderH.slider : SliderV.slider
EndStructure

Define DrawGadget.GadgetImage

Procedure NewSlider(*this.slider,x,y,b,h,Sichtbar.f,Maximum.f,flags)
	With *this
		\Slider=ScrollBarGadget(#PB_Any, x, y, b, h,0, Maximum,Sichtbar,flags)
		\Pos=0
		\Sichtbar=Sichtbar
		\Max=Maximum
		\Min=0
		If Flags
			\size=b+4
		Else 
			\size=h+4
		EndIf 	
	EndWith
	ProcedureReturn *this
EndProcedure

Procedure ImageGadgetSlider()
	Protected *this.GadgetImage = GetGadgetData(EventGadget())
	If (*this)
		Debug "TestImageGadget\Gadget = " + *this\Gadget
		Debug EventGadget()
	EndIf	
EndProcedure	

Procedure NewImageGadget(Window,*this.GadgetImage,x,y,b,h,img=0,scroll=0)
	Static SliderEventNr
	With *this
		\Gadget=ImageGadget(#PB_Any,x,y,b,h,0)
		\Window=Window
		\x=x
		\y=y
		\Width=b
		\hight=h
		If scroll
			\Width=b-20
			\Hight=h-20
			NewSlider(\SliderH,\x,\Hight+2,\Width,16,\Width,1200,0)
			SetGadgetData(\SliderH\Slider,*this\Gadget)
			BindGadgetEvent(\SliderH\Slider, @ImageGadgetSlider())
			NewSlider(\SliderV,\Width+2,\y,16,\Hight,\Hight,900,1)
			SetGadgetData(\SliderV\Slider,*this)
			BindGadgetEvent(\SliderV\Slider, @ImageGadgetSlider())
		EndIf 
		If Img
			\Image\Image=CreateImage(#PB_Any,\Width,\Hight,32)
			\Image\Width=\Width
			\Image\Hight=\Hight
			\Image\x=0
			\Image\y=0
			SetGadgetState(\Gadget,ImageID(\Image\Image))
		EndIf 	
	EndWith	
	ProcedureReturn *this
EndProcedure	


If OpenWindow(0,0,0,800,600,"Test BindGadgetEvent ! ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	NewImageGadget(0,DrawGadget,0,0,800,600,1,1)
EndIf 

Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: BindGadgetEvent an eine Structur Binden ??

Beitrag von HeX0R »

Beispielsweise so:

Code: Alles auswählen

EnableExplicit

Structure Slider
	Slider.i
	Pos.f :Sichtbar.f : Min.f : Max.f : Size.i
EndStructure

Structure Image
	Image.i
	x.i : y.i : Width.i : Hight.i
EndStructure

Structure GadgetImage
	Gadget.i : Window.i : flags.i
	x.i : y.i : Width.i : Hight.i
	Image.Image
	SliderH.slider : SliderV.slider
EndStructure

Define DrawGadget.GadgetImage

Procedure NewSlider(*this.slider, x, y, b, h, Sichtbar.f, Maximum.f, flags)
	With *this
		\Slider   = ScrollBarGadget(#PB_Any, x, y, b, h, 0, Maximum, Sichtbar, flags)
		\Pos      = 0
		\Sichtbar = Sichtbar
		\Max      = Maximum
		\Min      = 0
		If Flags
			\size = b + 4
		Else
			\size = h + 4
		EndIf
	EndWith
	ProcedureReturn *this
EndProcedure

Procedure ImageGadgetSlider()
	Protected *this.GadgetImage = GetGadgetData(EventGadget())
	If *this
		Select EventGadget()
			Case *this\SliderH\Slider
				Debug "Horizontal Slider"
			Case *this\SliderV\Slider
				Debug "Vertical Slider"
		EndSelect
	EndIf
EndProcedure

Procedure NewImageGadget(Window, *this.GadgetImage, x, y, b, h, img = 0, scroll = 0)
	Static SliderEventNr
	With *this
		\Gadget = ImageGadget(#PB_Any, x, y, b, h, 0)
		\Window = Window
		\x      = x
		\y      = y
		\Width  = b
		\hight  = h
		If scroll
			\Width = b - 20
			\Hight = h - 20
			NewSlider(\SliderH, \x, \Hight + 2, \Width, 16, \Width, 1200, 0)
			SetGadgetData(\SliderH\Slider, *this)
			BindGadgetEvent(\SliderH\Slider, @ImageGadgetSlider())
			NewSlider(\SliderV, \Width + 2, \y, 16, \Hight, \Hight, 900, 1)
			SetGadgetData(\SliderV\Slider, *this)
			BindGadgetEvent(\SliderV\Slider, @ImageGadgetSlider())
		EndIf
		If Img
			\Image\Image = CreateImage(#PB_Any, \Width, \Hight, 32)
			\Image\Width = \Width
			\Image\Hight = \Hight
			\Image\x     = 0
			\Image\y     = 0
			SetGadgetState(\Gadget, ImageID(\Image\Image))
		EndIf
	EndWith
	ProcedureReturn *this
EndProcedure


If OpenWindow(0, 0, 0, 800, 600, "Test BindGadgetEvent ! ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	NewImageGadget(0, DrawGadget, 0, 0, 800, 600, 1, 1)
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: BindGadgetEvent an eine Structur Binden ??

Beitrag von silbersurfer »

Ja das ist genau was Ich gesucht habe HeX0R :allright: Danke

NicTheQuick hatte mir ja schon die Richtung gezeigt und du hattest den Wink mit dem Zaunpfahl :lol:

gruss Silbersurfer
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten