Seite 1 von 1

BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 15:47
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

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 16:08
von ts-soft
Shared?

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 16:23
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 

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 17:03
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	

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 17:18
von NicTheQuick
Ohne eine vollständigen Code, kann ich es dir nicht mit Gewissheit beantworten. Aber so sieht das schon mal ziemlich gut aus.

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 17:48
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

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 18:08
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

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 20:14
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

Re: BindGadgetEvent an eine Structur Binden ??

Verfasst: 26.08.2014 21:51
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