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