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 :

Fichier INI : Récupérer les Clé & les valeurs qui leurs correspondent


Sujet :

Delphi

  1. #1
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut Fichier INI : Récupérer les Clé & les valeurs qui leurs correspondent
    Bonjour,
    Je suis entrain de faire un petit exécutable qui contient un PopupMenu. Et je voudrais charger celui-ci à partir d'un fichier INI, et créer un objet pour chaque ligne du fichier INI et lorsque je clique sur cet objet je parcours le chemin contenu dans la valeur correspondante au 'caption' de l'objet.
    Je voudrais alors savoir comment récupérer les clés d'un fichier INI et les valeurs qui leurs correspondent, je m'explique :
    Mettons que mon fichier INI se compose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [Item]
    PremierItem=ValeurItem1
    SecondItem=ValeurItem2
    [...]
    PremierItem correspondrait au 'caption' de l'objet à créer, ValeurItem1 correspondrait au chemin à parcourir lorsque je clique sur PremierItem.

    Voilà ma procédure servant à créer l'objet en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure AjouterUnItem(PopupMenu:TMenuItem;FichierIniACharger,Section,Cle,default:String);
    begin
      nomitem:=form5.edit1.Text;
      diritem:=Form5.edit2.Text;
      MenuItem:=TMenuItem.Create(PopupMenu);
      MenuItem.Caption:=Form5.edit1.text;
      PopupMenu.Add(MenuItem);
    end;
    La procédure de parcours du dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       form2.ListBox1.Items.Clear;
      Chemin := ;//Valeur du fichier ini
      If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
      Begin
        Repeat
          If (Info.Attr And faDirectory)=0
            Then form2.ListBox1.Items.Add(Info.FindData.cFileName);  //affichage des fichier
        Until FindNext(Info)<>0;
      FindClose(Info);
      End;
    Et la procédure de récupération des clés et valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure traitement();
    begin //PARTIE DE CREATION DU POPUPMENU
    if not fileexists('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini') then
    begin
     ini:=TIniFile.Create('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini');
     Ini.WriteString('FICHIER DU POPUPMENU', 'CE FICHIER NE DOIT EN AUCUN CAS ETRE SUPPRIME', '');
    end
    else begin
      ini:=TIniFile.Create('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini');
      //C'est ici que je bloque. J'ai essayé de lire la section entiere avec "readsectionvalues" mais je n'ai pas le résultat espéré
      end;
    end;
    J'ai tout fais (Création de l'objet au bon endroit, affectation de l'évènement, inscription dans le fichier ini), il me manque juste à pouvoir le charger...
    Quelqu'un aurait une idée ?
    Merci d'avance.
    La source de la majorité des bugs sur Windows se situe entre le clavier et la chaise...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Une fois ton fichier INI créé tu dois appeler ReadSection pour récupérer tout les noms de clé dans un TStrings puis pour chaque clé revenue récupérer sa valeur via ReadString.

    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
    var
     KeyNames: TStringList;
     Cpt: Integer;
     Value: String;
    begin
    ...
      KeyNames := TStringList.Create();
      try
        Ini.ReadSection( 'Item', KeyNames );
        for Cpt := 0 to KeyNames.Count - 1 do
        begin
          Ini.ReadString( 'Item', KeyNames.Items[Cpt], Value );
          // faire quelque chose de Value et de la clé (KeyNames.Items[Cpt])
        end;
     
      finally
        KeyNames.Free;
      end;
    end;
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Merci bien Aka Guymelef, ta technique marche par contre j'ai dû modifier 2, 3 trucs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [...]
    //Ini.ReadString( 'Item', KeyNames.Items[Cpt], Value ); La ligne que tu m'as donnée était fausse au niveau du texte en gras, je l'ai corrigée ;-)
    Ini.ReadString( 'Item', KeyNames.Strings[Cpt], Value );
    [...]
    Voilà mon code entier :
    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
     
    var
     KeyNames: TStringList;
     Cpt: Integer;
     Value: String;
    begin //PARTIE DE CREATION DU POPUPMENU
    //si le fichier INI n'existe pas, on le cré
    if not fileexists('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini') then
    begin
     ini:=TIniFile.Create('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini');
     Ini.WriteString('FICHIER DU POPUPMENU', 'CE FICHIER NE DOIT EN AUCUN CAS ETRE SUPPRIME', 'By r3');
    end
    //s'il existe, on charge les valeurs pour le popupmenu
    else
      begin //CREATION DYNAMIQUE DES OBJETS
        ini:=TIniFile.Create('F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini');
      KeyNames := TStringList.Create();
      try
        Ini.ReadSection( 'Item', KeyNames );
        for Cpt := 0 to KeyNames.Count - 1 do
        begin
    //Affectation des valeurs aux variables
          nomitem:=KeyNames.strings[Cpt];
          diritem:=Ini.ReadString( 'Item', KeyNames.Strings[Cpt], Value );
    //Les valeurs s'affichent correctement
          showmessage(nomitem +#10#13+ diritem);
        end;
      finally
        KeyNames.Free;
      end;
      end;
    end;
    ::ENJOY::
    La source de la majorité des bugs sur Windows se situe entre le clavier et la chaise...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    En effet ce n'était pas Items mais bon...

    N'oublies pas de cliquer sur si ton problème est réglé.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Héhé
    Justement, mon problème n'est pas réglé :
    Tout se passe bien dans mon code jusqu'au moment où j'ajoute l'objet via la procédure "AjouterUnItem", j'ai l'erreur classique "Access Violation..."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
          nomitem:=KeyNames.strings[Cpt];
          diritem:=Ini.ReadString( 'Item', KeyNames.Strings[Cpt],Value);
          AjouterUnItem(Form2.PopupMenu1.Items[1].Items[0],
          'F:\Documents de r3\Divers\Programmes\Dossiers\Lanceur\Menu.ini'
          ,'Item',nomitem,diritem);
          //showmessage(nomitem +#10#13+ diritem); par contre, sur cette ligne tout ce passe bien =D
    end;
    La procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure AjouterUnItem(PopupMenu:TMenuItem;FichierIniACharger,Section,Cle,default:String);
    begin
      INI:=TIniFile.Create(FichierIniACharger);
      MenuItem:=TMenuItem.Create(PopupMenu);
      MenuItem.Caption:=INI.ReadString(Section,Cle,default);
      PopupMenu.Add(menuItem);
      MenuItem.OnClick := Form5.AjoutClic;
    end;
    Je ne vois vraiment pas ce qu'il se passe...
    La source de la majorité des bugs sur Windows se situe entre le clavier et la chaise...

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Es-tu sûr que Form2.PopupMenu1.Items[1].Items[0] existe réellement ? Passe en debuggage pour le savoir.

    PS : petite boulette de ma part qui n'a rien à voir, j'ai cru que c'était dans le troisième paramètre que ReadString retournait la valeur mais en fait il permet de passer la valeur par défaut à retourner si la clé n'existe pas. Donc au lieu d'avoir une variable Value et de la passer, passe plutôt une constante comme ''.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre du Club Avatar de bionicleman
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Points : 66
    Points
    66
    Par défaut
    Tu as raison
    Le code précédent se trouve sur la form1 alors que le popupmenu est sur la seconde.
    Voilà j'ai déplacé ma procédure, tout marche nickel

    Merci Aka Guymelef =)
    Bonne journée !
    La source de la majorité des bugs sur Windows se situe entre le clavier et la chaise...

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/04/2008, 06h44
  2. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  3. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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