Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
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.
; 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.