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?

Re: String mit SetGadgetData?
Verfasst: 09.01.2014 23:20
von ts-soft
Das braucht keinen Trick
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
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
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.