Pb d'écriture d'un fichier Ini dans mémo

Résolu
Signaler
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
bonjour,


Après avoir créé un fichier Ini de paramètres à sauvegarder, je charge
les valeurs dans un mémo de la fiche principale pour pouvoir les lire.
Mais le fichier n'écrit que la dernière section: voici le code:


Creation :
Procedure CREATION_CFG_MINI(Sender : TObject; nomFicCFG : string);

  Var  Chaine   : String;

         CfgFile   : TIniFile;

begin

  CfgFile := TIniFile.Create(nomFicCFG);

  Chaine := 'Toto,Jean,Robert';
  CfgFile.WriteString('IDENT','Noms',Chaine);
  Chaine := '50 rue de la Paix,86000,Poitiers';
  CfgFile.WriteString('IDENT','Adresse',Chaine);

  Chaine := '186,85,0549496854';

  CfgFile.WriteString('PERSO','Physique',Chaine);

  CfgFile.Free;

end;
Affichage dans mémo:
CHARGE_MEMO1_CFG(Sender:TObject;nomFicCFG : string);

  Var  CfgFile  : TIniFile;

begin

  CfgFile := TIniFile.Create(nomFicCFG);

    With Fich_P do

    begin

      MEMO1.Clear;

      CfgFile.ReadSection('IDENT',Memo1.lines);

      CfgFile.ReadSectionValues('IDENT',Memo1.Lines);

      CfgFile.ReadSection('PERSO',Memo1.lines);

      CfgFile.ReadSectionValues('PERSO',Memo1.lines);

  CfgFile.Free;

end;
le mémo afficheseulement :
 
Physique =186,85,0549496854
y a t-il une bonne âme pour me répondre pourqoi, les sections de Ident sont écrasées?
[javascript:Insert_Emoticon('/imgs2/smile.gif'); Jean]

6 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Bonjour,

La réponse est simple : chacune des méthodes appelées ci-dessus commence par vider la liste de chaines reçue en argument.

La solution consiste à remplir une liste temporaire puis à ajouter son contenu dans la liste finale en utilisant la méthode AddStrings du composant TMemo :

procedure TForm1.CHARGE_MEMO1_CFG(Sender: TObject; nomFicCFG: string);
var
  CfgFile: TIniFile;
  TempList: TStringList;  //liste temporaire
begin
  CfgFile :=  TIniFile.Create(nomFicCFG);
   with  Form1 do
  begin
    MEMO1.Clear;

    TempList : = TStringList.Create;
    try
      CfgFile.ReadSection('IDENT', TempList);
      Memo1.Lines.AddStrings(TempList);

      CfgFile.ReadSectionValues('IDENT', TempList);
      Memo1.Lines.AddStrings(TempList);

      CfgFile.ReadSection('PERSO', TempList);
      Memo1.Lines.AddStrings(TempList);

      CfgFile.ReadSectionValues('PERSO', TempList);
      Memo1.Lines.AddStrings(TempList);
    finally
      TempList.Free;
    end;
  end;
  CfgFile.Free;
end;

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
Salut,

@Delphiprog :
avec ta Procedure toutes les entrées sont doublées ce qui n'est pas des plus agréables ...

Voici que j'ai fait:
 
// celle-ci est réutilisable et pas seulement avec les TMemo:
procedure CHARGE_CFG(aStrinList : TStrings; nomFicCFG: string);
var
  CfgFile  : TIniFile;
  TempList : TStringList;  //liste temporaire
  I        : Integer;
begin
  CfgFile := TIniFile.Create(nomFicCFG);
  with aStrinList do
  begin
    Clear;
    TempList : = TStringList.Create;
    try
      CfgFile.ReadSections(TempList);
      For I := 0 to TempList.Count - 1 Do
      Begin
        Add('[' + TempList[I] + ']');
        CfgFile.ReadSectionValues(TempList[I], aStrinList);
      End;
    finally
      TempList.Free;
    end;
  end;
  CfgFile.Free;
end;

// Utilisation :
procedure TForm1.Button1Click(Sender: TObject);
begin
  CHARGE_CFG(Memo1.Lines, 'Win.Ini');
end;

//Mais pour charger un fichier ini complet dans un TMemo il y a encore plus simple :
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('Win.Ini');
end;

@+
Cirec
Messages postés
178
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010

Memo1.lines



c'est le contenu complet du mémo et tu l'ecrase a chaque ecriture ...




Cordialement jfs.
<hr size="2" width="100%" />
Tout est en tout et réciproquement ...
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Merci Jfs pour ta réponse, mais je ne la comprends pas totalement.[javascript:Insert_Emoticon('/imgs2/smile_dissapprove.gif'); ]

Memo1.lines concerne toutes les lignes,OK, CfgFile.ReadSectionValues('Section',Memo1.lines); est donné par la doc delphi.
Readsection demande un nom de section à lire. Et je ne peux écrire : CfgFile.ReadSectionValues('Section',Memo1.lines[numéro ligne]);
je ne trouve pas d'exemple dans code source.

faut-il une seule instructionpour charger les différentes sections?


Merci d'avance.
[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]

Jean_Jean. 
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Merci Delphiprog, je cogitai plus lentement !
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Bonjour Cirec,


Je m'étais arrangé avec la solution de Delphiprog.[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]

Mais, ta solution est superbe, jel'a mets de coté, carj'en aurai besoin plus tard.[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]


Merci à vous deux!


Jean-jean