IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

enregistrer contenu du listbox dans un fichier ini


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 0
    Points
    0
    Par défaut enregistrer contenu du listbox dans un fichier ini
    Bonjour

    Je travaille sur une application ridigée en delphi contenant 4 listboxes aux quels on insère des dates de travail et de congés

    mon souci est comment enregistrer le contenu des listboxes dans un fichier INI en appuyant sur le boutton save afin de le charger chaque fois en cas de modification

    j'ai intégré dans le projet le composant TsaveDialog

    une capture d'écran est fournie pour mieux exprimer mon problème

    Nom : 2019-02-01_15-42-45.png
Affichages : 456
Taille : 36,9 Ko

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    As-tu étudié la classe TIniFile et sa méthode WriteString ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    voila le code utilisé monsieur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    procedure TForm1.Button5Click(Sender: TObject);
    var
     
       key:string;
      ini:TInifile; // variable nécessaire
     
     
      var
      FS: TFileStream;
     // variable nécessaire
       // variables pour exemples
      procedure WriteItems(Items: TStrings);
      var
        MS: TMemoryStream;
        Size: Int64;
      begin
        MS := TMemoryStream.Create;
        try
          Items.SaveToStream(MS);
          Size := MS.Size;
          FS.WriteBuffer(Size, SizeOf(Size));
          FS.CopyFrom(MS, 0);
        finally
          MS.Free;
        end;
      end;
      begin
       SaveDialog1.InitialDir := 'C:\MyProjects';
     
      if SaveDialog1.Execute then
      begin
        FS := TFileStream.Create(SaveDialog1.FileName, fmCreate);
        try
          WriteItems(ListBox1.Items);
          WriteItems(ListBox2.Items);
          WriteItems(ListBox3.Items);
          WriteItems(ListBox4.Items);
        finally
          FS.Free;
        end;
      end;
     
      end;

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour et bienvenue,
    prenez l'habitude d'indiquer la version de Delphi que vous utilisez ainsi que le framework (en quelque sorte la saveur) VCL ou FMX.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // RIO FMX
     if SaveDialog1.Execute then
      begin
        ListBox1.Items.SaveToFile(ReplaceStr(Savedialog1.FileName,'.','1.'));
        ListBox2.Items.SaveToFile(ReplaceStr(Savedialog1.FileName,'.','2.');
        ListBox3.Items.SaveToFile(ReplaceStr(Savedialog1.FileName,'.','3.');
        ListBox4.Items.SaveToFile(ReplaceStr(Savedialog1.FileName,'.','4.');
      end;
    Bon, je m'excuse du fait que je fais ça à la "va vite" et que je n'ai pas vérifié exactement les noms de fichiers créés
    Avantage de plusieurs fichiers : il est tout aussi facile de charger les listes : Listbox1.Items.LoadFromFile(nomfichier1.txt)

    cela dit ce n'est pas dans un fichier INI

    Si vous voulez écrire l'ensemble dans un fichier ini sachez que tout d'abord il faut une certaine structure et que les lignes sont sous la forme d'une paire nom=valeur
    [Liste1]
    ligne1 = xx/xx/xx
    ligne2 = xx/xx/xx
    [Liste2]
    ..
    [Liste3]
    ...
    [Liste4]
    Voilà une proposition non vérifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    use System.IniFiles
    ...
    var F : TIniFile;
         i : integer; 
    begin
    if SaveDialog1.Execute then 
     begin
        F:=TIniFile.Create(SaveDialog1.FileName);
        try
          for i:=0 to liste1.Items.Count-1 do F.WriteString('Liste1',Format('ligne%d',[i]),Liste1.Items[i];
          for i:=0 to liste2.Items.Count-1 do F.WriteString('Liste2',Format('ligne%d',[i]),Liste1.Items[i];
          for i:=0 to liste3.Items.Count-1 do F.WriteString('Liste3',Format('ligne%d',[i]),Liste1.Items[i];
          for i:=0 to liste4.Items.Count-1 do F.WriteString('Liste4',Format('ligne%d',[i]),Liste1.Items[i];
        finally
           F.Free;
        end;
     end;    
     
     end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    merci mon ami c ce que je cherche

    Mais comment peut-on charger le fichier ini pour remplir les listboxes?

    j'ai utilisé le syntaxe suivant mais ça n'a pas marché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button6Click(Sender: TObject);
    var F : TIniFile;
         i : integer;
    begin
     if opendialog1.Execute then
    Opendialog1.InitialDir:='C:\MyProjects\';
     F.ReadString('Liste1',Format('ligne%d',[i]),listbox1.Items[i]);
     F.ReadString('Liste2',Format('ligne%d',[i]),listbox2.Items[i]);
     F.ReadString('Liste3',Format('ligne%d',[i]),listbox3.Items[i]);
     F.ReadString('Liste4',Format('ligne%d',[i]),listbox4.Items[i]);
    end;
    j'ai ce message d'erreur

    Nom : 2019-02-01_18-07-39.png
Affichages : 396
Taille : 3,8 Ko

    merci infinémént pour votre aide

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    merci mon ami c'est ce que je cherche
    Dans ces cas là, il est de bon usage d'utiliser le sous la discussion qui aide, cela donne des points dont je n'ai rien à faire mais surtout indique aux autres lecteurs la/les solution(s) retenue(s) ou ayant apporté une aide précieuse.

    Je vous ai totalement aidé pour la sauvegarde mais pour l'inverse ce ne serait pas vous aider que de vous fournir la solution. Si vous ne le faites pas un peu par vous-même vous n'aurez rien appris.

    Étudions votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button6Click(Sender: TObject);
    var F : TIniFile;
         i : integer;
    begin
     if opendialog1.Execute then
    jusque-là ça va
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Opendialog1.InitialDir:='C:\MyProjects\';
    à quoi cela peut bien servir puisque le dialogue d'ouverture à déjà été exécuté ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     F.ReadString('Liste1',Format('ligne%d',[i]),listbox1.Items[i]);
    Là, c'est du grand n'importe quoi !
    • F n'est pas ouvert
    • i n'est pas initialisé ce qui provoque la première erreur
    • la syntaxe de readstring est fausse

    Pistes de travail
    • pour F vous avez déjà la syntaxe dans le code que vous avez recopié mais peut-être pas bien étudié
    • pour i vous devez balayer chaque section de votre fichier ini et récupérer les éléments de celles-ci mais peut-être y a t'il une instruction simple ? Je vous invite à lire la FAQ pour y trouver la réponse. Ce devrait d'ailleurs être votre premier réflexe avant de soumettre une question
    • pour la syntaxe la touche d'aide ou la documentation mais sera t-elle utile ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    j'ai consulté la FAQ mais mon problème persiste
    j'ai ridigé le code suivant mais je n'ai pas pu le faire correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm3.Button3Click(Sender: TObject);
    var F: TInifile;
    i:integer;
    begin
    if opendialog1.Execute then
     
       Listbox1.items:=F.ReadString('Liste1', '[i]',Listbox1.Items[i] );
    end;
    en suivant l'exemple du FAQ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chaine:=FileIni.ReadString('Section Chaine', 'NomClé Chaine', 'Valeur par Défaut' );
    merci

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Et Listbox1.items est une classe TStrings, pas une chaîne.

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par sofiene abessi Voir le message
    j'ai consulté la FAQ mais mon problème persiste
    Hé bien vous avez mal lu https://delphi.developpez.com/faq/?p...un-fichier-ini

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm3.Button3Click(Sender: TObject);
    var F: TInifile;
    i:integer;
    begin
    if opendialog1.Execute then
    // MAIS QUAND ALLEZ VOUS OUVRIR LE FICHIER .
       Listbox1.items:=F.ReadString('Liste1', '[i]',Listbox1.Items[i] ); // du grand n'importe quoi !
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    enfin aprés une bonne concentration tout est réglé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    procedure TForm1.Button6Click(Sender: TObject);
    Var F  : TIniFile;
    i:integer;
     
      CountItems: Integer;
    begin
       SaveDialog1.InitialDir := 'C:\MyProjects';
     
     if opendialog1.Execute then
     
      begin
      F := TIniFile.Create(OpenDialog1.FileName);
        try
     
      CountItems := F.ReadInteger('Liste1', 'CountItems', 0);
          for i := 0 to CountItems - 1 do
            ListBox1.Items.Add(F.ReadString('Liste1', Format('ligne%d', [i]), ''));
     
          CountItems := F.ReadInteger('Liste2', 'CountItems', 0);
          for i := 0 to CountItems - 1 do
            ListBox2.Items.Add(F.ReadString('Liste2', Format('ligne%d', [i]), ''));
     
          CountItems := F.ReadInteger('Liste3', 'CountItems', 0);
          for i := 0 to CountItems - 1 do
            ListBox3.Items.Add(F.ReadString('Liste3', Format('ligne%d', [i]), ''));
     
          CountItems := F.ReadInteger('Liste4', 'CountItems', 0);
          for i := 0 to CountItems - 1 do
            ListBox4.Items.Add(F.ReadString('Liste4', Format('ligne%d', [i]), ''));
       finally
       F.Free;
       end;
      end;
     
    end;
    merci pour votre aide

    Mais j'ai un autre souci c comment eviter d'avoir un item dans deux listboxes differents cad eviter d'avoir la meme date dans deux listboxes

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ce qui aurait, je pense, pu être écrit ainsi (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure TForm1.Button6Click(Sender: TObject);
    Var F  : TIniFile;
    begin
       SaveDialog1.InitialDir := 'C:\MyProjects';
     
     if opendialog1.Execute then
     
      begin
      F := TIniFile.Create(OpenDialog1.FileName);
        try
           F.ReadSectionValues('Liste1',ListBox1.Items);
           F.ReadSectionValues('Liste2',ListBox2.Items);
           F.ReadSectionValues('Liste3',ListBox3.Items);
           F.ReadSectionValues('Liste4',ListBox4.Items);
       finally
         F.Free;
       end;
      end;
     
    end;
    comment eviter d'avoir un item dans deux listboxes differents cad eviter d'avoir la meme date dans deux listboxes
    les Items sont contenus dans un TStrings donc, toutes les fonctions de cette classe sont disponibles. Dans celles-ci il y a IndexOf qui fourni la position d'une chaine dans la liste et renvoi -1 si la chaine n'existe pas.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment enregistrer un memo1 dans un fichier ini svp
    Par moldock dans le forum Débuter
    Réponses: 25
    Dernier message: 07/08/2009, 10h58
  2. Export du contenu d'une listbox dans un fichier texte
    Par GCAccess dans le forum VBA Word
    Réponses: 10
    Dernier message: 07/11/2008, 00h46
  3. Réponses: 8
    Dernier message: 13/04/2007, 11h17
  4. [c#] Comment imprimer le contenu dune listbox dans un fichier
    Par Clarissa2006 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 24/06/2006, 18h21
  5. Probléme d'enregistrement dans un fichier ini
    Par jv2759 dans le forum Delphi
    Réponses: 2
    Dernier message: 19/05/2006, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo