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

Contribuez Pascal Discussion :

Nettoyage des entrées mortes dans la liste des projets récents


Sujet :

Contribuez Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 734
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 734
    Points : 15 145
    Points
    15 145
    Par défaut Nettoyage des entrées mortes dans la liste des projets récents
    Bonsoir,

    Comme j'en avais marre d'avoir une liste de "projets récents" moisie, suite à suppression, déplacement, renommage de dossiers, j'ai pris le taureau par les cornes et ai pondu à la va-vite un petit nettoyeur que je me fais un plaisir de soumettre à votre sagacité.

    Ça concerne le fichier environmentoptions.xml qui se trouve dans un dossier caché, sous Linux c'est dans /home/username/.lazarus/ et sous Windows et Mac vous cherchez,

    Je le poste dans Lazarus car c'est la cible de l'outil, mais après avoir été écrit et testé dans cet environnement, le code final a été compilé avec Fpc, ce qui passe le binaire sous Linux de 3,5 Mo à 500 ko ; c'est encore un peu gros pour ce que ça fait, mais bon, "le mieux est l'ennemi du bien", c'est bien connu.

    Voilà, il n'y a qu'à lire le code, il est suffisamment commenté, et à l'usage, ça me change la vie : suffit de le faire tourner de temps en temps, ou après des réorganisations/renommages de dossiers.

    Note : pour les premiers tests j'avais recopié ailleurs le fichier utilisé au quotidien pour ne pas le casser, j'ai laissé le code en l'état, vous comprendrez en le lisant.

    Enjoy,
    (tiens, il n'y a pas de coloration syntaxique, ici ?) EDIT : il ne faut pas dépasser les 100 lignes (et il fallait le savoir ! Merci, LittleWhite, )
    Code Pascal : 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    program clean_project_list;
    // compiler avec 'fpc clean_project_list'
     
    uses
      Classes, SysUtils; 
     
    procedure log(s: string);
    begin   WriteLn(s); end;
     
    var
      CHEMIN_ET_FICHIER: string;
      sl: TStringList;
      i: integer;
      posegale: integer;  // position du signe "=" dans la ligne
      validline: integer; // pointeur/compteur de ligne(s)
      ligne: string;
      prod: boolean;
    begin
      // à exécuter en dehors de l'EDI sinon, à sa fermeture, il va récrire
      // les valeurs (fausses !) qu'il a chargées à son ouverture...
    // /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ /!\ 
     
      prod := True; // aussi utilisé tout en bas
    //  prod := False; // aussi utilisé tout en bas
      if prod
      then CHEMIN_ET_FICHIER := 'votre_chemin_environmentoptions.xml'  // POUR LA VRAIE VIE /!\
      else CHEMIN_ET_FICHIER := 'autre_chemin_environmentoptions.xml';  // POUR TESTS /!\
     
      sl := TStringList.create;
      sl.LoadFromFile(CHEMIN_ET_FICHIER);
     
      //- à priori on dirait qu'il n'y a pas de doublons dans la liste, 
      //-1- : donc parcourir la liste à l'envers pour enlever les "not found" 
      i := sl.Count-1;
      while i > 0 do begin
        if copy(sl[i], 7, 15) = '</ProjectFiles>' then begin
          //log(sl[i]);
          repeat
            dec(i);
            //log(sl[i]); ok ligne complète
            posegale := Pos('=', sl[i]);
            //log(sl[i]+inttostr(posegale)); // 21 pour item1..item9, 22 au-delà
            if not FileExists(copy(sl[i], posegale+2, length(sl[i])-posegale-4)) then
            begin
              //log(copy(sl[i], posegale+2, length(sl[i])-posegale-4)+'°°°not found'); ok
              sl.Delete(i);
            end;
          until copy(sl[i-1], 7, 13) = '<ProjectFiles';
          Break;
        end else dec(i);
        //log(inttostr(i)+'***'); ok
      end;
      //log(inttostr(i)+'------'); ok
      //log(inttostr(sl.Count)+'------'); //ok
     
      //-2- : puis parcourir à l'endroit ce qui reste pour renuméroter les ItemXX
      i := -1;
      validline := 0;
      while i < sl.Count-1 do begin
        inc(i);
        if copy(sl[i], 7, 13) = '<ProjectFiles' then begin
          //log(sl[i]); // ok
          repeat
            inc(i);
            inc(validline); // utilisé aussi pour compteur de lignes
            posegale := Pos('=', sl[i]);
            //log(copy(sl[i], posegale+2, length(sl[i])-posegale-4));// -4 pour "/> OK
            // ligne à récrire
            ligne := '        <Item'+IntToStr(validline) + ' Value="'
              + copy(sl[i],posegale+2,length(sl[i])-posegale-4) + '"/>';   //log(ligne); // ok
            sl[i] := ligne;   //log(sl[i]); //ok ligne complète
          until copy(sl[i+1], 7, 15) = '</ProjectFiles>';
          Break;
        end;
      end;
      //memo(inttostr(validline)+'------'); //ok
     
      //-3- : mettre à jour la ligne "ProjectFiles" avec validline
      //      <ProjectFiles Max="30" Count="30">
      i := i - validline; //log(sl[i]); ok
      if copy(sl[i], 7, 13) = '<ProjectFiles' then // test de sécurité, juste au cas où...
      begin  // on est sur la bonne ligne
        posegale := Pos('Count="', sl[i])-1;
        // reconstruction de la ligne "ProjectFiles" 
        ligne := copy(sl[i],1,posegale+length('Count="'))+IntToStr(validline)+'">';
        //log(ligne); // ok
        sl[i] := ligne;  //log(sl[i]); //ok
      end;
      log('Nouveau nombre de projets : ' + IntToStr(validline));
     
      //-4- : normalement c'est fini, alors enregistrer.
      if prod
      then sl.SaveToFile(CHEMIN_ET_FICHIER)
      else sl.SaveToFile(CHEMIN_ET_FICHIER+'mod'); // par sécurité
     
      sl.Free; // ménage et fin
      Halt; // stop program loop
    end.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Bonjour Jipété !

    Merci pour le partage. Ça fonctionne impeccablement chez moi.

    Pour le plaisir de participer à la discussion (et aussi de t'embêter un petit peu), j'aurais écrit tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //if copy(sl[i], 7, 15) = '</ProjectFiles>' then begin
        if Pos('</ProjectFiles>', sl[i]) > 0 then begin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          //until copy(sl[i-1], 7, 13) = '<ProjectFiles';
          until Pos('<ProjectFiles', sl[i-1]) > 0;
    Même si ça ne change rien.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 734
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 734
    Points : 15 145
    Points
    15 145
    Par défaut
    Bonjour Roland,

    content de savoir que ça a bien fonctionné chez toi, j'en conclus que mon bazar est lisible, et, juste pour l'anecdote, avant de l'écrire j'avais 30 entrées dans la liste, qui a été ramenée à 22 (je savais qu'il y en avait des mortes) puis, après le déplacement d'un gros dossier, à 16.
    Ça change la vie

    Sinon, je constate que tu as la coloration syntaxique, alors que moi non. Quelqu'un pourra expliquer ça (ou faire remonter) ? Yves ?
    Codes de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    program clean_project_list;
    // compiler avec 'fpc clean_project_list'
     
    uses
      Classes, SysUtils; 
     
    procedure log(s: string);
    begin
      WriteLn(s);
    end;
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    program clean_project_list;
    // compiler avec 'fpc clean_project_list'
     
    uses
      Classes, SysUtils; 
     
    procedure log(s: string);
    begin
      WriteLn(s);
    end;
    Et un bug du forum, un !
    EDIT : it's not a bug, it's a feature : on est limité à 100 lignes, au-delà on perd la coloration.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. [AC-2013] combobox - texte entré non dans la liste
    Par stargates01 dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/03/2017, 12h16
  2. Effacer automatiquement la liste des projets récents
    Par Roland Chastain dans le forum EDI
    Réponses: 14
    Dernier message: 18/02/2014, 21h09
  3. Nettoyer la liste des projets récents sous Visual 2008
    Par dede92 dans le forum Visual C++
    Réponses: 2
    Dernier message: 29/01/2011, 19h43
  4. [Visual Studio 2005] Gestion des projets récents
    Par soso78 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 19/05/2008, 15h22
  5. [TP] Nettoyage des fichiers récents
    Par amine6441 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 05/04/2007, 18h03

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