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 :

Détecter si espace entre section dans fichier ini !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut Détecter si espace entre section dans fichier ini !
    Bonjour à toutes et à tous,

    D'après ce que j'ai lu, je ne pense pas que l'on sait ajouter un espace entre les sections d'un fichier *.ini directement pendant la création et avant/après la sauvegarde, avec Win 95 cela se faisait automatiquement.

    Ma question est dans le titre, car si on peut détecter qu'il existe cet espace dans ce fichier, alors on ne l'ajoute pas par une procedure (chargement fichier ini, insert une ligne, sauvegarde fichier ini).

    Ceci afin d'éviter d'ajouter chaque fois une ligne dans ce fichier ini.

    Merci de l'aide éventuelle.

    @+,

    Cincap

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Win95 ajoutait une ligne avant la section, bien un truc dont je ne me rappelais pas
    Win98 devait le faire aussi, je suppose
    C'est vrai que cela aide la lecture !
    Récemment, j'ai fait un petit programme qui gère toute ses configs en ini, il était tout serré (le fichier n'existant pas au début, il est complètement créé)

    Une méthode basique, une TStringList, tu charge l'intégralité du fichier, un truc genre

    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
    LastIsEmpty := false;
    SL.LoadFromFile(IniFile);
    Index := 0;
    SectionCount := 0;
    while Index < SL.Count do
    begin 
      S := Trim(SL[Index]);
      L := Length(S);  
      if LastIsEmpty and (SectionCount > 1) and (L >= 2) and ((S[1] = '[') and S[L] = ']')) then
      begin
        SL.Insert(Index, '');
        Inc(SectionCount);    
        Inc(Index);    
      end;
     
      LastIsEmpty := (L = 0);
      Inc(Index); 
    end;

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ ShaiLeTrool, merci de ta réponse, j'avais fait ceci :

    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
     
    var
    f: TStrings;
    i: Integer; 
    begin
     f := TStringList.Create;
     try
     f.LoadFromFile(IniFile);
     for i := Pred(f.Count) downto 1 do
    if (f[i] <> '') and (f[i][1] = '[') then 
    f.Insert(i, '');
     f.SaveToFile(IniFile);
    finally
    f.Free;
    end;
     end;
    Cela ressemble à ta suggestion.

    Cela fonctionne correctement dès que le fichier ini est existant, seul hic si tu inclus cet automatisme dans le projet, à chaque onclose, tu auras les sections de ton fichier ini qui aura un espace de plus.

    D'ou ma question de détecter si il existe un espace entre deux sections d'un fichier ini.

    @+,

    Cincap

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 419
    Points
    1 419
    Par défaut
    En rajoutant une verif si ligne vide déjà présente ?
    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
    Var
      f: TStrings;
      I: Integer;
    Begin
      f       := TStringList.Create;
      Try
        f.LoadFromFile(IniFile);
        For I := f.Count - 1 Downto 2 Do
          If (f[I] <> '') And (f[I][1] = '[') And (f[I - 1] <> '') Then
            f.Insert(I, '');
        f.SaveToFile(IniFile);
      Finally
        f.Free;
      End;
    End;

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Citation Envoyé par cincap Voir le message
    Cela ressemble à ta suggestion.
    ...
    D'ou ma question de détecter si il existe un espace entre deux sections d'un fichier ini.
    Tu n'as pas lu mon code !
    LastIsEmpty ne t'a même pas mis la puce à l'oreille

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ ShaiLeTroll, en effet tu as raison, désolé pour cet égarement, mais très préoccupé pour des problèmes de santé ce qui ne me justifie pas.

    @ 3 x oui, si je comprends bien il n'y avais pas de solution directement dans l'écriture du fichier ini.

    Je vais aussi tester le tout demain.

    Merci à vous deux et bonne soirée.

    @+,

    Cincap

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    uses IniFiles;

    Var Ini : TIniFile ?


    Ou c'est juste pour le fun d'interpréter les INI ?

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ Dr. Who,
    Var Ini : TIniFile ?
    merci du rappel pour l'uses mais forcément, mon projet utilise "IniFiles" puisque je crée l'écriture de mes paramètres en sortie !

    @ ShaiLeTrool, j'ai voulu tester ton code et erreur sur "LastIsEmpty" quelles sont donc tes variables, car je suis certains que c'est cela mon problème ?

    @ 3xoui, super cette petite modif de mon code, cela fonctionne correctement et un seul espace, j'ai même testé en ajoutant des signe (= ~ ect...).

    Topic parfaitement résolu grâce à vous.

    Encore merci à tous.

    @+,

    Cincap

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    erreur sur "LastIsEmpty" quelles sont donc tes variables, car je suis certains que c'est cela mon problème ?
    Quelle erreur ?

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ Tourlourou, bonjour, la variable est "boolean" et l'erreur se produit içi :

    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
    
    var
    sl: TStrings;
    index,sectioncount,l : Integer;
    s : string;
    LastIsEmpty : boolean;
    
    begin
    LastIsEmpty := false;
    SL.LoadFromFile(Edfichier.Text);
    Index := 0;
    SectionCount := 0;
    
    while Index < SL.Count do
    begin
    S := Trim(SL[Index]);
    L := Length(S);
    if LastIsEmpty and (SectionCount > 1) and (L >= 2) and ((S[1] = '[') and S[L] = ']')) then
    begin
        SL.Insert(Index, '');
        Inc(SectionCount);
        Inc(Index);
    
     end;
      LastIsEmpty := (L = 0);
      Inc(Index);
    end;
    Message erreur "Operateur non applicable à ce type d'opérande".

    @+,

    Cincap (D6 et Seven 64Bits)

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Il manque une parenthèse. (S[1] = '[') and S[L] n'est pas un test valide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if LastIsEmpty and (SectionCount > 1) and (L >= 2) and ((S[1] = '[') and (S[L] = ']')) then

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ AndNotOr, merci de ta correction mais j'ai encore une erreur utilisé telquel.

    S'arrête ici sans message "while Index < SL.Count do".

    De plus j'ai du rajouter la création/destruction du "TStringList";

    Je recopie le code complet de ShaiLeTroll :

    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
    var
    
    sl: TStrings;
    index,sectioncount,l : Integer;
    s : string;
    LastIsEmpty : boolean;
    
    begin
    
    LastIsEmpty := false;
    
    SL:= TStringList.Create;
    SL.LoadFromFile(Edfichier.Text);
    
    Index := 0;
    SectionCount := 0;
    
    while Index < SL.Count do //Erreur ici
    begin
      S := Trim(SL[Index]);
      L := Length(S);
      if LastIsEmpty and (SectionCount > 1) and (L >= 2) and ((S[1] = '[') and (S[L] = ']')) then
      begin
        SL.Insert(Index, '');
        Inc(SectionCount);
        Inc(Index);
      end;
    
      LastIsEmpty := (L = 0);
      Inc(Index);
    
      SL.Free;
    end;
    Pour ma part, je ne vois pas ou cela cale.

    @+,

    Cincap

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    var
      sl: TStringList;
      index, sectioncount, l: Integer;
      s : string;
      LastIsEmpty : boolean;
     
    begin
      SL:= TStringList.Create;
      SL.LoadFromFile(Edfichier.Text);
     
      LastIsEmpty := false;
      Index := 0;
      SectionCount := 0;
     
      while Index < SL.Count do 
      begin
        S := Trim(SL[Index]);
        L := Length(S);
        if LastIsEmpty and (SectionCount > 1) and (L >= 2) and ((S[1] = '[') and (S[L] = ']')) then
        begin
          SL.Insert(Index, '');
          Inc(SectionCount);
          Inc(Index);
        end;
     
        LastIsEmpty := (L = 0);
        Inc(Index);
      end;
     
      SL.Free; // c'est mieux de le sortir de la boucle while...
     
    end;

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ tourlourou, cela se compile mais aucune action sur le fichier "*.ini"

    Seul mon code avec en supplément la détection d'une ligne vide par 3xoui, me donne satisfaction.

    Par contre, ce serait utile de comprendre pourquoi la suggestion de ShaiLeTroll ne fonctionne pas ainsi que ta solution.

    Ce serait facile à tester avec un simple fichier "*.ini" et un Tedit.

    Edit : au fait je ne vois pas ou est la sauvegarde du fichier *.ini modifié soit "SL.SaveToFile(Edfichier.Text);"

    @+,

    Cincap

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    L'aide et le code fournis sur le forum ne sont pas systématiquement tout prêts à être intégrés... Il a fallu que tu ajoutes la création du StringList, que tu devines le type des variables ; s'il faut ajouter un Save, ce n'est pas le bout du monde, et d'ailleurs tu l'as fort bien vu !

    Pour l'efficacité du code, bien souvent, les propositions sont tapées dans le forum et non vérifiées dans l'EDI, d'où des syntaxes aléatoires : parenthèses manquantes, noms de fonctions approximatifs (ma spécialité), etc.

    Le cœur du problème est la mécanique du code : s'il ne fournit pas le résultat prévu, pour permettre aux contributeurs qui ne peuvent pas ou ne veulent pas ouvrir leur EDI pour tester, mieux vaut bien expliquer les erreurs, donner les messages, les lignes en cause, voire les valeurs testées.

    En lisant le code, il devient évident (sachant qu'il ne fonctionne pas), que SectionCount n'étant jamais incrémenté, ça explique bien des choses...
    Il doit donc suffire de modifier la condition en
    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
    var
      sl: TStringList;
      index, sectioncount, l: Integer;
      s : string;
      LastIsEmpty : boolean;
     
    begin
      SL:= TStringList.Create;
      SL.LoadFromFile(Edfichier.Text);
     
      LastIsEmpty := false;
      Index := 0;
      SectionCount := 0;
     
      while Index < SL.Count do 
      begin
        S := Trim(SL[Index]);
        L := Length(S);
     
        if (L >= 2) and ((S[1] = '[') and (S[L] = ']')) then
        begin // new section
          Inc(SectionCount);
          if (SectionCount > 1) and not LastIsEmpty then
          begin // si section 2 et suivantes, sans saut de ligne la précédant
            SL.Insert(Index, '');
            Inc(Index);
          end;
        end;
     
        LastIsEmpty := (L = 0);
        Inc(Index);
      end;
     
      SL.SaveToFile(Edfichier.Text);
      SL.Free; 
     
    end;
    autre solution, théoriquement valide (cad qui ne marche pê pas !), si tu n'as pas de '[' ailleurs que dans les titres de sections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiReplaceStr(SL.Text, sLineBreak+'[', '', [rfReplaceAll]); // syntaxe à vérifier
    AnsiReplaceStr(SL.Text, '[', sLineBreak+'[', [rfReplaceAll]);

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    @ tourlourou, cette fois c'est gagné.

    Je te remercie pour ta patience, me voila un peu plus malin à 60 berges.

    @+,

    Cincap

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    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 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Pour l'efficacité du code, bien souvent, les propositions sont tapées dans le forum et non vérifiées dans l'EDI, d'où des syntaxes aléatoires : parenthèses manquantes, noms de fonctions approximatifs (ma spécialité), etc.
    Clair, j'ai mis ça brut de décoffrage, et encore, vu que je suis sous C++Builder depuis 2 ans, je mélange les deux, si vous aviez vu le premier jet, il manquait les then et j'avais parfais du == ou = pour la condition

    C'est bien pour cela que j'ai mis "un truc genre : " sinon j'aurais mis "une fonction prête à l'emploi : "
    En général, soit j'ai déjà la fonction, soit n'ayant jamais fait un équivalent, cela fait un mini-défi à relever !

    Sinon, par habitude, j'évite les algo en for to ou for downto avec Insert, on est pas à l'abris de boucle infinie d'où mon while complètement foireux sur l'incrément !

    @tourlourou, la solution en AnsiReplaceStr, j'y ai pensé mais j'ai pas osé !

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    A noter encore que seul le premier "[" (indépendamment des espaces) fait foi pour une entête de section. Ceci, même très laid, est parfaitement valide
    Tester le premier "[" est donc suffisant !

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 468
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 468
    Points : 1 342
    Points
    1 342
    Par défaut
    Bonjour à toutes et à tous,

    @ Andnotor,
    Tester le premier "[" est donc suffisant !
    merci de le rappeler, j'avais déjà fait la modif en créant la procédure "procedure InsertLigneSection(const IniFile: TFileName);"

    @ ShaiLeTroll,
    Clair, j'ai mis ça brut de décoffrage
    je l'avais bien compris, ce qui compte et méritant c'est de participer à l'aide gratuite.

    Merci à tous,

    @+,

    Cincap

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/07/2011, 18h52
  2. [C#] Comment lire/ecrire dans fichier ini ?
    Par meli0207 dans le forum C#
    Réponses: 2
    Dernier message: 20/03/2006, 17h53
  3. Changer le nom d'une section de fichier ini
    Par muquet dans le forum Langage
    Réponses: 4
    Dernier message: 27/01/2006, 14h10
  4. espace entre sections ini
    Par quarkz dans le forum Langage
    Réponses: 4
    Dernier message: 06/09/2005, 12h22
  5. Determiner le Nombre de sections dans un ini
    Par gilles641 dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2005, 16h07

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