Seite 1 von 2

String mit SetGadgetData?

Verfasst: 09.01.2014 23:15
von NeoChris
Moin!

Ist es auch moeglich mit SetGadgetData auch String zu speichern oder kann nur eine Zahl uebergeben werden? Ich will gerne lieber ein Text in einen Gadget speichern aber ist nicht moeglich oder? Oder kennt ihr ein Trick? :D

Re: String mit SetGadgetData?

Verfasst: 09.01.2014 23:20
von ts-soft
Das braucht keinen Trick :wink:

Code: Alles auswählen

Global text.s = "Hallo"

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
ButtonGadget(0, 10, 10, 100, 25, "Click mich")
SetGadgetData(0, @text)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_LeftClick
              Debug PeekS(GetGadgetData(0))
          EndSelect
      EndSelect
  EndSelect
ForEver

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 00:18
von NicTheQuick
Oder du nutzt da hier:

Code: Alles auswählen

Structure __GadgetData
	value.i
	s.s
EndStructure

Procedure __SetGadgetData(GadgetID.i, Value.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	*data\value = Value
	SetGadgetData(GadgetID, *data)
EndProcedure

Procedure.i __GetGadgetData(GadgetID.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	
	ProcedureReturn *data\value
EndProcedure

Procedure SetGadgetDataString(GadgetID.i, String.s)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	*data\s = String
	SetGadgetData(GadgetID, *data)
EndProcedure

Procedure.s GetGadgetDataString(GadgetID.i)
	Protected *data.__GadgetData = GetGadgetData(GadgetID)
	
	If (Not *data)
		*data = AllocateMemory(SizeOf(__GadgetData))
		InitializeStructure(*data, __GadgetData)
	EndIf
	
	ProcedureReturn *data\s
EndProcedure

Macro SetGadgetData(GadgetID, Value)
	__SetGadgetData(GadgetID, Value)
EndMacro

Macro GetGadgetData(GadgetID, Value)
	__GetGadgetData(GadgetID)
EndMacro
Damit funktioniert 'SetGadgetData()' und 'GetGadgetData()' wie gewohnt, aber man hat zusätzlich noch die Befehle 'SetGadgetDataString()' und 'GetGadgetDataString()'.

Hab es jetzt auf die schnelle aber nicht getestet.

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 03:19
von STARGÅTE
:allright:
Gefällt mir, da wäre dann gleich noch SetGadgetDataFloat oder so nützlich.
Allerdings muss man deine __GadgetData Struktur dann immer per Hand freigeben, wenn man FreeGadget macht.
Da muss man halt aufpassen.

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 12:06
von NicTheQuick
Ja, stimmt. FreeGadget hätte ich auch noch als Macro dazu schreiben müssen. Das ist dann ja auch kein großer Aufwand mehr.

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 12:51
von STARGÅTE
NicTheQuick hat geschrieben:Ja, stimmt. FreeGadget hätte ich auch noch als Macro dazu schreiben müssen. Das ist dann ja auch kein großer Aufwand mehr.
Wenn es keine Container-Gadgets gäbe ^^, ja ...
Ich will hier jetzt nicht Krümel kacken, aber wenn nun jemand Gadgets in einem Container, Panel oder ScollArea erstellt, und diese ContainerGadget oder gar das Window wieder freigibt/löscht, dann kannst du auch mit einem Macro nicht verhindern, dann "deine" Memory zurückbleiben.

Hier zeigt sich mal wieder, wie wichtig ein #PB_Event_GadgetRelease oder #PB_Event_Destroy wäre, um halt genau solche Vorgehen mit einem einfachen BindGadgetEvent zu 100% abzudecken, gerade auch für CustomGadgets

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 12:57
von NicTheQuick
Ohje, soweit hatte ich tatsächlich nicht gedacht. In dem Fall kann man das tatsächlich nicht sauber hinkriegen. Man könnte das höchstens aktuell unter Windows mittels eines Callbacks lösen. Unter Linux weiß ich nicht, wie man das machen könnte.

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 16:36
von edel
Versuch doch mal folgenden Code unter Linux auszuführen.

Code: Alles auswählen

Prototype CallOldFreeProc(Gadget)

Structure GadgetVT
  GadgetType.l
  SizeOf.l       
  GadgetCallback.i
  
  FreeGadget.i
EndStructure

Structure Gadget
  Gadget.i
  *vt.GadgetVT
EndStructure  

Structure FreeProcInfo
  OldProc.CallOldFreeProc
  NewProc.CallOldFreeProc
  GadgedNR.i
EndStructure

Structure UserData
  UserData.i[10]
  size.i
EndStructure


Import ""
  PB_Object_GetObject(obj, id)
  PB_Gadget_Objects
EndImport


Global NewMap OldFreeProc.FreeProcInfo()

;-------------------------------------------
Procedure FreeProc(Gadget)
  Protected GadgedNR
  
  If Gadget
    
    GadgedNR = OldFreeProc(Str(gadget))\GadgedNR
    
    OldFreeProc(Str(gadget))\NewProc(GadgedNR)
    
    DeleteMapElement(OldFreeProc(), Str(gadget))
    
    If OldFreeProc(Str(gadget))\OldProc
      ProcedureReturn OldFreeProc(Str(gadget))\OldProc(GadgedNR)
    EndIf
    
  EndIf    
  
EndProcedure

;-------------------------------------------
Procedure SetFreeProc(Gadget, Proc)
  Protected *g.Gadget
  
  *g = PB_Object_GetObject(PB_Gadget_Objects, Gadget)
  
  If *g
    
    OldFreeProc(Str(*g))\GadgedNR = Gadget
    OldFreeProc(Str(*g))\OldProc  = *g\vt\FreeGadget
    OldFreeProc(Str(*g))\NewProc  = Proc      
    
    *g\vt\FreeGadget = @FreeProc()
  EndIf
  
EndProcedure


;-------------------------------------------
;-------------------------------------------
;-------------------------------------------
;-------------------------------------------

;-------------------------------------------
Procedure MyFreeGadget(Gadget)
  Debug "FreeGadget : " + Gadget
EndProcedure

;-------------------------------------------
Procedure Main()
  
  Protected Window 
  Protected Gad1 
  Protected Gad2 
  
  Window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 200, 200, "")
  
  If Window
    
    Gad1 = ButtonGadget(#PB_Any, 10, 10, 180, 25, "hm?")
    Gad2 = ListViewGadget(#PB_Any, 10, 35, 180, 150)
    
    SetFreeProc(Gad1, @MyFreeGadget())
    SetFreeProc(Gad2, @MyFreeGadget())
    
    FreeGadget(Gad1)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf

EndProcedure:End Main()

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 16:42
von ts-soft
edel hat geschrieben:Versuch doch mal folgenden Code unter Linux auszuführen.
Z: 58 OldFreeProc(Str(*g))\OldProc = *g\vt\FreeGadget
[ERROR] Zeiger ist Null.

Das funktioniert wohl noch nicht so richtig :wink:

Gruß
Thomas

Re: String mit SetGadgetData?

Verfasst: 10.01.2014 18:10
von edel
IsGadget scheint wohl unter Linux etwas anderes zurückzugeben. Ich habe es oben angepasst.