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

Free Pascal Discussion :

Mise en forme automatique d'un commentaire


Sujet :

Free Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut Mise en forme automatique d'un commentaire
    Bonjour ! Pour animer un peu le forum Pascal en cette deuxième quinzaine d'août, je vous propose une discussion autour du sujet suivant : mise en forme automatique d'un bloc de commentaire devant servir d'en-tête à un code source en Pascal.

    Il s'agirait donc de proposer un programme qui permette de fabriquer aisément de beaux blocs de commentaire, comme ceux qu'on met en tête des codes source. Ou s'il y a des outils existants que vous utilisez, je serais content de les connaître.

    Voici celui que je viens de faire.

    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
    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
    99
    100
     
    program CommentFormatter;
     
    (* Pascal Comment Formatter *)
     
    {$APPTYPE CONSOLE}
    {$MODE DELPHI}
     
    uses
      SysUtils;
     
    const
      L = 80;
     
    var
      cmt: string;
     
    procedure Add(s: string);
    var
      i: integer;
    begin
      if s = '' then
        cmt := Concat(
          cmt,
          '(',
          StringOfChar('*', L - 2),
          ')',
          Chr(13),
          Chr(10)
        )
      else
      begin
        while Length(s) > L - 6 do
        begin
          i := L - 6;
          while (i > 1) and (s[i] <> ' ') do
            Dec(i);
     
          if i = 1 then
          begin
            i := L - 6;
            cmt := Concat(
              cmt,
              '(* ',
              Copy(s, 1, i),
              ' *)',
              Chr(13),
              Chr(10)
            );
            Delete(s, 1, i);
          end else
          begin
            cmt := Concat(
              cmt,
              '(* ',
              Copy(s, 1, i),
              StringOfChar(' ', L - 5 - i),
              '*)',
              Chr(13),
              Chr(10)
            );
            Delete(s, 1, i);
          end;
        end;
     
        cmt := Concat(
          cmt,
          '(* ',
          s,
          ' ',
          StringOfChar(' ', L - 6 - Length(s)),
          '*)',
          Chr(13),
          Chr(10)
        );
      end;
    end;
     
    // http://www.freepascal.org/docs-html/prog/progsu41.html
     
    begin
      Assign(output, 'cmt.pas');
      Rewrite(output);
     
      Add('');
      Add('Programme : Pascal Comment Formatter');
      Add('Description : Mise en forme automatique d''un bloc de commentaire');
      Add('Date modification commentaire : ' + DateTimeToStr(Now));
      Add('Date compilation : ' + {$I %DATE%} + ' ' + {$I %TIME%});
      Add('Compilateur : Free Pascal ' + {$I %FPCVERSION%});
      Add('OS : ' + GetEnvironmentVariable('OS'));
      Add('FPC Target OS : ' + {$I %FPCTARGETOS%});
      Add('EssaiChaineLongueSansEspaceEssaiChaineLongueSansEspaceEssaiChaineLongueSansEspace');
      Add('Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace');
      Add('');
     
      WriteLn(output, cmt);
      Close(output);
      Assign(output, '');
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (******************************************************************************)
    (* Programme : Pascal Comment Formatter                                       *)
    (* Description : Mise en forme automatique d'un bloc de commentaire           *)
    (* Date modification commentaire : 18/08/2014 22:47:03                        *)
    (* Date compilation : 2014/08/18 22:34:25                                     *)
    (* Compilateur : Free Pascal 2.6.4                                            *)
    (* OS : Windows_NT                                                            *)
    (* FPC Target OS : Win32                                                      *)
    (* EssaiChaineLongueSansEspaceEssaiChaineLongueSansEspaceEssaiChaineLongueSan *)
    (* sEspace                                                                    *)
    (* Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace Essai      *)
    (* Chaine Longue Avec Espace                                                  *)
    (******************************************************************************)
    P.-S. En travaillant sur cet exercice, j'ai découvert l'emploi qu'on pouvait faire de la directive {$I} pour accéder aux variables d'environnement. Je joins un exemple plus complet.

    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
     
    program Variables;
     
    // http://www.freepascal.org/docs-html/prog/progsu41.html
     
    begin
      WriteLn({$I %DATE%});
      // Inserts the current date.
      WriteLn({$I %FPCTARGETCPU%});
      // Inserts the target CPU name.
      WriteLn({$I %FPCTARGETOS%});
      // Inserts the target OS name.
      WriteLn({$I %FPCVERSION%});
      // Current compiler version number.
      WriteLn({$I %FILE%});
      // Filename in which the directive is found.
      WriteLn({$I %LINE%});
      // Line number on which the directive is found.
      WriteLn({$I %TIME%});
     
      WriteLn({$I %COMSPEC%});
      WriteLn({$I %OS%});
      WriteLn({$I %PCBRAND%});
      WriteLn({$I %PROCESSOR_ARCHITECTURE%});
      WriteLn({$I %USERNAME%});
      WriteLn({$I %WINDIR%});
     
      WriteLn({$I %LUA_DEV%});
      WriteLn({$I %LUA_PATH%});
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Voici une autre proposition. Je ne mets pas le code parce que c'est pratiquement le même.

    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
    ////////////////////////////////////////////////////////////////////////////////
    // Programme : Pascal Comment Formatter ////////////////////////////////////////
    // Nom du fichier : CommentFormatter2.pas //////////////////////////////////////
    // Description : Mise en forme automatique d'un bloc de commentaire ////////////
    // Date modification commentaire : 19/08/2014 12:37:30 /////////////////////////
    // Date compilation : 2014/08/19 12:37:24 //////////////////////////////////////
    // Compilateur : Free Pascal 2.6.4 /////////////////////////////////////////////
    // OS : Windows_NT /////////////////////////////////////////////////////////////
    // OS : Windows_NT /////////////////////////////////////////////////////////////
    // FPC Target OS : Win32 ///////////////////////////////////////////////////////
    // EssaiChaineLongueSansEspaceEssaiChaineLongueSansEspaceEssaiChaineLongueSan //
    // sEspace /////////////////////////////////////////////////////////////////////
    // Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace Essai  //////
    // Chaine Longue Avec Espace ///////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////
    Chemin faisant, j'ai rencontré une difficulté : lorsque je mets un accent dans un commentaire, la ligne dans le fichier produit est plus courte d'un caractère, comme si le compilateur surestimait la longueur de la chaîne. Cependant l'accent s'affiche correctement. Je ne vois pas comment corriger ce comportement.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    J'espérais que mon sujet aurait plus de succès.

    J'ai retravaillé mon programme, en y introduisant des macros.

    Je n'ai pas résolu le problème de la longueur des chaînes mal évaluée lorsque celles-ci contiennent des caractères accentués.

    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
    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
    99
    100
    101
    102
     
    program CommentFormatter3;
     
    (* Pascal Comment Formatter *)
     
    {$APPTYPE CONSOLE}
    {$MODE DELPHI}
    {$MACRO ON}
     
    uses
      SysUtils;
     
    {$DEFINE SPACE:=#32}
    {$DEFINE EOL:=#13#10}
     
    const
      L = 80;
     
    var
      cmt: string;
     
    procedure Add(s: string);
    var
      i: integer;
     
    begin
      if s = '' then
        cmt := Concat(cmt, '(*', StringOfChar('*', L - 4), '*)', EOL)
      else
      begin
        while Length(s) > L - 6 do
        begin
          i := L - 6;
          while (i > 1) and (s[i] <> ' ') do
            Dec(i);
          if i = 1 then
          begin
            i := L - 6;
            cmt := Concat(cmt, '(*', SPACE, Copy(s, 1, i), SPACE, '*)', EOL);
            Delete(s, 1, i);
          end else
          begin
            cmt := Concat(
              cmt,
              '(*',
              SPACE,
              Copy(s, 1, i - 1),
              StringOfChar(' ', L - 6 - i + 1),
              SPACE,
              '*)',
              EOL
            );
            Delete(s, 1, i);
          end;
        end;
        cmt := Concat(
          cmt,
          '(*',
          SPACE,
          s,
          StringOfChar(' ', L - 6 - Length(s)),
          SPACE,
          '*)',
          EOL
        );
      end;
    end;
     
    (*
      Variables d'environnement :
      http://www.freepascal.org/docs-html/prog/progsu41.html
      Macros :
      http://www.freepascal.org/docs-html/prog/progse5.html
    *)
     
    begin
      Assign(output, 'cmt.pas');
      Rewrite(output);
     
      cmt := '';
     
      Add('');
      Add('Programme : Pascal Comment Formatter');
      Add('Nom du fichier : ' + {$I %FILE%});
      Add('Description : Mise en forme automatique d''un bloc de commentaire');
      Add('Date modification commentaire : ' + DateTimeToStr(Now));
      Add('Date compilation : ' + {$I %DATE%} + ' ' + {$I %TIME%});
      Add('Compilateur : Free Pascal ' + {$I %FPCVERSION%});
      Add('Compilateur : Free Pascal ' + IntToStr(FPC_VERSION));
      Add('Compilateur : Free Pascal ' + IntToStr(FPC_FULLVERSION));
      Add('OS : ' + GetEnvironmentVariable('OS'));
      Add('OS : ' + {$I %OS%});
      Add('FPC Target OS : ' + {$I %FPCTARGETOS%});
      Add('EssaiChaineLongueSansEspaceEssaiChaineLongueSansEspaceEssaiChaineLongueSansEspace');
      Add('Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace');
      Add('Caractères accentués');
      Add('');
     
      WriteLn(output, cmt);
      Close(output);
      Assign(output, '');
    end.
    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
    (******************************************************************************)
    (* Programme : Pascal Comment Formatter                                       *)
    (* Nom du fichier : CommentFormatter3.pas                                     *)
    (* Description : Mise en forme automatique d'un bloc de commentaire           *)
    (* Date modification commentaire : 20/08/2014 22:50:48                        *)
    (* Date compilation : 2014/08/20 22:50:44                                     *)
    (* Compilateur : Free Pascal 2.6.4                                            *)
    (* Compilateur : Free Pascal 2                                                *)
    (* Compilateur : Free Pascal 20604                                            *)
    (* OS : Windows_NT                                                            *)
    (* OS : Windows_NT                                                            *)
    (* FPC Target OS : Win32                                                      *)
    (* EssaiChaineLongueSansEspaceEssaiChaineLongueSansEspaceEssaiChaineLongueSan *)
    (* sEspace                                                                    *)
    (* Essai Chaine Longue Avec Espace Essai Chaine Longue Avec Espace Essai      *)
    (* Chaine Longue Avec Espace                                                  *)
    (* Caractères accentués                                                     *)
    (******************************************************************************)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Je n'ai pas résolu le problème de la longueur des chaînes mal évaluée lorsque celles-ci contiennent des caractères accentués.
    Voici la solution, ou une solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses
      ...
      LazUTF8 in 'C:\Lazarus\components\lazutils\lazutf8.pas';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while UTF8Length(s) > L - 6 do
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmt := Concat(cmt, '(*', SPACE, UTF8Copy(s, 1, i), SPACE, '*)', EOL);
    J'avance tout doucement dans la compréhension de ces histoires d'encodage. Là je suis un peu étonné de devoir utiliser une unité Lazarus. Je croyais que ces fonctions n'étaient requises que lorsque la chaîne provenait de la LCL.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    J'ai ajouté d'autres macros, qui permettent de choisir le style de commentaire (les caractères utilisés).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {-$DEFINE CMT_OPEN:='(*'}
    {-$DEFINE CMT_CLOSE:='*)'}
    {-$DEFINE CMT_FILL:='*'}
    {-$DEFINE CMT_OPEN:='//'}
    {-$DEFINE CMT_CLOSE:='//'}
    {-$DEFINE CMT_FILL:='/'}
    {$DEFINE CMT_OPEN:=#123}
    {$DEFINE CMT_CLOSE:=#125}
    {$DEFINE CMT_FILL:='-'}
    Pour que les chaînes accentuées sortent correctement, j'ai dû choisir l'option "encodage ANSI" dans Notepad++. Le code source encodé en ANSI, les fonctions UTF8... Bon, apparemment ça donne un bon résultat, donc ça doit être la bonne formule.

    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
    {------------------------------------------------------------------------------}
    { Program: Pascal Comment Formatter                                            }
    { File: CommentFormatter5.pas                                                  }
    { Purpose: Helps for writing formatted Pascal comment.                         }
    { Last modification: 24/08/2014 13:34:50                                       }
    { Compilation: 2014/08/24 13:34:46                                             }
    { Compiler: Free Pascal 2.6.4                                                  }
    { Compiler: Free Pascal 2                                                      }
    { Compiler: Free Pascal 20604                                                  }
    { OS: Windows_NT                                                               }
    { OS: Windows_NT                                                               }
    { FPC Target OS: Win32                                                         }
    { LongStringWithoutSpaceCharacterLongStringWithoutSpaceCharacterLongStringWith }
    { outSpaceCharacter                                                            }
    { Long String With Space Characters Long String With Space Characters Long     }
    { String With Space Characters                                                 }
    { LongueChaîneAccentuéeSansEspaceLongueChaîneAccentuéeSansEspaceLongueChaîneAc }
    { centuéeSansEspace                                                            }
    { Longue Chaîne Accentuée Avec Espace Longue Chaîne Accentuée Avec Espace      }
    { Longue Chaîne Accentuée Avec Espace                                          }
    { Caractères accentués                                                         }
    {------------------------------------------------------------------------------}
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 930
    Points : 59 398
    Points
    59 398
    Billets dans le blog
    2
    Par défaut


    Le tout, maintenant, est de faire en sorte que le programme puisse être exécuté au sein de l'éditeur de Free Pascal ! Je ne suis pas sûr que l'ajout d'outils externes soit permis dans cet IDE. Par contre, ce devrait être possible dans l'IDE de Virtual Pascal, qui permet d'ajouter des outils externes et de récupérer le résultat de leur exécution dans l'IDE. Si je trouve du temps, j'essaierai.

    Pour compiler rapido, j'ai réinstallé Free Pascal sur une machine Windows... et j'ai tout de suite retrouvé pourquoi je détestais cet IDE (surtout par rapport à Virtual Pascal).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 930
    Points : 59 398
    Points
    59 398
    Billets dans le blog
    2
    Par défaut
    Voici une version qui crée le bloc de commentaires directement dans le presse-papier de Windows :
    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
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    program CommentFormatter5;
     
    (* Pascal Comment Formatter *)
     
    {$APPTYPE CONSOLE}
    {$MODE DELPHI}
    {$MACRO ON}
     
    uses
      SysUtils,
      Windows,
      Strings,
      LazUTF8 in 'F:\Lazarus\components\lazutils\lazutf8.pas';
     
    {$DEFINE SPACE:=#32}
    {$DEFINE EOL:=#13#10}
    {$DEFINE CMT_OPEN:='(*'}
    {$DEFINE CMT_CLOSE:='*)'}
    {-$DEFINE CMT_FILL:='*'}
    {-$DEFINE CMT_OPEN:='//'}
    {-$DEFINE CMT_CLOSE:='//'}
    {-$DEFINE CMT_FILL:='/'}
    {-$DEFINE CMT_OPEN:=#123}
    {-$DEFINE CMT_CLOSE:=#125}
    {$DEFINE CMT_FILL:='-'}
     
    const
      L = 80;
     
    var
      cmt: string;
      MemAddress: Pointer;
      MemHandle: tHandle;
      ajust: integer;
     
    procedure Add(s: string);
    var
      i: integer;
     
    begin
      if s = '' then
      begin
        ajust := Length(CMT_OPEN + CMT_CLOSE);
     
        cmt := Concat(
          cmt,
          CMT_OPEN,
          StringOfChar(CMT_FILL, L - ajust),
          CMT_CLOSE,
          EOL
        );
      end else
      begin
        ajust := Length(CMT_OPEN + SPACE + SPACE + CMT_CLOSE);
     
        while UTF8Length(s) > L - ajust do
        begin
          i := L - ajust;
          while (i > 1) and (s[i] <> SPACE) do
            Dec(i);
     
          if i = 1 then
          begin
            i := L - ajust;
     
            cmt := Concat(
              cmt,
              CMT_OPEN,
              SPACE,
              UTF8Copy(s, 1, i),
              SPACE,
              CMT_CLOSE,
              EOL
            );
     
            Delete(s, 1, i);
          end else
          begin
            cmt := Concat(
              cmt,
              CMT_OPEN,
              SPACE,
              UTF8Copy(s, 1, i - 1),
              StringOfChar(SPACE, L - ajust - i + 1),
              SPACE,
              CMT_CLOSE,
              EOL
            );
     
            Delete(s, 1, i);
          end;
        end;
     
        cmt := Concat(
          cmt,
          CMT_OPEN,
          SPACE,
          s,
          StringOfChar(SPACE, L - ajust - UTF8Length(s)),
          SPACE,
          CMT_CLOSE,
          EOL
        );
      end;
    end;
     
    (*
      Environment variables:
      http://www.freepascal.org/docs-html/prog/progsu41.html
      Macros:
      http://www.freepascal.org/docs-html/prog/progse5.html
    *)
     
    begin
      cmt := '';
     
      Add('');
      Add('Program: Pascal Comment Formatter');
      Add('File: ' + {$I %FILE%});
      Add('Purpose: Helps for writing formatted Pascal comment.');
      Add('Last modification: ' + DateTimeToStr(Now));
      Add('Compilation: ' + {$I %DATE%} + ' ' + {$I %TIME%});
      Add('Compiler: Free Pascal ' + {$I %FPCVERSION%});
      Add('Compiler: Free Pascal ' + IntToStr(FPC_VERSION));
      Add('Compiler: Free Pascal ' + IntToStr(FPC_FULLVERSION));
      Add('OS: ' + SysUtils.GetEnvironmentVariable('OS'));
      Add('OS: ' + {$I %OS%});
      Add('FPC Target OS: ' + {$I %FPCTARGETOS%});
      Add('LongStringWithoutSpaceCharacterLongStringWithoutSpaceCharacterLongStringWithoutSpaceCharacter');
      Add('Long String With Space Characters Long String With Space Characters Long String With Space Characters');
      Add('LongueCha¯neAccentuÚeSansEspaceLongueCha¯neAccentuÚeSansEspaceLongueCha¯neAccentuÚeSansEspace');
      Add('Longue Cha¯ne AccentuÚe Avec Espace Longue Cha¯ne AccentuÚe Avec Espace Longue Cha¯ne AccentuÚe Avec Espace');
      Add('CaractÞres accentuÚs');
      Add('');
     
      (* Opening the clipboard *)
      if OpenClipboard(0)
         then
           begin
             (* Flushing the clipboard *)
             if EmptyClipboard
                then
                  begin
                    (* Copying text to a global memory block *)
                    MemHandle := GlobalAlloc(0,Length(cmt));
                    if MemHandle <> 0
                       then
                         begin
                           MemAddress := GlobalLock(MemHandle);
                           if MemAddress <> Nil
                              then
                                begin
                                  StrCopy(pChar(MemAddress),pChar(cmt));
                                  GlobalUnlock(MemHandle);
                                  (* Storing the memory block into the clipboard *)
                                  if SetClipboardData(CF_TEXT,MemHandle) = 0
                                     then
                                       WriteLn('Error: Couldn''t store output to clipboard');
                                end
                              else
                                WriteLn('Error: Couldn''t copy output to memory block');
                         end
                       else
                         WriteLn('Error: Couldn''t allocate memory for output');
                  end
                else
                  WriteLn('Error: Couldn''t empty clipboard');
             (* Don't forget to release the clipboard ! *)
             CloseClipboard;
           end
         else
           WriteLn('Error: Couldn''t write output to clipboard');
    end.
    Il n'y a plus qu'à coller.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    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 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Excellent ! Merci Alcatîz.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Ecrire sans mise en forme automatique
    Par TuRn3r dans le forum Mise en forme
    Réponses: 2
    Dernier message: 22/08/2006, 15h45
  2. Réponses: 3
    Dernier message: 23/06/2006, 12h58
  3. Réponses: 8
    Dernier message: 19/06/2006, 17h31
  4. Mise en forme automatique d'un tableau
    Par Gestion dans le forum Access
    Réponses: 2
    Dernier message: 24/03/2006, 23h19
  5. mise en forme automatique du code a 80 colonnes ??
    Par benwa dans le forum JBuilder
    Réponses: 1
    Dernier message: 27/03/2005, 23h43

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