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 :

Programme console et affichage


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut Programme console et affichage
    Bonjour,

    Cela fait très longtemps que je n'ai pas écrit de programme console et explique le classement de ce post dans la catégorie débutant.

    Jusqu'à présent je n'utilisai que les quelques writeln nécessaires lors du déroulement de mes quelques programmes consoles. Hier j'ai voulu en quelque sorte mettre un compteur en place (défilement d'un simple chiffre d'une boucle while not eof do)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FDTable.Open;
    n:=0;
    writeln('nombre d'enregistrement : '+fdtable.recordcount.tostring;
    While not FDTable.EOF 
     do begin
       //  traitement
       ....
       if n>0 then for i:=1 to length(n.tostring) do write(#8); // retour au début de ligne  
       inc(n);
       write(n.tostring); // le but est ici d'afficher le compteur
       next;
     end;
    FDTable.Close;
    writeln(' ');
    c'est le retour de ligne que je trouve un peu inélégant. (pressé j'ai fait avec)
    J'ai tenté, sans succès, d'utiliser la séquence escape <Esc>[10D, mais, je pense que c'est dû au type de string de version unicode je n'arrive pas à coder ce truc !

    une idée ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour SergioMaster

    avec un on revient direct en début de ligne
    Après je sais pas si c'est bien le résultat que vous voulez

    cela doit donner 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
    FDTable.Open;
    n:=0;
    writeln('nombre d''enregistrement : ' , fdtable.recordcount);
    While not FDTable.EOF 
     do begin
       //  traitement
       ....
       write(#13); // retour au début de ligne  
       inc(n);
       write(n); // le but est ici d'afficher le compteur
       next;
     end;
    FDTable.Close;
    writeln(' ');

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Après pour pousser plus loin un bon vieux GotoXY
    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
    uses
      System.SysUtils,windows;
    var
      i : integer;
      StdHandle: THandle;
     
    procedure GotoXY(x, y: Integer);
    var
      CursorCoord: _COORD;
    begin
      CursorCoord.x := x;
      CursorCoord.y := y;
      SetConsoleCursorPosition(StdHandle, CursorCoord);
    end;
     
    begin
      try
        StdHandle := GetStdHandle(STD_OUTPUT_HANDLE);
        for i := 1000 downto 0 do
        begin
          GotoXY(0,0);
          write(i , ' ');
          sleep(100);
        end;
        readln;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    #13 c'est parfait et tellement plus simple je n'étais pas tomber dessus durant mes (mauvaises) recherches
    et non merci, pas de gotoXY, restons en au plus simple

    si même je pouvais combiner en un seul write ce serait parfait

    [Edit]
    un petit test rapide et c'est le cas
    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
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils;
     
    var i : integer;
    begin
      try
        writeln('debut');
        for I := 0 to 1200 do
          begin
            write(#13+i.ToString);
            sleep(100);
          end;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    Merci
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    pourquoi utilise tu write plutôt que writeln ... qui lui inclus un retour a la ligne ???
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par anapurna Voir le message
    pourquoi utilise tu write plutôt que writeln ... qui lui inclus un retour a la ligne ???
    parce que writeln passe à la ligne suivante contrairement à write et que je voulais avoir une numérotation sur une seule ligne et non un affichage
    1
    2
    3
    4
    5
    ....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    il me manque des infos ... write(#13) revient a écrire writeln()
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    bonjour,

    Citation Envoyé par anapurna
    il me manque des infos ...
    teste le petit programme que j'ai mis en #4 qui a le comportement que je veux
    et tu y verras la différence entre writeln et write

    pour moi writeln fait un line feed en plus d'un carriage return (je ne sais si c'est CR+LF ou LF+CR, mais j'opte plutôt pour la première) or je ne veux pas du line feed
    à mon avis cela dépend aussi du fichier de sortie , dans mon cas l'écran, et du LineBreakStyle (qui dépend aussi de l'OS )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    la séquence pour faire un writeln
    c'est write (#13#10);
    correspondant donc à un CR + LF
    voir la table ascii

  10. #10
    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 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Amusant l'idée du caractère #13. Attention quand même au fait que la ligne ne sera pas effacée. Mais je suppose que dans le cas présent ce n'est pas gênant (le nombre à afficher étant toujours croissant si j'ai bien compris).

    Autrement, on pourrait aussi utiliser, par exemple, l'unité Console de Rudy Velthuis.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Citation Envoyé par Roland Chastain Voir le message
    Attention quand même au fait que la ligne ne sera pas effacée.
    c'est pour cela qu'au départ je m'étais obstiné sur le backspace mais je trouvai la boucle inélégante et n'arrivais pas à le faire par séquence escape

    NB. je pense que maintenant, non pressé par le temps, la séquence escape pourrait de programmer ainsi write(#27+Format('[%dD',length(n.tostring)]));
    Mais je suppose que dans le cas présent ce n'est pas gênant (le nombre à afficher étant toujours croissant si j'ai bien compris).
    tu as bien compris, il s'agit juste d'un contrôle de progression (j'aurais pu mettre quelque chose de plus sophistiqué comme par exemple un pourcentage de progression mais cela n'en valait pas la peine.

    Autrement, on pourrait aussi utiliser, par exemple, l'unité Console de Rudy Velthuis.
    je l'avais vu mais une fois de plus, l'ajout de cette unité n'en valait pas la peine
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/08/2009, 15h20
  2. aide sur la compilation d'un programme console
    Par angelo2 dans le forum MFC
    Réponses: 6
    Dernier message: 18/10/2005, 07h44
  3. DELPHI6, Programme console et code de retour
    Par Desraux dans le forum Débuter
    Réponses: 2
    Dernier message: 21/07/2005, 08h15
  4. [Debutant] execution d'un programme console
    Par benahpets dans le forum MFC
    Réponses: 8
    Dernier message: 19/05/2005, 00h19

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