Gestion des préférences simplifiée

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Gestion des préférences simplifiée

Message par Droopy »

Code : Tout sélectionner

;/ PureBasic 3.94 
;/ Droopy 15/01/06


Structure Pref
  Label.s
  Key.s
  Value.s
  LabelId.l
  ValueId.l
  Type.l
EndStructure

ProcedureDLL PrefInit(IniFile.s,Section.s) ; Initialise the Pref Libraries / Return 1 if the iniFile exist
  Shared PrefIniFile.s,PrefSection.s
  PrefIniFile=IniFile
  PrefSection=Section
  
  Static Flag
  
  If Flag=0
    NewList Pref.Pref()
    Flag=1
  Else
    ClearList(Pref())
  EndIf
  
  If FileSize(PrefIniFile)>0
    ProcedureReturn 1
  EndIf

  ProcedureReturn 0
EndProcedure
  
ProcedureDLL PrefAdd(Label.s,Key.s,Type) ; Add a preference key : type = ( #PB_String_Password | #PB_String_Numeric | #PB_String_LowerCase | #PB_String_UpperCase )
  AddElement(Pref())
  Pref()\Label=Label
  Pref()\Key=Key
  Pref()\Type=Type
EndProcedure

ProcedureDLL PrefLoad() ; Load pref from file (ini)
  Shared PrefIniFile.s,PrefSection.s
  ForEach Pref()
    retour.s=Space(512)
    GetPrivateProfileString_(@PrefSection,@Pref()\Key,@vide.s,@retour,512,@PrefIniFile)
    Pref()\Value=retour
  Next
EndProcedure

ProcedureDLL PrefSave() ; Save pref to file (ini)
  Shared PrefIniFile.s,PrefSection.s
  ForEach Pref()
    WritePrivateProfileString_(@PrefSection,@Pref()\Key,@Pref()\Value,@PrefIniFile)
  Next
  
EndProcedure

ProcedureDLL.s PrefGet(Key.s) ; Retrieve a pref value
  ForEach Pref()
    If Key=Pref()\Key
      ProcedureReturn Pref()\Value
    EndIf
  Next
EndProcedure

ProcedureDLL PrefSet(Key.s,Value.s) ; Set a pref value( Type = #PB_String_Password | #PB_String_Numeric | #PB_String_LowerCase | #PB_String_UpperCase )
  ForEach Pref()
    If Key=Pref()\Key
      Pref()\Value=Value
    EndIf
  Next
EndProcedure

ProcedureDLL PrefComplete() ; Return 1 if all value are filled
  ForEach Pref()
    If LTrim(Pref()\Value)=""
      ProcedureReturn 0
    EndIf
  Next
  ProcedureReturn 1
EndProcedure

ProcedureDLL PrefShow(Title.s,ButtonText.s,LabelWidth,ValueWidth) ; Show a window to view / modify the memory preference
  
  Shared PrefIniFile.s,PrefSection.s
  
  ;/ Création de la fenêtre et calcul de la largeur
  Width=LabelWidth+ValueWidth+30
  Hwnd=OpenWindow(#PB_Any,0,0,Width,50+CountList(Pref())*30,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,Title)
  CreateGadgetList(WindowID(Hwnd))
  
  ;/ Ajoute les labels et les Champs de modification
  ForEach Pref()
    Pref()\LabelId=TextGadget(#PB_Any,10,10+ListIndex(Pref())*30,LabelWidth,20,Pref()\Label)
    Pref()\ValueId=StringGadget(#PB_Any,20+LabelWidth,10+ListIndex(Pref())*30,ValueWidth,20,Pref()\Value,Pref()\Type)
  Next
  
  ;/ Ajoute le bouton
  ButtonId=ButtonGadget(#PB_Any,10,40+(CountList(Pref())-1)*30,Width-20,30,ButtonText)
  
  ;/ Gestion de évènements
  Repeat
    event=WaitWindowEvent()
    If event=#PB_Event_Gadget And EventGadgetID()=ButtonId And EventType()=#PB_EventType_LeftClick 
      ;/ Clic sur OK --> On enregistre les infos dans la Linked List
      ForEach Pref()
        Pref()\Value=GetGadgetText(Pref()\ValueId)
      Next
      event=#PB_Event_CloseWindow ;/ Force à quitter quand clique sur OK
    EndIf
  Until event=#PB_Event_CloseWindow
  ;/ On efface tous les gadgets créés
  FreeGadget(ButtonId)
  ForEach Pref()
    FreeGadget(Pref()\LabelId)
    FreeGadget(Pref()\ValueId)
  Next
  CloseWindow(Hwnd)

EndProcedure

;/ Test
Exist=PrefInit("d:\test.ini","pref")
;/ Définit les préférences
PrefAdd("Serveur","Server",0)
PrefAdd("Port","port",#PB_String_Numeric)
PrefAdd("Nom d'utilisateur","UserName",0)
PrefAdd("Mot de passe","Password",#PB_String_Password)
If Exist
  ;/ Charge les valeurs contenues dans le fichier INI
  PrefLoad()
Else
  ;/ Définit les valeurs par défaut
  PrefSet("Server","pop.wanadoo.fr")
  PrefSet("port","110")
  PrefSet("UserName","descaves")
  PrefSet("Password","9841")
EndIf

;/ Affiche et sauve
PrefShow("Configuration","OK",80,100)
PrefSave()

;/ indique si tout les paramètres sont renseignés
If PrefComplete()
  MessageRequester("","Complet")
Else
  MessageRequester("","Pas complet")
EndIf
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Encore un autre code pour la Droopy's lib, bon boulo ;)
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

C'est bien fait mais il existait déja une librairie qui fait exactement la méme chose c'est RegINI_Lib et en plus il peut éditer le registre Windows.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Cette lib est faite pour stocker ses préférences dans un fichier INI.
Les préférences sont stockées dans une LinkedList.
On peut aussi Lire / Ecrire les préférence
Les charger et les enregistrer sur le disque.

Et surtout modifier ses préférences via une interface graphique créée automatiquement .

Elle n'a pas du tout pour but de remplacer REG_INI
Répondre