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 :

Exécution d'un programme à partir d'une application Lazarus [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Exécution d'un programme à partir d'une application Lazarus
    Bonjour à toutes et à tous,

    Dans une application que je développe, je lance un visualisateur de fichier PDF pour afficher un PDF en cours de création. Là où ça se complique, c'est que je demande deux choses :

    Je souhaite lancer le visualisateur par défaut, c'est-à-dire que je ne veux pas m'embêter à savoir où il se trouve. La fonction "OpenDocument" fait ça très bien (Windows et Linux), mais avec elle, je ne peux pas (ou ne sais pas) bloquer mon programme tant que le visualisateur n'est pas fermé, ce qui est ma deuxième demande.

    D'un autre côté, le composant "TProcess" demande à savoir où se trouve le visualisateur à lancer, mais, grâce à son option "poWaitOnExit" ou sa propriété "Running", il permet d'attendre que le visualisateur soit fermé pour reprendre la main dans mon application. NOTA : toutefois, cette option et cette propriété ne sont pas fonctionnelles sous Linux (Ubuntu chez moi).

    Quelle expérience avez-vous de cela ?

    En picorant dans la fonction "OpenDocument", j'ai trouvé les commandes qui permettent de savoir où est le visualisateur par défaut pour Linux. Je n'ai pas compris sous Windows, la fonction renvoie sur "ShellExecuteW" qui, a priori ne permet pas de savoir si le programme est en cours où non.

    Pour résumer, je cherche comment faire pour lancer un visualisateur de fichiers PDF avec les trois particularités suivants :

    • Je ne veux pas savoir où sont les visualisateurs
    • Je ne veux pas pouvoir reprendre la main dans mon application tant que le visualisateur n'est pas fermé.
    • Il faut que ça fonctionne sous Windows et Linux.

    J'espère que ce que je viens de raconter est assez clair.

    Cordialement.

    Pierre.

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !

    Citation Envoyé par ChPr Voir le message
    Je souhaite lancer le visualisateur par défaut, c'est-à-dire que je ne veux pas m'embêter à savoir où il se trouve. La fonction "OpenDocument" fait ça très bien (Windows et Linux), mais avec elle, je ne peux pas (ou ne sais pas) bloquer mon programme tant que le visualisateur n'est pas fermé, ce qui est ma deuxième demande.
    Si je devais faire ça, je partirais de la fiche principale avec un bouton qui lancerait une fiche secondaire contenant le visualisateur et masquant la fiche principale, qui serait réaffichée à la fermeture de la fiche secondaire.
    Avec du Form.Hide et du Form.Show tu devrais t'en sortir.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Jipété Voir le message
    .. je partirais de la fiche principale avec un bouton qui lancerait une fiche secondaire contenant le visualisateur ...
    Merci pour cette proposition, mais le visualisateur n'est pas interne à mon application, c'est un programme du genre "PDF-Viewer" ... ou le navigateur par défaut si on n'a pas d'application visualisateur de PDF.

    Cordialement.

    Pierre.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Bon, j'ai partiellement résolu mon problème pour la partie Windows avec le petit bout de programme suivant :

    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, process, Forms, Controls, Graphics, Dialogs, StdCtrls, ShellAPI;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Process1: TProcess;
        procedure Button1Click(Sender: TObject);
      private
        ws: WideString;
        xx: array[0..255] of WideChar;
        Fch, pgm: String;
        i: Integer;
      public
     
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    {$IFDEF WINDOWS}
      Fch:= 'E:\Lazarus\Projets_ChP\Facturation\Factures\Facture_12_28-10-2023.pdf';
      ws:= UTF8Decode(Fch);
      FindExecutableW(PWideChar(ws), nil, xx);
      pgm:= UTF8ToString(xx);
      Process1.CommandLine:= pgm + ' ' + Fch;
    {$ENDIF}
    {$IFDEF UNIX}
        Process1.CommandLine:= 'xdg-open '+'/media/Data/Lazarus/Projets_ChP/Facturation/Factures/Facture_12_28-10-2023.pdf';
    {$ENDIF}
      Process1.Execute;
      while Process1.Running do // Boucle a utiliser si pas l'option poWaitOnExit
      begin
        Sleep(100);
        Inc(i);
        Edit1.Text:= IntToStr(i);
        Application.ProcessMessages;
      end;
      Edit1.Text:= 'Terminé';
      Application.ProcessMessages;
    end;
     
    end.
    En farfouillant ... j'ai trouvé l'instruction "FindExecutableW" qui renvoie le nom et le chemin de l'exécutable qui correspond à une extension donnée. J'injecte donc ce nom et chemin dans la "CommandLine" du "TProcess" et ça fonctionne.

    Mon petit programme devrait fonctionner sous Linux si l'option "poWaitOnExit" ou la propriété "Running" voulait bien fonctionner. Chez vous, cette option ou cette propriété fonctionne-t-elle sous Linux ?

    Cordialement.

    Pierre.

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !

    Citation Envoyé par ChPr Voir le message
    Merci pour cette proposition, mais le visualisateur n'est pas interne à mon application, c'est un programme du genre "PDF-Viewer" ... ou le navigateur par défaut si on n'a pas d'application visualisateur de PDF.
    Et ça change quoi ?
    Pour utiliser ton visualisateur externe, tu utilises un bouton (ou similaire) pour l'appeler, hé bien sur la ligne suivante de la procédure tu rajoutes une ligne où tu fais ce que j'ai suggéré.

    Citation Envoyé par ChPr Voir le message
    Mon petit programme devrait fonctionner sous Linux si l'option "poWaitOnExit" ou la propriété "Running" voulait bien fonctionner. Chez vous, cette option ou cette propriété fonctionne-t-elle sous Linux ?
    Ben chez moi oui, exemple, voilà comment je l'utilise avec un TProcess pour la mise à jour de l'horloge de la machine dans une Debian 11.8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      AProcess := TProcess.Create(nil);
      with aProcess do 
      begin
        Executable := 'timedatectl';
        Parameters.Add('--adjust-system-clock');
        Parameters.Add('set-time');
        Parameters.Add(aDate); // hh:mm:ss
        Options := Options + [poWaitOnExit, poUsePipes]; // déjà dans les options de l'unité process mais je crois que c'est nécessaire ici
        Execute; // bloquant
        Free;
      end;
    Mais attention, il me semble bien avoir eu des soucis avec la façon de lui passer des paramètres, alors fais comme moi, l'exécutable c'est une chose (une string), les paramètres c'est autre(s) chose(s), autant de lignes que de params.

    (je n'ai quasiment pas regardé ton code)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ...Pour utiliser ton visualisateur externe, tu utilises un bouton (ou similaire) pour l'appeler, hé bien sur la ligne suivante de la procédure tu rajoutes une ligne où tu fais ce que j'ai suggéré. ...
    J'avais compris que le fenêtre de masquage contenait le visualisateur. Bon ce n'est qu'une fenêtre de masquage.

    Deux cas :

    • La fenêtre de masquage est fermable. Dans ce cas, rien ne m'empêche de la fermer avanr de fermer le visualisatuer découvrant ainsi mon application -> pas bon.
    • La fenêtre de masquage n'est pas fermable : c'est tout bon, mais quand je vais fermer le visualisateur, qui va fermer le fenêtre de masquage sachant que "OpenDocument" ne renvoie aucune donnée permettant de savoir que le visualisateur est fermé et donc de fermer la fenêtre de masquage-> pas bon.

    Citation Envoyé par Jipété Voir le message
    ... Ben chez moi oui, exemple, voilà comment je l'utilise avec un TProcess pour la mise à jour de l'horloge de la machine dans une Debian 11.8 : ...
    Mais attention, il me semble bien avoir eu des soucis avec la façon de lui passer des paramètres, alors fais comme moi, l'exécutable c'est une chose (une string), les paramètres c'est autre(s) chose(s), autant de lignes que de params. ...
    J'ai essayé tout un tas de combinaison entre "executable", "parameters", "commandLine" ... rien n'y fait.

    Cordialement.

    Pierre.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/05/2010, 15h54
  2. Réponses: 1
    Dernier message: 27/11/2008, 16h47
  3. Réponses: 5
    Dernier message: 22/05/2008, 14h42

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