begin process at 2012 02 08 09:12:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de registre

 > SAUVEGARDE DES PARAMETRES DE VOTRE APPLICATION

SAUVEGARDE DES PARAMETRES DE VOTRE APPLICATION


 Information sur la source

Note :
Aucune note
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é :6 104 / 715

Auteur : elguevel

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip METHODE DE PROPAGATION D'UNE APPLICATION
Source avec Zip Source avec une capture GERER LES SERVICES DE WINDOWS AVEC WINSVC
Source avec Zip Source avec une capture WAKE ON LAN
Source avec Zip Source avec une capture POUR LES DEBUTANTS : NETTOYAGE RECURSIF
Source avec Zip INJECTER DLL DANS UN PROCESSUS EN COURS

 Sources de la même categorie

Source avec Zip USER ASSIST DECODER par f0xi
Source avec Zip SOURCE QUI PERMET DE RÉCUPÉRER @IP ET LE NOM DE LA CARTE RÉS... par yosthegost
Source avec Zip ACTIVATION D'UNE APPLICATION par KoolFree2005
Source avec Zip Source avec une capture CONFIGURATION DE WINDOWS® XP AVEC L'APPLICATION XP-CONF (UTI... par freetai
DÉSACTIVER CTRL ALT DEL EN AJOUTANT UNE CLÉ DANS LE REGISTRE... par Vishnouu

 Sources en rapport avec celle ci

Source avec Zip COMPOSANT TCYAPPINSTANCES - EMPÊCHER PLUSIEURS INSTANCES DE ... par MAURICIO
Source avec Zip SAUVEGARDE DE PLUSIEURS DISQUES/PARTITIONS par danfranjo
Source avec Zip Source avec une capture NETTOYEUR AUTOMATIQUE DE VOS DISQUES par diglas
Source avec Zip Source avec une capture UTILISATION DE TLANGUAGES par diglas
Source avec Zip Source avec une capture GESTION DES "CRASHS D'APPLICATION" par Bacterius

Commentaires et avis

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.

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.

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.

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

++

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.

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales