Pointer in einen Structure Inhalt übergeben ? (Erledig)

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

Pointer in einen Structure Inhalt übergeben ? (Erledig)

Beitrag von silbersurfer »

Hallo Leute,

Habe mal wieder ein kleines Problem !
und zwar möchte Ich ein Modul basteln, soweit so gut.

hier mal ein Codeschnipsel wie Ich das gerne umsetzen wollte

Code: Alles auswählen

DeclareModule Image_gadget
	; Slider Proceduren
	Declare NewSlider		(x, y, b, h, Sichtbar.f, Maximum.f, flags)
	Declare SetSliderPos		(*Id,pos.f)
	;ImageGadget Proceduren
	Declare NewImageGadget(Window, x, y, b, h, img = 0, scroll = 0,border=0)
EndDeclareModule
Module Image_gadget

	Structure Slider
		Slider.l
		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 : factor.f
		x.i : y.i : Width.i : Hight.i : QuellImage.i
		Image.Image
		SliderH.slider : SliderV.slider
	EndStructure


	

	
	Procedure 	SetSliderPos	(*this.slider,pos.f)
		*this\Pos=pos
		SetGadgetState(*this\Slider,*this\Pos)
	EndProcedure
	
	Procedure 	NewSlider		(x, y, b, h, Sichtbar.f, Maximum.f, flags)
		Protected *this.slider	=	AllocateMemory(SizeOf(slider))
		If (Not *this)
			ProcedureReturn #False
		EndIf 		
	   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 NewImageGadget(Window, x, y, b, h, img = 0, scroll = 0,border=0)
		
		Protected *this.GadgetImage	=	AllocateMemory(SizeOf(GadgetImage))
		If (Not *this)
			ProcedureReturn #False
		EndIf 	
		InitializeStructure(*this,image)
		InitializeStructure(*this,slider)
			
		With *this
			\Gadget	= ImageGadget(#PB_Any, x, y, b, h,border)
			\Window	= Window
			\x			= x
			\y				= y
			\Width		= b
			\hight		= h
			\factor		= 1.0
			If scroll
				\Width	= b - 20
				\Hight	= h - 20
				\SliderH\Slider=NewSlider(\x, \y+\Hight + 2, \Width, 16, \Width,0, 0)
				SetGadgetData(\SliderH\Slider, *this)
				
				\SliderV\Slider=NewSlider(\x+\Width + 2, \y, 16, \Hight, \Hight,0, 1)
				SetGadgetData(\SliderV\Slider, *this)
				
			Else 
				\SliderH\Slider=-1
				\SliderV\Slider=-1
			EndIf
	
			ProcedureReturn *this
		EndWith	
	EndProcedure
	
EndModule

UseModule Image_gadget

If OpenWindow(0, 0, 0, 800, 600, "Test BindGadgetEvent ! ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ImageGadget01= NewImageGadget(Window, 50,50, 300,300,1,1)
	Slider01=NewSlider(0,0, 800, 16, 100, 200,0)
	SetSliderPos(Slider01,20)
EndIf 

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Das Problem wo Ich in Moment nicht dahinter komme, Ist einen Pointer an einer Structure Variable zu übergeben ?
Wenn Ich z.B es so mache dann hat Slider01 den Pointer. Das klappt auch

Code: Alles auswählen

If OpenWindow(0, 0, 0, 800, 600, "Test BindGadgetEvent ! ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	Slider01=NewSlider(0,0, 800, 16, 100, 200,0)
	SetSliderPos(Slider01,20)
EndIf 
Nun wollte Ich in einer Procedure diesen Pointer einer Structure Varable übergeben
Nur dann Kommt wenn ich darauf zugreifen will der fehler Gadget nicht inialisiert ?

Code: Alles auswählen

\SliderH\Slider=NewSlider(\x, \y+\Hight + 2, \Width, 16, \Width,0, 0)
SetGadgetData(\SliderH\Slider, *this)
Hab den Fehler man man aber naja nur so lernt man

Code: Alles auswählen

*dummy=NewSlider(\x+\Width + 2, \y, 16, \Hight, \Hight,0, 1)
\SliderV\Slider=*dummy\Slider
SetGadgetData(\SliderV\Slider, *this)
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Pointer in einen Structure Inhalt übergeben ? (Erledig)

Beitrag von Demivec »

Code: Alles auswählen

*dummy=NewSlider(\x+\Width + 2, \y, 16, \Hight, \Hight,0, 1)
\SliderV\Slider=*dummy\Slider
FreeStructure(*dummy)
SetGadgetData(\SliderV\Slider, *this)
Ein noch Fremden-Methode:

Code: Alles auswählen

DeclareModule Image_gadget
   ; Slider Proceduren
   Declare NewSlider      (*slider, x, y, b, h, Sichtbar.f, Maximum.f, flags)
   Declare SetSliderPos      (*Id,pos.f)
   ;ImageGadget Proceduren
   Declare NewImageGadget(Window, x, y, b, h, img = 0, scroll = 0,border=0)
EndDeclareModule
Module Image_gadget

   Structure Slider
      Slider.l
      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 : factor.f
      x.i : y.i : Width.i : Hight.i : QuellImage.i
      Image.Image
      SliderH.slider : SliderV.slider
   EndStructure


   
   Procedure    SetSliderPos   (*this.slider,pos.f)
      *this\Pos=pos
      SetGadgetState(*this\Slider,*this\Pos)
   EndProcedure
   
   Procedure    NewSlider  (*this.slider, x, y, b, h, Sichtbar.f, Maximum.f, flags)
      If *this = 0
         *this = AllocateStructure(slider)
      Else
         ClearStructure(*this, slider)
      EndIf
     
      If (Not *this)
         ProcedureReturn #False
      EndIf       
      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 NewImageGadget(Window, x, y, b, h, img = 0, scroll = 0,border=0)
      
      Protected *this.GadgetImage   =   AllocateStructure(GadgetImage)
      If (Not *this)
         ProcedureReturn #False
      EndIf    
         
      With *this
         \Gadget   = ImageGadget(#PB_Any, x, y, b, h,border)
         \Window   = Window
         \x         = x
         \y            = y
         \Width      = b
         \hight      = h
         \factor      = 1.0
         If scroll
            \Width   = b - 20
            \Hight   = h - 20
            
            NewSlider(\SliderH, \x, \y+\Hight + 2, \Width, 16, \Width,0, 0)
            SetGadgetData(\SliderH\Slider, *this)
            
            ;oder
            Protected *newSlider
            *newSlider = NewSlider(0, \x+\Width + 2, \y, 16, \Hight, \Hight,0, 1)
            CopyStructure(*newSlider, @\SliderV, slider)
            FreeStructure(*newSlider)
            SetGadgetData(\SliderV\Slider, *this)
            
         Else 
            \SliderH\Slider=-1
            \SliderV\Slider=-1
         EndIf
   
         ProcedureReturn *this
      EndWith   
   EndProcedure
   
EndModule

UseModule Image_gadget

If OpenWindow(0, 0, 0, 800, 600, "Test BindGadgetEvent ! ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ImageGadget01= NewImageGadget(Window, 50,50, 300,300,1,1)
   Slider01=NewSlider(0, 0,0, 800, 16, 100, 200,0)
   SetSliderPos(Slider01,20)
EndIf 

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Bild
Antworten