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

Lazarus Pascal Discussion :

Récupérer les infos d'une application console


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Récupérer les infos d'une application console
    Bonjour à toutes et à tous,

    Je lance une application "console" à partir d'une application "graphique" via "TProcess".

    L'application console, au fur et à mesure qu'elle se déroule, envoie des informations à l'écran.

    Y a-t-il moyen de récupérer ces informations et de les afficher (en temps réel ou presque) via mon application graphique et si oui, comment fait-on ?

    Merci pour vos informations.

    Cordialement.

    Pierre

  2. #2
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci pour ce lien, je vais aller voir ça d'un peu plus près.

    Cordialement.

    Pierre.

  4. #4
    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
    Bonjour ! C'est un problème que j'ai beaucoup étudié : j'ai une collection d'exemples qui fonctionnent. Je les tiens à votre disposition. (Je suppose que c'est sous Windows.)

    Cependant il y a deux cas de figure à distinguer : soit on lance une application console avec des paramètres et on se contente de lire tout ce qu'elle renvoie jusqu'à ce qu'elle se ferme d'elle-même ; soit on lance l'application et ensuite on lui envoie des commandes comme on le ferait au clavier depuis l'invite de commandes.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! C'est un problème que j'ai beaucoup étudié : j'ai une collection d'exemples qui fonctionnent. Je les tiens à votre disposition. (Je suppose que c'est sous Windows.)

    Cependant il y a deux cas de figure à distinguer : soit on lance une application console avec des paramètres et on se contente de lire tout ce qu'elle renvoie jusqu'à ce qu'elle se ferme d'elle-même ; soit on lance l'application et ensuite on lui envoie des commandes comme on le ferait au clavier depuis l'invite de commandes.
    J'ai essayé d'implanter les exemples donnés dans le lien que DomDA91 m'a fourni : Je ne récupère rien d'évident et ça plante (fige) mon programme à la fin de l'application console.

    Je souhaite simplement récupérer, mais au fur et à mesure qu'elles apparaissent les infos que l'appli console envoie à l'écran dont voici un exemple.Nom : Info_Mobat.jpg
Affichages : 794
Taille : 26,7 Ko

    Je n'ai réussi qu'à obtenir la première ligne ..

    Cordialement.

    Pierre

  6. #6
    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
    Citation Envoyé par ChPr Voir le message
    J'ai essayé d'implanter les exemples donnés dans le lien que DomDA91 m'a fourni : Je ne récupère rien d'évident et ça plante (fige) mon programme à la fin de l'application console.
    Attention, il est bien précisé dans le document en question que le premier exemple ne convient pas pour une grande quantité de données. Dans votre cas il faut donc plutôt utiliser cet exemple-ci :

    http://wiki.lazarus.freepascal.org/E...g_large_output

    Si ça ne fonctionne toujours pas je vous proposerai un code que j'ai testé. Le temps que je fouille dans mes tiroirs...
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    peux-tu donner quelques précisions concernant ton programme ?
    programme que sous windows ?
    en mode graphique ? Affichage de la sortie console dans un TMemo par exemple ? ou console ?
    gestion de la sortie erreur ?
    Le programme lancé génère-t-il des accents ?

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Jette un œil dans les sources de FPCUpDeluxe notamment l'unité processutils.pas
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    voici un exemple d'utilisation de la classe TProcessEx qui se trouve dans l'unité processutils proposée par BeanzMaster
    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
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      LConvEncoding,Processutils;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Bt_Go: TButton;
        Bt_GoEx: TButton;
        MemConsole: TMemo;
        procedure Bt_GoExClick(Sender: TObject);
      private
     
      public
        procedure ProcessOutput(Sender:TProcessEx; output:string);
        procedure ProcessError(Sender:TProcessEx; {%H-}IsException:boolean);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Bt_GoExClick(Sender: TObject);
    var Proc: TProcessEx;
    begin
       try
       Proc := TProcessEx.Create(nil);
       Proc.Executable := 'cmd.exe';
       Proc.Parameters.Add('/C');
       Proc.Parameters.Add('ping.exe 127.0.0.1');
       Proc.OnErrorM:=@(ProcessError);
       Proc.OnOutputM:=@(ProcessOutput);
       Proc.Execute();
       finally
         Proc.Free;
       end;
     
    end;
     
    procedure TForm1.ProcessError(Sender: TProcessEx; IsException: boolean);
    begin
       MemConsole.Lines.Append('Erreur ! ' + Sender.ExceptionInfo);
    end;
     
    procedure TForm1.ProcessOutput(Sender: TProcessEx; output : String);
    begin
      //    Quand il n'y a pas de problème d'accent
      //    MemConsole.Lines.Append(output);
      //    sinon conversion de chaîne
      MemConsole.Lines.Append(ConvertEncoding(output,EncodingCP850, EncodingUTF8));
    end;
     
    end.
    et voici ce que cela donne :
    Nom : TProcessEx-Form1.png
Affichages : 710
Taille : 15,5 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    peux-tu donner quelques précisions concernant ton programme ?
    programme que sous windows ? Si ça fonctionne sous Windows, ce sera déjà pas mal
    en mode graphique ? Oui
    Affichage de la sortie console dans un TMemo par exemple ? ou console ? Dans un TMemo
    gestion de la sortie erreur ? Non dans un premier temps
    Le programme lancé génère-t-il des accents ? Apparemment pas

    Ami calmant, J.P
    Cordialement.

    Pierre

  11. #11
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    voici un exemple d'utilisation de la classe TProcessEx qui se trouve dans l'unité processutils proposée par BeanzMaster
    .....
    Ami calmant, J.P
    Je viens d'essayer ce code et, tel quel, cela fonctionne sauf que, n'ayant pas trouvé la constante "EncodingCP850", je n'ai pas pu gérer les accents. Ce n'est pas grave dans le sens où l'application console que veux exécuter n'en possède pas.

    J'ai remplacé "cmd.exe" par mon application console et cela a parfaitement fonctionné sauf qu'à la fin, je peux pas fermer mon application graphique !

    J'ai introduit un Proc.Terminate(0) avant le Proc.Free, mais cela n'a rien fait.

    Une idée de ce qu'il faudrait faire ?

    Cordialement.

    Pierre

  12. #12
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je viens d'essayer ce code et, tel quel, cela fonctionne sauf que, n'ayant pas trouvé la constante "EncodingCP850", je n'ai pas pu gérer les accents. Ce n'est pas grave dans le sens où l'application console que veux exécuter n'en possède pas.
    Quelle version de Lazarus utilises tu ?

    EncodingCP850 est une constante définie dans l'unité LConvEncoding

    Citation Envoyé par ChPr Voir le message
    J'ai remplacé "cmd.exe" par mon application console et cela a parfaitement fonctionné sauf qu'à la fin, je peux pas fermer mon application graphique !
    J'ai introduit un Proc.Terminate(0) avant le Proc.Free, mais cela n'a rien fait.

    Une idée de ce qu'il faudrait faire ?

    Cordialement.

    Pierre
    Est-ce que ton application console est toujours exécutée,lorsque tu veux fermer ton application graphique ? attend-t-elle une réponse de ta part (genre appuyer sur une touche par exemple), ou simplement elle n'a pas fini d'exécuter ces taches ?
    Si oui, ne cherches pas plus loin. Tu ne peux pas quitter ton application graphique tant que ton application console est en fonctionnement.


    EDIT : La solution est simplement de passer la variable Proc : TProcessEx dans la partie public de ta "Form" et de faire Proc.Terminate(0) ça fonctionne chez moi.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #13
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,

    J'ai remplacé "cmd.exe" par mon application console et cela a parfaitement fonctionné sauf qu'à la fin, je peux pas fermer mon application graphique !
    Le souci c'est que ton application mobat2jnx est du genre interactive. C'est à dire qu'elle peut être en attente d'un appui de touche. Dans ce cas tu restes dans le Proc.Execute et le processus n'est pas terminé. Pour t'en rendre compte, faire un point d'arrêt sur le Proc.free.
    Si tout se passe bien dans l'exécution de l'application, en ajoutant l'option -noread à la fin de ta ligne de commande, cela devrait terminer ton processus.
    Usage is mobat2jnx <directory> <<maxtiles>|-sas|-trimnn|-jnxscalexxx.xx|-jpegn|-bounds(n,w,s,e)
    -copyjpeg> <-noread> <-tilelist>
    -noread removes the 'readline' at the end of successful execution
    donc mettre un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Proc.Parameters.Add('-noread');
    Par contre si la commande se passe mal ou si tu lances mobat2jnx tout seul(qui affiche Hit ENTER to exit) cela va coincer.
    Pour t'en sortir dans ces cas-là, il faut envoyer un CRLF sur le canal d'entrée du processus.
    Pour faire cela :
    1 - Définir Proc dans une variable globale.
    2 - L'initialiser à Nil dans le Create de la Form.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Proc :=  Nil;
    end;
    3 - Dans l'événement OnKeyPress du TMemo mettre un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.MemConsoleKeyPress(Sender: TObject; var Key: char);
    begin
      if Proc <> nil then
      begin
      Proc.Input.WriteAnsiString(#13#10);
      end;
    end;
    et rajouter un Proc := Nil derrière le Proc.Free :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     finally
         Proc.Free;
         Proc := nil;
       end;
    Comme cela, quand le programme est bloqué par une attente de touche, il suffit de taper sur une touche dans le TMemo pour continuer (il faut que le memo ait le focus à ce moment là).
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Quelle version de Lazarus utilises tu ?

    EncodingCP850 est une constante définie dans l'unité LConvEncoding ...
    J'utilise la version 1.2.4 et la constante EncodingCP850 n'existe pas dans mon unité LConvEncoding

    Citation Envoyé par BeanzMaster Voir le message
    ...Est-ce que ton application console est toujours exécutée,lorsque tu veux fermer ton application graphique ? attend-t-elle une réponse de ta part (genre appuyer sur une touche par exemple), ou simplement elle n'a pas fini d'exécuter ces taches ?
    Si oui, ne cherches pas plus loin. Tu ne peux pas quitter ton application graphique tant que ton application console est en fonctionnement. ...
    Ce qui m'avait fait dire que l'application console n'attendait rien est que lorsque je la lançais via cmd, il suffisait que je ferme l'écran console pour que cela s'arrête. Je ne sais donc pas quel est le critère qui me dit si oui ou non l'application console est toujours en exécution.

    Avec l'application graphique que vous m'avez donnée, à la fin du traitement de l'application console, le pointeur graphique est toujours le sablier, je suppose donc que cela indique qu'elle est toujours active.

    Citation Envoyé par BeanzMaster Voir le message
    ... EDIT : La solution est simplement de passer la variable Proc : TProcessEx dans la partie public de ta "Form" et de faire Proc.Terminate(0) ça fonctionne chez moi.
    C'est ce que j'avais essayé et qui ne fonctionne pas.

    Cordialement.

    Pierre

  15. #15
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    ... Si tout se passe bien dans l'exécution de l'application, en ajoutant l'option -noread à la fin de ta ligne de commande, cela devrait terminer ton processus. ...
    C'est la commande qu'il fallait dont je n'avais pas compris l'utilisation.

    Je vais regarder les autres solutions que tu me proposes.

    Je vous remercie tous pour votre aide.

    Cordialement.

    Pierre.

  16. #16
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par jurassic pork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.ProcessOutput(Sender: TProcessEx; output : String); 
    begin
      //    Quand il n'y a pas de problème d'accent
      //    MemConsole.Lines.Append(output);
      //    sinon conversion de chaîne
      MemConsole.Lines.Append(ConvertEncoding(output,EncodingCP850, EncodingUTF8));
    end
    Ne vaudrait-il pas mieux utiliser la fonction ConsoleToUtf8 de l'unité LazUtf8 au lieu de ConvertEncoding( .. , EncodingCP850, ...) qui elle choisira la page de code OEM appropriée selon la configuration linguistique courante du système :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Uses LazUtf8;
    ...
    procedure TForm1.ProcessOutput(Sender: TProcessEx; output: string);
    begin
       //    Quand il n'y a pas de problème d'accent
       //    MemConsole.Lines.Append(output);
       //    sinon conversion de chaîne
       MemConsole.Lines.Append(ConsoleToUtf8(output));
    end;

  17. #17
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par DomDA91 Voir le message
    Ne vaudrait-il pas mieux utiliser la fonction ConsoleToUtf8 de l'unité LazUtf8 au lieu de ConvertEncoding( .. , EncodingCP850, ...) qui elle choisira la page de code OEM appropriée selon la configuration linguistique courante du système : ...
    Je viens d'essayer, et effectivement, cela fonctionne parfaitement.

    Cordialement.

    Pierre

  18. #18
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    je viens d'essayer TprocessEx sous linux, cela fonctionne aussi.
    Par rapport à mon ancien code j'ai apporté deux améliorations :
    1 - A chaque fois que l'application lancée affichait un bloc de données, il y avait un retour à la ligne de rajouter par mon code d'affichage. J'ai donc remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemConsole.Lines.Append(ConsoleToUtf8(output));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MemConsole.Lines.Text := MemConsole.Lines.Text + ConsoleToUtf8(output);
    Si quelqu'un peut m'expliquer pourquoi j'ai une erreur de compilation unit1.pas(107,36) Error: Variable identifier expected
    avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MemConsole.Lines.Text +=  output;
    2 - Pour avoir toujours affiché le dernier texte envoyé j'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      MemConsole.SelStart := Length(MemConsole.Lines.Text)-1;
      MemConsole.SelLength:=0;
    De plus sous Lubuntu le texte dans un terminal est déjà en UTF8.

    Donc voici le code pour afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ProcessOutput(Sender: TProcessEx; output : string);
    begin
      MemConsole.Lines.Text :=  MemConsole.Lines.Text + output;
      //MemConsole.Lines.Text := MemConsole.Lines.Text + ConsoleToUtf8(output);  
      // pour scroll automatique
      MemConsole.SelStart := Length(MemConsole.Lines.Text)-1;
      MemConsole.SelLength:=0;
    end;
    avec ce code :
    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
    procedure TForm1.Bt_GoExClick(Sender: TObject);
    begin
       try
       Proc := TProcessEx.Create(nil);
       Proc.Executable := '/bin/ping';
       Proc.Parameters.Add('-i 0.5');
       Proc.Parameters.Add('-c 5');
       Proc.Parameters.Add('127.0.0.1');
       Proc.OnErrorM:=@(ProcessError);
       Proc.OnOutputM:=@(ProcessOutput);
       Proc.Execute();
       Proc.Executable := '/bin/bash';
       Proc.Parameters.Clear;
       Proc.Parameters.Add('-c');
       Proc.Parameters.Add('echo éêùèçà');
       Proc.Execute();
       finally
         Proc.Free;
         Proc := nil;
       end;
    end;
    j'obtiens ceci sous Lubuntu 16.04 64 bits Lazarus 1.8.2 :
    Nom : LazConsoleLubuntu.png
Affichages : 706
Taille : 33,2 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Si quelqu'un peut m'expliquer pourquoi j'ai une erreur de compilation unit1.pas(107,36) Error: Variable identifier expected
    avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MemConsole.Lines.Text +=  output;
    Parce que Lazarus ne supporte pas la syntaxe C ?

    J'ai essayé chez moi c'est pareil, j'ai essayé en rajoutant ":" (memo1.Lines.Text +:= output;) c'est pire : 3 lignes d'erreur au lieu d'une
    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

  20. #20
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    en version 1.8.x l'option Opérateur de style C (*=, +=, /= et -=) (-Sc, {$COPERATORS ON}) est coché par défaut et d'ailleurs

    le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var  str1,str2 : string;
    begin
      str1 := 'hello ';
      str2 := 'world';   
      str1 += str2;
    ne produit pas d'erreurs de compilation et fonctionne
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. récupérer des infos sur une application en cours d'exécution
    Par r0d dans le forum Administration système
    Réponses: 5
    Dernier message: 31/01/2008, 15h59
  2. Réponses: 3
    Dernier message: 23/05/2007, 23h52
  3. Récupérer les infos d'une colonne de type DataSet
    Par Zugg dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/02/2006, 14h46
  4. [C#] - Récupérer les paramètres passés à une application
    Par linuxludo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/11/2005, 14h41
  5. Les caractères dans une application console
    Par maximedrouet dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2005, 16h44

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