Sauvegarde des parametres de votre application

Soyez le premier à donner votre avis sur cette source.

Vue 9 017 fois - Téléchargée 1 499 fois

Description

Cette class permet de sauvegarder l'état de vos composants (TEDit, TCheckBox, TComboBox, et TListBox) et de les restaurer au prochain lancement de votre application. (A condition de le faire au bon evenements).

Source + Zip exemple !

Source / Exemple :


{ --------------------------------------------------
	Elguevel (c) 2006
	
	Système de sauvegarde et restauration 
	de l'etat d'une application
	
	Ecrit Par LEVEUGLE Damien
	Avec Delphi 7 Personnel
	
  -------------------------------------------------- }

unit ElgRegistre;

interface

{ Librairies }
uses Windows, Classes, Registry, SysUtils, StdCtrls;

{ -------------- Ma classe TRegistre hérité de TRegistry  -------------- }

type TRegistre = class( TRegistry )

    private
      { Attributs }
      Path : String;  //  OpenKey();

      { Methodes privées }
      function  Slach   ( Chemin      : String ) : String;

      procedure SetListe( Liste       : TStrings; SousChemin : String );
      function  GetListe( SousChemin  : String ) : TStrings;

      procedure SetPath( NouveauChemin : String );
      property  GetPath : String Read Path;

    public
      { Constructeur }
      constructor Create; overload;
      constructor Create( Chemin : String ); overload;
      constructor Create( Chemin : String; ForcerEcriture : Boolean ); overload;

      { Methodes publics }
      procedure EcritCle( Cle : string; CEdit   : TCustomEdit     );  overload;
      procedure EcritCle( Cle : string; CCombo  : TCustomComboBox );  overload;
      procedure EcritCle( Cle : string; CCheck  : TCheckBox       );  overload;
      procedure EcritCle( Cle : string; CListBox: TCustomListBox  );  overload;

      procedure LireCle( Cle : string; CEdit    : TCustomEdit     );  overload;
      procedure LireCle( Cle : string; CCombo   : TCustomComboBox );  overload;
      procedure LireCle( Cle : string; CCheck   : TCheckBox       );  overload;
      procedure LireCle( Cle : string; CListBox : TCustomListBox  );  overload;

end;

{ ---------------------------------------------------------------------- }

const
    DEFAULT_REG_KEY    = 'Software\Elguevel\';    { Chemin par défault }

{ .CODE }    
implementation

// ****************************************
// ************ CONSTRUCTEUR *************
// ****************************************

{ Constructeur : ouvre le registre à la clé par default }
constructor TRegistre.Create();
begin
    inherited Create;
    RootKey := HKEY_CURRENT_USER;
    Path := DEFAULT_REG_KEY;
    OpenKey(DEFAULT_REG_KEY, True);
end;

{ Constructeur : ouvre le registre à la clé specifier }
constructor TRegistre.Create( Chemin : string );
begin
    if ( Trim(Chemin) = '' ) then Chemin := DEFAULT_REG_KEY;
    inherited Create;
    RootKey := HKEY_CURRENT_USER;
    Path := Chemin;
    OpenKey(Chemin, True);
end;

