[Module] GadgetDataExModule.pbi

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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

[Module] GadgetDataExModule.pbi

Beitrag von Thorsten1867 »

Extended Gadget Data

Im Gegensatz zu SetGadgetData/GetGadgetData kann man mit GadgetDataEx mehrere Daten unter einem spezifischen Namen (Key$) mit dem Gadget speichern. Mittels des Namens können die verschiedenen Daten wieder abgerufen werden.

Code: Alles auswählen

;/ === GadgetDataExModule.pbi [PB 5.6x] ===
;/ Extended Gadget Data
;/ October 2017 by Thorsten1867

  ; Gadget::SetData()        - Saves the specified value with the specified gadget (similar to: SetGadgetData())
  ; Gadget::GetData()        - Returns the data value previously stored for this gadget  (similar to: GetGadgetData())
  ; Gadget::SetIntegerData() - Stores an integer number under the name (Key$) for this gadget
  ; Gadget::GetIntegerData() - Returns the integer number previously stored under the name (Key$) for this gadget
  ; Gadget::SetFloatData()   - Stores a floating point number under the name (Key$) for this gadget (max. 10 digits)
  ; Gadget::GetFloatData()   - Returns the floating point number previously stored under the name (Key$) for this gadget
  ; Gadget::SetStringData()  - Stores a string under the name (Key$) for this gadget
  ; Gadget::GetStringData()  - Returns the string previously stored under the name (Key$) for this gadget
  ; Gadget::FreeData()       - Deletes the stored data for this gadget

DeclareModule Gadget
  Declare SetData(GadgetID.i, Value.i)
  Declare.i GetData(GadgetID.i)
  Declare SetIntegerData(GadgetID.i, Key$, Value.i)
  Declare.i GetIntegerData(GadgetID.i, Key$)
  Declare SetFloatData(GadgetID.i, Key$, Value.f)
  Declare.f GetFloatData(GadgetID.i, Key$)
  Declare SetStringData(GadgetID.i, Key$, Value$)
  Declare.s GetStringData(GadgetID.i, Key$)
  Declare FreeData(GadgetID.i)
EndDeclareModule

Module Gadget
  
  ;{ ----- Definitions -----
  Structure ExDataStructure
    Value.i
    Map String.s()
  EndStructure
  
  Global NewMap ExDG.ExDataStructure()
  ;} -----------------------
  
  Procedure SetData(GadgetID.i, Value.i)
    Define GId$ = Str(GadgetID)
    
    If FindMapElement(ExDG(), GId$)
      ExDG()\Value = Value
    Else
      AddMapElement(ExDG(), GId$)
      ExDG()\Value = Value
    EndIf
 
  EndProcedure
  
  Procedure.i GetData(GadgetID.i)
    ProcedureReturn ExDG(Str(GadgetID))\Value
  EndProcedure  
  
  
  Procedure SetIntegerData(GadgetID.i, Key$, Value.i)
    Define GId$ = Str(GadgetID)
    
    If FindMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = Str(Value)
    Else
      AddMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = Str(Value)
    EndIf
    
  EndProcedure
  
  Procedure.i GetIntegerData(GadgetID.i, Key$)
    ProcedureReturn Val(ExDG(Str(GadgetID))\String(Key$))
  EndProcedure 
  
  
  Procedure SetFloatData(GadgetID.i, Key$, Value.f)
    Define GId$ = Str(GadgetID)
    
    If FindMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = StrF(Value)
    Else
      AddMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = StrF(Value)
    EndIf
    
  EndProcedure
  
  Procedure.f GetFloatData(GadgetID.i, Key$)
    ProcedureReturn ValF(ExDG(Str(GadgetID))\String(Key$))
  EndProcedure 
  
  
  Procedure SetStringData(GadgetID.i, Key$, Value$)
    Define GId$ = Str(GadgetID)
    
    If FindMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = Value$
    Else
      AddMapElement(ExDG(GId$)\String(), Key$)
      ExDG(GId$)\String() = Value$
    EndIf
    
  EndProcedure
  
  Procedure.s GetStringData(GadgetID.i, Key$)
    ProcedureReturn ExDG(Str(GadgetID))\String(Key$)
  EndProcedure  
  
  
  Procedure FreeData(GadgetID.i)
    DeleteMapElement(ExDG(), Str(GadgetID))
  EndProcedure
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  #Window = 0
  #ComboBox = 1
  #Button   = 2
  
  If OpenWindow(#Window, 200, 200, 120, 70, "Test Extended Gadget Data")
    ComboBoxGadget(#ComboBox, 10, 10, 110, 20)
    AddGadgetItem(#ComboBox, -1, "Apple")
    AddGadgetItem(#ComboBox, -1, "Pear")
    AddGadgetItem(#ComboBox, -1, "Banana")
    ButtonGadget(#Button, 35, 35, 60, 25, "Apply")
  EndIf
  SetGadgetState(#ComboBox, 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Button
            Debug  "Last: " + Gadget::GetStringData(#ComboBox, "Fruit")
            Debug "Current: " + GetGadgetText(#ComboBox)
            Gadget::SetData(#ComboBox, GetGadgetState(#ComboBox))
            Gadget::SetStringData(#ComboBox, "Fruit", GetGadgetText(#ComboBox))
          Case #ComboBox
            If EventType() = #PB_EventType_Change
              Debug "--> " + GetGadgetState(#ComboBox)
            EndIf
        EndSelect
    EndSelect
   
  ForEver
  
  Debug "============================="
  Debug "Last Combobox state: "+Gadget::GetData(#ComboBox)
  Debug "Last Selection: "+Gadget::GetStringData(#ComboBox, "Fruit")
  Debug "=============================" 
  
  Gadget::FreeData(#ComboBox)
  
CompilerEndIf
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: [Module] GadgetDataExModule.pbi

Beitrag von mk-soft »

Works :allright:

gibt es aber schon einmal 'MyGadgetData'. Allerdings ohne Float and Double
Kannst vielleicht bei Dir einfügen das die Daten automatisch freigegeben werden wenn das Gadget gelöscht wurde.

ALL OS: Link: http://www.purebasic.fr/english/viewtop ... gadgetdata
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten