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

Langage Delphi Discussion :

Unicité de nom de clés dans un fichier .INI


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Unicité de nom de clés dans un fichier .INI
    Bonsoir,

    Je suis confronté à un problème auquel j'aimerais avoir quelques explications.

    Je souhaite écrire dans une section x, avec un nom de clé y plusieurs clés récupérées d'une combobox.

    Pour être plus clair voici un extrait du fichier ini que j'aimerais obtenir:

    [moi]
    Race=Ange
    Sexe=Masculin
    Pays=Edelia
    Equipes=Beregor
    Arme=Epée
    Classe_depart=Guerrier
    1Evo=SwordMaster
    1Evo=Priest
    ...

    Ceci à la particularité d'avoir le même nom de clé plusieurs fois et d'avoir des valeurs differentes.

    Est ce possible?

    Pour info, voila mon code:

    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
     
    begin
      if NomPerso.Text <> '' then
      begin
         with TIniFile.Create(ExtractFilePath(Application.Exename)+'Personnages.ini') do
          try
            WriteString(NomPerso.Text, 'Race', ComboRace.Items.Strings[ComboRace.ItemIndex]);
            WriteString(NomPerso.Text, 'Sexe', ComboSexe.Items.Strings[ComboSexe.ItemIndex]);
            WriteString(NomPerso.Text, 'Pays', ComboPays.Items.Strings[ComboPays.ItemIndex]);
            WriteString(NomPerso.Text, 'Equipes', ComboEquipe.Items.Strings[ComboEquipe.ItemIndex]);
            WriteString(NomPerso.Text, 'Arme', ComboArme.Items.Strings[ComboArme.ItemIndex]);
            WriteString(NomPerso.Text, 'Classe_depart', ComboClasse.Items.Strings[ComboClasse.ItemIndex]);
            FOR i:=0 TO CheckList1Evo.Count-1 DO IF CheckList1Evo.Checked[i] THEN
               WriteString(NomPerso.Text, '1Evo', CheckList1Evo.Items[i]);
          finally
         Free;
      end;
       ButtonValiderStd.Visible := True;
       ButtonValiderOver.Visible := False;
       ButtonValiderDown.Visible := False;
       MessageDlg ('Le personnage est validé', mtInformation, [mbOK], 0);
      end
    else
      MessageDlg ('Tu as oublié de nommer ce personnage', mtInformation, [mbOK], 0);
    end;
    Merci d'avance.

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Ce n'est pas possible avec un objet de type TIniFile, mais tu peux analyser ton INI toi-même (perso, je fais toujours ça : c'est plus rapide, niveau exécution bien sûr).
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Non, de cette manière tu ne peux pas, tu vas réécrire la clé à chaque boucle.
    Si tu veux vraiment faire ça, je te conseille d'écrire toutes tes valeurs sur la même ligne en les séparant par un caractère spécial
    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
     
    var
      i: integer;
      EvoTemp: string;
    begin
      if NomPerso.Text <> '' then
      begin 
         with TIniFile.Create(ExtractFilePath(Application.Exename)+'Personnages.ini') do
          try
            WriteString(NomPerso.Text, 'Race', ComboRace.Items.Strings[ComboRace.ItemIndex]);
            WriteString(NomPerso.Text, 'Sexe', ComboSexe.Items.Strings[ComboSexe.ItemIndex]);
            WriteString(NomPerso.Text, 'Pays', ComboPays.Items.Strings[ComboPays.ItemIndex]);
            WriteString(NomPerso.Text, 'Equipes', ComboEquipe.Items.Strings[ComboEquipe.ItemIndex]);
            WriteString(NomPerso.Text, 'Arme', ComboArme.Items.Strings[ComboArme.ItemIndex]);
            WriteString(NomPerso.Text, 'Classe_depart', ComboClasse.Items.Strings[ComboClasse.ItemIndex]);
            FOR i:=0 TO CheckList1Evo.Count-1 DO IF CheckList1Evo.Checked[i] THEN
               EvoTemp := EvoTemp + CheckList1Evo.Items[i]+ '@'; // '@' étant le caractère de délimitation ou un autre, c'est comme tu veux
     
            WriteString(NomPerso.Text, '1Evo', EvoTemp);
          finally
            Free;
          end;
    ensuite pour la lecture, tu récupères cette ligne et tu la découpes
    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
     
    procedure Split(const Delimiteur: Char;Input: string;
        const Strings: TStrings) ;
    begin
       Assert(Assigned(Strings)) ;
       Strings.Clear;
       Strings.Delimiter := Delimiteur;
       Strings.DelimitedText := Input;
    end;
     
    procedure TForm1.LectureClick(Sender: TObject);
    var
      EvoTemp: string;
      List : TStrings;
    begin
      with TIniFile.Create(ExtractFilePath(Application.Exename)+'Personnages.ini') do
      try
        EvoTemp := ReadString(NomPerso.Text, '1Evo', 'Erreur');
        Split('@',EvoTemp,List);
        ListBox1.Items := List;
      finally
        Free;
      end;
    end;
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sjrd
    Ce n'est pas possible avec un objet de type TIniFile,
    SJRD est-ce dû à l'implémentation de TInifile ou aux limitations du SDK ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses.

    J'ai fais comme tu m'as conseillé lil_jam63 (de toute manière, je n'avais pas le choix si j'ai bien compris).

    Cela fonctionne tres bien. Par contre j'ai du mal à comprendre ce que représente la variable EvoTemp. J'ai fais ce test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EvoTemp := CheckList1Evo.Items[i]+ '@';
    Et il ne m'ajoute qu'une seule entrée. J'ai compris le reste du code. Mais j'aimerais comprendre pourquoi il faut ajouter ça:

    Par ailleurs, j'espère que le fais d'avoir concatené cette donnée, ne me pénalisera pas par la suite. Les données inscrites dans mon fichiers INI serviront comme base de donnée dans un tableau (quand j'aurais attaqué cette partie). Et comme je ne sais pas encore comment procéder... apparament, l'objet TStringGrid pourrais me convenir.

    Heureusement que tu m'as montré comment redécouper tout ça.

    SJRD: Que veux tu dire par "analyser" le fichier INI? Est ce la méthode que m'a montré lil_jam63?

    En tout cas merci à vous.
    PS: je ne sais pas trop si je dois mettre ce post tout de suite à l'état "Résolu" comme j'attends une réponse.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Citation Envoyé par Laurent Dardenne
    Citation Envoyé par sjrd
    Ce n'est pas possible avec un objet de type TIniFile,
    SJRD est-ce dû à l'implémentation de TInifile ou aux limitations du SDK ?
    Non c'est juste que TIniFile s'appuie sur le fait que tu utilises un fichier INI parfait, qui respecte toutes les règles d'un tel fichier. Mais j'utilise souvent des fichiers ayant cette structure mais outrepassant les règles exactes. Notamment l'unicité des noms de plusieurs clés de la même section.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    pourquoi ne pas utiliser le format xml ?
    Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
    PostgreSQL 8.4 sous Debian
    Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Personnelement, je ne connais ce format que de nom.
    Je ne sais pas quelles sont ses spécificités.

    J'apprends seulement à utiliser et à connaitre le format INI.
    J'ai hésité à utiliser le format texte TXT et j'ai préféré le format INI pour ses fonctionnement ( section, nom de clé, valeur ).

    Mais peut etre que l'on peut faire pareil avec d'autres formats. Etant donné que je débute, ma vision se limite à ce que je connais.

    Si vous êtes interessé pour me conseiller, je peux vous passer à la demande mon programme ( Character Editor V2.0 ). Il s'agit d'une base de données de personnages pour mon projet. ( n'hésitez pas à utiliser mon msn )

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Il y a aussi la possibilité de stocker le nombre d'occurence avec une clé 1EvoCount, et de stocker les valeurs dans les clés 1Evo00, 1Evo01, ...

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/10/2011, 11h00
  2. Nom zone identique dans 2 fichiers
    Par brunodu60 dans le forum AS/400
    Réponses: 2
    Dernier message: 29/01/2010, 18h12
  3. Réponses: 6
    Dernier message: 15/04/2009, 10h33
  4. Réponses: 4
    Dernier message: 12/04/2009, 14h40
  5. Réponses: 4
    Dernier message: 10/04/2008, 22h23

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