SetGadgetData & GetGadgetData - String speichern und lesen

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.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

SetGadgetData & GetGadgetData - String speichern und lesen

Beitrag 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
Zuletzt geändert von Tommy am 27.01.2015 12:24, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: SetGadgetData & GetGadgetData - String speichern und les

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetGadgetData & GetGadgetData - String speichern und les

Beitrag 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
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.
Bild
Antworten