{ Constructeur : ouvre le registre à la clé specifier
  et offre la possibilité de forcer ou pas l'écriture de la clé }
constructor TRegistre.Create( Chemin : string; ForcerEcriture : boolean );
begin
    if ( Trim(Chemin) = '' ) then Chemin := DEFAULT_REG_KEY;
    inherited Create;
    RootKey := HKEY_CURRENT_USER;
    Path := Chemin;
    OpenKey(Chemin, ForcerEcriture);
end;

// *******************************************
// ************ METHODES PRIVEES *************
// *******************************************

{ Change chemin du registre courant }
procedure TRegistre.SetPath( NouveauChemin : string );
begin
    Path := Slach(NouveauChemin);
    CloseKey;
    OpenKey( Slach(NouveauChemin), True );
end;

{ Ecrit une TStringList dans une clé de registre }
procedure TRegistre.SetListe( Liste : TStrings; SousChemin : string ) ;
var
  I, J      : Cardinal;
  ListeReg  : TStrings;
  Memoire   : string;
begin
    try
        { Change chemin }
        Memoire := Path;
        SetPath( Slach(Path) + SousChemin );
        { Efface anciennes valeurs }
        ListeReg := TStringList.Create;
        GetValueNames( ListeReg );
        if ( ListeReg.Count > 0 ) then for I := 0 to ( ListeReg.Count - 1 ) do
        DeleteValue( ListeReg.Strings[I] );
        ListeReg.Free;
        {Reecrit nouvelle valeur dans sous chemin }
        if ( Liste.Count > 0 ) then for J := 0 to ( Liste.Count - 1 ) do
        WriteString( IntToStr(J), Liste.Strings[J] );
    finally
      { Retablie chemin d'origine }
      SetPath( Memoire );
    end;
end;

{ Recupere une clé de registre sous forme de TStringList }
function TRegistre.GetListe( SousChemin : string ) : TStrings;
var
  ListeCle    : TStrings;
  ListeValeur : TStrings;
  I       : Cardinal;
  Memoire : string;
begin
    try
      { Change chemin }
      Memoire := Path;
      SetPath( Slach(Path) + SousChemin );
      { Crée les listes virtuelles }
      ListeCle := TStringList.Create;
      ListeValeur := TStringList.Create;
      { Recupère la liste des clés }
      GetValueNames( ListeCle );
      { Recupère la liste des valeurs }
      if ( ListeCle.Count > 0 ) then for I := 0 to ( ListeCle.Count - 1 )
      do ListeValeur.Add( ReadString( ListeCle.Strings[I] ) );
    finally
      { Retablie chemin d'origine }
      SetPath( Memoire );
      { Renvoi le resultat }
      Result := ListeValeur;
      { detruit objets }
      ListeCle.Free;
    end;
end;

{ Ajoute un '/' en fin de chemin s'il n'y est pas }
function TRegistre.Slach( Chemin : string ) : string;
begin
  if ( Trim( Copy( Chemin, Length(Chemin), 1 ) ) <> '\' ) then
    Result := Trim(Chemin) + '\'
  else
    Result := Trim(Chemin);
end;

// *******************************************
// ************ METHODES PUBLICS *************
// *******************************************

{ Sauvegarde un TEdit }
procedure TRegistre.EcritCle( Cle : string; CEdit : TCustomEdit );
begin
    WriteString( Cle, CEdit.Text );
end;

{ Sauvegarde une ComboBox }
procedure TRegistre.EcritCle( Cle : string; CCombo : TCustomComboBox );
begin
    WriteInteger( Cle, CCombo.ItemIndex );
end;

{ Sauvegarde une CheckBox }
procedure TRegistre.EcritCle( Cle : string; CCheck : TCheckBox );
begin
    WriteBool( Cle, CCheck.Checked );
end;

{ Sauvegarde contenu d'une ListBox }
procedure TRegistre.EcritCle( Cle : String; CListBox : TCustomListBox );
begin
    if ( CListBox.Count > 0 ) then SetListe( CListBox.Items, Cle );
end;

{ Recupère un TEdit }
procedure TRegistre.LireCle( Cle : string; CEdit : TCustomEdit );
begin
    try
      CEdit.Text := ReadString( Cle );
    except
      on ERegistryException do CEdit.Text := '';
    end;
end;

{ Recupère une ComboBox}
procedure TRegistre.LireCle( Cle : string; CCombo : TCustomComboBox );
begin
    try
      CCombo.ItemIndex := ReadInteger( Cle );
    except
      on ERegistryException do CCombo.ItemIndex := 0;
    end;
end;

{ Recupère une CheckBox }
procedure TRegistre.LireCle( Cle : string; CCheck : TCheckBox );
begin
    try
      CCheck.Checked := ReadBool( Cle );
    except
      on ERegistryException do CCheck.Checked := False;
    end;
end;

{ Recupère contenu d'une TlistBox }
procedure TRegistre.LireCle ( Cle : String; CListBox : TCustomListBox );
begin
    CListBox.Items := GetListe( Cle );
end;

end.

Conclusion :


Laissez vos commentaires et vos notes !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
Tu peux faire :

procedure RestaureParametres;
begin
// On crée l'objet
with TRegistre.Create do
begin
Try
LireCle( 'CheckCle', CheckBox1 );
LireCle( 'EditCle', Edit1 );
LireCle( 'ComboCle', ComboBox1 );
LireListe( REG_KEY_LISTBOX, ListBox1 );
LireListe( REG_KEY_CHECKLISTBOX, CheckListBox1 );
finally
Free;
end;
end;
end;

Idem un peut partout...

Bon Coding....

ManChesTer.
elguevel
Messages postés
735
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3 -
Tout à fait ... ( où avais je la tête ).

Merci bcp pour cette remarque pertinante :-)

Damien.
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Un petit conseil : tu devrais interdire les instances multiples et appliquer le design pattern Singleton sur ce genre de classe.
Imagine :
- que tu partages ce magnifique code, dont tu es très fier, avec des collègues
- que chacun de ces collègues ait envie ou besoin d'instancier ta classe
Que se passe-t-il alors ?
C'est le dernier qui utilisera SauvegardeParametres qui aura raison.
Donc, le premier qui utilisera RestaureParametres aura la surprise de constater que les paramètres de l'appli ne sont pas ceux qu'il a sauvegardés.
C'est le genre d'erreur difficile à détecter au premier coup d'oeil.
Voir le code source de MHI sur ce site : http://tinyurl.com/dakww

D'autre part, pour ne pas que chacun aille modifier, dans le code source, le chemin par défaut et donc modifier la constante REG_KEY, au lieu de déclarer une constante, tu devrais passer une chaine en argument à ton constructeur.

Enfin, au lieu de spécifier des objets aussi précis que TEdit, TComboBox, TListBox et TCheckListBox, tu peux indiquer des types tels que TCustomEdit, TCustomComboBox, TCustomListBox et TCustomCheckListBox. De cette façon, tu ouvres des possibilités aux composants créés à partir de ces classes.

Sinon, on trouve quelques portions de code dupliqué. Ce serait bien, pour faciliter la maintenance, de rassembler ces portions au sein de méthodes déclarées en section private par exemple.

Le meilleur pour la fin : félicitations.
elguevel
Messages postés
735
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3 -
Merci beaucoup Delphiprog.

Je ferai les modifs dès que j'aurai le temps.

Par contre pour l'histoire du "C'est le dernier qui utilisera SauvegardeParametres qui aura raison." celà dépend du contexte car c'est au depart juste pour garder le dernière etat d'une l'application dans une session donnée.

D'ailleur tu remarquera que j'ai utiliser la clé HKEY_CURRENT_USER et non HKEY_LOCAL_MACHINE, pour que les paramètres soient unique a chaque session de Windows, mais après on se fou de savoir qui va avoir droit a tel paramètre, çà sera a géré au niveau applicatif si on veut faire une appli qui gere plusieurs utilisateurs. non ? Mais je ferai des modifs pour rendre çà plus claire et plus portable ! :)

En tout cas merci pour les conseils je n'y avait pas pensé !!

++
DeltaFX
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1 -
Toujours faire gaffe à ce qu'il y ai un installeur/desinstalleur digne de ce nom avec ce genre de pratique, histoire de pas pourrir la base de registre quand on vire le prog, ou du moins que les clefs crées soient clairement listées dans un ReadMeFirst, ou une doc ou quoi que ce soit.

Sinon c'est le sook garantit.

C'est pas parce que 80% des progs commerciaux ne nettoient pas la base de registre( des cochoncetés qu'ils ont apportés) lors de la desinstallation qu'on doit faire pareil.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.