Seite 1 von 1
SetGadgetData & GetGadgetData - String speichern und lesen
Verfasst: 24.01.2015 17:35
von Tommy
Mich störts das man nur Zahlen speichern kann.
Ja ich kenne auch die Lösung mit Strukturverweis aber ich finde Macro viel einfacher und besser.
Code: Alles auswählen
;(c) Tommy
NewMap _GadgetData.s()
Macro SetGadgetData(Gadget, Value)
_GadgetData(Str(Gadget)) = Value
EndMacro
Macro GetGadgetData(Gadget)
_GadgetData(Str(Gadget))
EndMacro
Define event
OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(0, 60, 75, 75, 20, "OK")
SetGadgetData(0, "gespeicherter Text")
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Gadget
Select EventGadget()
Case 0
Debug GetGadgetData(0)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
Re: SetGadgetData & GetGadgetData - String speichern und les
Verfasst: 24.01.2015 17:57
von NicTheQuick
Aber damit werden 'SetGadgetData()' und 'GetGadgetData()' ja komplett überschrieben und man kann nach Einsatz der Makros gar keine Zahlen mehr speichern.
Das ist etwas unpraktisch, meiner Meinung nach. Weil es ja nicht immer sinnvoll ist nur Strings speichern zu können.
Ansonsten ist die Lösung mit der Map zwar einfach und elegant, aber spätestens, wenn man auch mit 'SetGadgetItemData()' Strings speichern möchte, wird es komplizierter, weil sich die Indizes der Einträge ändern können und somit ein einfaches Mapping mittels 'Str(GadgetID) + "." + Str(Index)' nicht mehr funktionieren wird.
Re: SetGadgetData & GetGadgetData - String speichern und les
Verfasst: 25.01.2015 19:55
von ts-soft
Naja, wer etwas mehr möchte (als nur Strings) der kann dann ja noch dieses nutzen:
Code: Alles auswählen
; based on code by fred: http://www.purebasic.fr/english/viewtopic.php?p=323668#p323668
DeclareModule Props
Declare.i GetProp(Gadget, Name.s) ; Get a property from the given #Gadget. Returns 0 if the property does not exist
Declare.s GetPropStr(Gadget, Name.s) ; Get a propertystring from the given #Gadget. Returns "" if the property does not exist
Declare SetProp(Gadget, Name.s, Value) ; Set a property on the given #Gadget
Declare SetPropStr(Gadget, Name.s, Value.s) ; Set a propertystring on the given #Gadget
Declare RemoveProp(Gadget, Name.s) ; Remove a property from the given #Gadget (if it exists)
Declare RemoveAllProps(Gadget) ; Remove all properties (and the map) from a given #Gadget.
EndDeclareModule
Module Props
EnableExplicit
Structure PropType
val.i
text.s
EndStructure
Structure PropMap
Map PropName.PropType()
EndStructure
Global NewMap Props.PropMap()
Procedure.i GetProp(Gadget, Name.s)
Name = UCase(Name)
If Props(Str(Gadget))
ProcedureReturn Props()\PropName(Name)\val
EndIf
EndProcedure
Procedure.s GetPropStr(Gadget, Name.s)
Name = UCase(Name)
If Props(Str(Gadget))
ProcedureReturn Props()\PropName(Name)\text
EndIf
EndProcedure
Procedure SetProp(Gadget, Name.s, Value)
Name = UCase(Name)
Props(Str(Gadget))\PropName(Name)\val = Value
EndProcedure
Procedure SetPropStr(Gadget, Name.s, Value.s)
Name = UCase(Name)
Props(Str(Gadget))\PropName(Name)\text = Value
EndProcedure
Procedure RemoveProp(Gadget, Name.s)
Name = UCase(Name)
If Props(Str(Gadget))
DeleteMapElement(Props()\PropName(), Name)
EndIf
EndProcedure
Procedure RemoveAllProps(Gadget)
DeleteMapElement(Props(), Str(Gadget))
EndProcedure
EndModule
Dies ist zwar keine erweiterte Variante von Tommy's Code, aber erfüllt denselben Zweck, wenn auch nicht so einfach.
Gruß
Thomas