Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SAUVEGARDE DES PARAMETRES DE VOTRE APPLICATION


Information sur la source

Catégorie :Base de registre Classé sous : baseregistre, memorise, parametres, sauvegarde, application Niveau : Débutant Date de création : 18/01/2006 Date de mise à jour : 31/01/2006 15:14:40 Vu / téléchargé: 3 996 / 552

Note :
Aucune note

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

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

  • { --------------------------------------------------
  • 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.
{ --------------------------------------------------
	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 !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

31 janvier 2006 15:14:41 :
Mis à jour du code + Zip

Commentaires et avis

signaler à un administrateur
Commentaire de ManChesTer le 18/01/2006 18:48:46 administrateur CS

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.

signaler à un administrateur
Commentaire de elguevel le 19/01/2006 11:09:59

Tout à fait ... ( où avais je la tête ).

Merci bcp pour cette remarque pertinante :-)

Damien.

signaler à un administrateur
Commentaire de Delphiprog le 22/01/2006 15:23:49 administrateur CS

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.

signaler à un administrateur
Commentaire de elguevel le 25/01/2006 12:40:29

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é !!

++

signaler à un administrateur
Commentaire de DeltaFX le 06/02/2006 16:09:33

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.

signaler à un administrateur
Commentaire de elguevel le 15/02/2006 14:49:33

Tout a fait d'accord, mais çà çà fera partie d'un autre code :-)

Merci, @+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

passer des parametres a une application [ par MoveX ] comment passer des parametres a une application deja lancee a l aide de la commande executer ou d une fenetre dos?du style, "monapplication.exe /stop" sauvegarde EXCEL [ par othland ] slt tlm;j'ai une application delphi qui sauvegarde une table dans un fichier EXCEL, j'ai utilisé la méthode suivante:OleWorkBook.SaveAs['C:\dell\exc00 Application MDI et sauvegarde [ par christophedlr ] Bonjour à tous,Dans mon programme, j'utilise ls système d'application MDI.Mon problème, c'est que la fiche MDI enfant est créer dynamiquement(créer ju allumer éteindre / veille [ par Maniaxman ] bonjour, j'ai trouvé ces deux fonctions si pour allumer et éteindre l'écran : SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);//é rendre mon application installable [ par paradoxham ] slt j ai fait une application sur delphi 7 et access 2003. je veux rendre cette aplication installable( c est a dire il existe une econe d 'installati Démarrer une application dans le systray [ par John Dogget ] Bonjour à tous.J'écris une application qui doit pouvoir démarrer dans la barre des tâches.Pour ça j'utilise la JVCL, mais je ne parviens pas tout à fa Manque le composant TTimer [ par roeugene ] Dans l'application que j'ai développé en Delphi 7, j'utilisé le composant TTimer. Maintenant quand j'ouvre l'application sous Delphi 7 sur un autr S.O.S acces sous reseau [ par louiza81 ] bonjour  je suis debutante en delphi , je voudrais realiser  une petite application sous reseaux avec 1 base de données access  ....comment faire pour ouvrir une application présente dans le tray [ par rvicko ] bonjour a tousvoici mon problememon programme detecte si une instance est deja lancée ou pas. Si c'est le cas alors il se termine.ca marche bien. Mais Installation sur DD Application en HTML [ par vhalter ] Bonjour à tous.J'ai fait un Autorun.inf qui devrait permettre l'autorisation (sur Win XP SP2) le lancement du cdrom et voilà le contenu:[version]signa


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.