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

Langage Delphi Discussion :

[TPrinters] détecter annulation/erreur impression


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut [TPrinters] détecter annulation/erreur impression
    Title : [TPrinters] détecter annulation/erreur impression


    Bonjour et Joyeuse Année au forum et à tous ses membres !

    Voici ma question : j'ai une appli qui imprime quelques lignes et en même temps, elle doit stocker directo dans un fichier texte toutes ces infos printées.

    Jusque là, rien de compliqué et ça tourne impec.

    Mais, je me suis rendu compte d'un cas de figure qui peut très bien arriver :

    Si jamais l'utilisateur lance l'impression et que par exemple l'imprimante n'est pas allumée, hé bien j'ai en effet du pilote de la printeuse un message d'alerte et bien entendu rien ne s'imprime...

    Or c'est là le noeud du problème, car si rien ne s'imprime, au contraire l'enregistrement des quelques lignes prévues d'être imprimées sont quant à elle bien imprimées.

    Autrement dit : lorsqu'ensuite l'utilisateur allume son imprimante et recommence l'impression, devinez...

    Hé oui, cela ensuite dans le fichier texte représente deux fois la même chose, présentement cela n'est pas acceptable.

    Je me suis documenté sur la classe TPrinters, mais rien de trop significatif quant aux résultats.

    J'ai commencé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    if Printer.Aborted then
      MessageDlg('Le travail d''impression n''a pas terminé l''impression', mtInformation, [mbOK], 0);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if Printer.Printing = true then
         ShowMessage('OK !')
             else
         ShowMessage('NO !!!');
    Je pensais au travers du F1 avoir enfin trouvé une parade :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key=VK_ESCAPE) and Printer.Printing then
      begin
        Printer.Abort;
        MessageDlg('Impression annulée', mtInformation, [mbOK],0);
       end;
    end;
    Mais manque de chance, bien que cela stoppe le printage au tout début, je ne sais pas comment faire pour récupérer une variable ou autre afin de m'en servir utilement.

    Autrement dit : comment faire pour récupérer le message d'erreur du pilote de l'imprimante afin d'ensuite s'en servir... ?

    A vrai dire, je ne sais pas trop comment m'y prendre et vers la bonne direction et ce n'est pas très cohérent

    J'ai encore tartiné le premier message de ce topic, ne m'en veuillez pas de trop, je ne sais pas faire court.

    Merci d'avance de vos idées, heuuuu pas trop compliquées

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Salut J-P,

    je ne sais pas si tu as lu ce tutoriel, je te donne son adresse :

    http://djmsoftware.developpez.com/PrintMonitor/

    Voilà,

    A plus

    Christopher

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Hello Christopher,

    Hé hé non, je viens encore de regarder dans les tutos via rechercher sur "Printer" et je n'avais rien trouvé à part les super tutos à AlphaOmega = Jean-Luc.

    Tu me donnes de la lecture pour ce soir/demain alors, merci @+

    Je reviendrais pour donner la réponse si je trouve mon bonheur or not aussi lol.

    JP

    Citation Envoyé par lapec_and_cie
    Salut J-P,

    je ne sais pas si tu as lu ce tutoriel, je te donne son adresse :

    http://djmsoftware.developpez.com/PrintMonitor/

    Voilà,

    A plus

    Christopher

  4. #4
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Soit je suis encore bourré des Fêtes - moi qui ne bois jamais - soit ce n'est pas du Delphi

    @+

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    Oui c'est vrai mais c'est du WIN32, tu peux t'en inspirer ça doit pouvoir se retraduire en Delphi...

    Sinon je n'ai pas autre chose sous la main!!!

    A plus

    Christopher

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Hello Christopher,

    Oupsssss, bon... en ce cas j'y retourne

    @+

    PS : Si des lecteurs de ce topic, ont des en Delphi je suis prenneur.

    J'ai déjà du mal avec Delphi, alors...

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    Non je ne suis pas dans un état second...

    On va essayer quelque chose de beaucoup plus simple, en fait il faut que tu interceptes les messages du spooler d'impression pour ce faire mets dans la partie private de la classe de ta fiche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
          message WM_SPOOLERSTATUS;
    Et dans la partie implementation crée une procédure qui va intercepter l'état d'impression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
    begin
      if msg.JobStatus = 0 then TravailTermine:=True//copie terminée
      else TravailTermine := False; //erreur
      msg.Result := 0;
    end;

    A bientôt,

    Et bonne prog,

    Christopher

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Christopher, je te remercie de cette trouvaille, j'espère que tu n'as pas veillé à cause de moi ; à regarder l'heure de ton postage...

    Je suis certain que ça va m'aider un max.

    Donc j'ai bien placé le code suivant, en private :
    (et l'autre dans la partie implementation comme tu l'indiques)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     private
        { Déclarations privées }         
       procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
       message WM_SPOOLERSTATUS;
    Mais à la compil, j'ai cette erreur :
    [Erreur] Unit1.pas(1287): Définition de champ non autorisée après des méthodes ou propriétés

    J'ai bien cherché via le F1 ce que cela bien pouvoir dire, mais pas facile...

    En tous les cas, je suis super heureux de cette trouvaille



    @+ je suis sur le bon chemin

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    Moi ça ne me crée pas d'erreur. Est ce que tu as d'autres variables déclarées derrière "le message WM_SPOOLERSTATUS;". Dans ce cas déplace le bloc que je t'ai dit de mettre à la fin des déclarations.

    A plus

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Oki, oki Chris, je n'avais même pas pensé à mettre le code en question à la fin, car en effet, au dessous j'ai au moins 300 variables !

    Bon, cette fois compilation impec !

    Mais je n'arrive pas à récupérer correctement le résultat de la variable, détail :

    En plus d'avoir placé les deux blocs de code plus haut, j'ai initialisé la variable TravailTermine à false dans le OnCreate de ma fiche.

    Ensuite j'ai placé un bouton de test voir connaître l'état du boolean, ce : qu'il y ai la printeuse débranchée ou non, code hyper complexe lol :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
       begin
          if travailTermine then beep
       else
        ShowMessage('Niet !!!');
    end;
    Alors le résultat tu vas me demander, hé bien juste après le lancement de mon appli, si je clic que le bouton j'obtiens bien la boîte du ShowMessage.

    Mais si jamais je printe avec printeuse branché = j'ai le Beep

    Ensuite je débranche la printeuse et je reprinte = au clic sur le bouton, toujours le Beep !

    Là, je ne sais plus et j'y perd mon latin (heu... je ne connais pas le latin)

    Chris, merci de tes efforts, je crois que grâce à toi, je ne suis pas loin du but, mais est-ce que je marche vers lui ou m'en éloigne ?

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    Cette fois ci j'espère que l'on va finaliser le problème. Bon j'ai trouver une petite routine en assembleur qui permet de détecter l'état de l'imprimante (très intéressante) :

    Voici l'adresse :http://www.swissdelphicenter.ch/torr...ode.php?id=263


    On va y ariver si si j'y travaille...!!!

    A plus,

    Christopher

  12. #12
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    et si tu récupères les erreurs d'entrées sorties comme avec la vérification si le fichier existe... avec des directives au compilateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {$I-}
    //code d'ouverture de session d'impression
    {$I-}
    If IOError = 0 then
        begin
        // code pour l'impression et la fermeture de session d'impression
        end

  13. #13
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Merci de vous pencher sur mon cas

    Mais je ne suis qu'un débutant, pas encore un gros balèze.

    Christ, j'ai un blème pour la récup du Result, j'ai tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button2Click(Sender: TObject);
     var
       LPTPort: Byte;
      begin
     ShowMessage(TestPrinterStatus(LPTPort));
     
    // LabelX.Caption := TestPrinterStatus(LPTPort);
    end;
    Mais j'ai ce message d'erreur :
    [Erreur] Unit1.pas(10443): Types incompatibles : 'String' et 'Byte'

    Je sais transtyper entre des String et Integer, mais pas pour ce cas pour le Byte.

    En plus, les functions, je commence seulement à piger un peu et en bricoler.

    zazaraignée,

    Pour savoir quoi placer en ce qui concerne le :
    code d'ouverture de session d'impression et
    code pour l'impression et la fermeture de session d'impression

    Là, je ne suis qu'un débutant, pour l'instant, je sèche

    Merci @+

  14. #14
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Faudrais que je fouille un peu plus. J'ai imprimé une fois seulement. Faudrais que je retrouve le projet en question. Il me semble qu'on envoie le texte à l'imprimante comme on l'enverrait à un fichier texte. Il faut donc 'ouvrir' l'imprimante comme on ouvre un fichier texte. C'est pourquoi je propose les directives de compilation (que j'utilise déjà pour les fichiers).

    Je fais quelques tests et t'en retourne des nouvelles.

  15. #15
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Citation Envoyé par zazaraignée
    Salut

    Faudrais que je fouille un peu plus. J'ai imprimé une fois seulement. Faudrais que je retrouve le projet en question. Il me semble qu'on envoie le texte à l'imprimante comme on l'enverrait à un fichier texte. Il faut donc 'ouvrir' l'imprimante comme on ouvre un fichier texte. C'est pourquoi je propose les directives de compilation (que j'utilise déjà pour les fichiers).

    Je fais quelques tests et t'en retourne des nouvelles.


    Je vois que nous sommes tous les deux (encore) sous Windows 98se

  16. #16
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Excuse moi pour ce temps, mais j'avais quelque chose à faire (problème d'astreinte )

    Pour afficher les états sous forme de chaines tu peux utiliser la fonction inttostr sachant que :

    *1 te donnera un timeout;
    *8 une erreur d'entrée sortie;
    *16 imprimante sélectionnée;
    *32 plus de papier;
    *64 reconnaissance de l'imprimante
    *128 imprimante non occupée


    A plus J-P,

    Christopher

  17. #17
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Christopher, tu n'as aucunement à t'excuser, ce serait plutôt moi à t'ennuyer avec mes histoires de détection d'erreur de printeuse 8)

    Merci de ces précieux renseignements complémentaires.

    Comme je le disais plus haut, je ne suis pas fichu de rédiger correctement la syntaxe d'appel de la récup du retour de la function en question via pour exemple : un ShowMessage et un Label.

    Une histoire de types incompatibles : 'String' et 'Byte'

    @+

  18. #18
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Mes tests n'ont pas été concluants. IOResult (et non IOError) retourne 0 (zéro) même si l'imprimante est éteinte. lapec_and_cie a surement mieux à te proposer.

    Je continues à regarder ça de plus près. Le problème m'intéresse, tu vois.

  19. #19
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    tu peux faire un test sur l'état de ta printeuse (comme tu le dis si bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if IntToStr(Status) = '1' then
      Traitementtermine := false;
    if IntToStr(Status) = '8' then
      Traitementtermine := false;
    if IntToStr(Status) = '32' then
      Traitementtermine := false;
    if IntToStr(Status) = '0' then
      Traitementtermine := false;//imprimante occupée
    Ensuite tu peux traiter ton booléen en conséquence en mettant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if TraitementTermine = false then 
      Printer.Abort;
    Bon j'espère que cette fois ci on va arriver au résultat escompté

    Essaye celà et donne moi des nouvelles rapidement!!!

    Christopher

  20. #20
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Oki femme araignée


    Christopher, je ne sais pas si je te suis bien...

    En Implémentation 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
     var Status: byte;
       begin
        if msg.JobStatus = 0 then TravailTermine:=True // copie terminée
          else TravailTermine := False; // erreur
     
        if IntToStr(Status) = '1' then
           TravailTermine := false;
     
        if IntToStr(Status) = '8' then
           TravailTermine := false;
     
        if IntToStr(Status) = '32' then
           TravailTermine := false;
     
        if IntToStr(Status) = '0' then
           TravailTermine := false; // imprimante occupée
     
    //    if TraitementTermine = false then
    //    Printer.Abort;
     
       msg.Result := 0;
    end;
    J'ai mis byte le Status en var... (?}

    Toujours afin de tester avant et après printage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
        begin
          if travailTermine then beep
             else
         ShowMessage('Niet !!!');
    end;
    Hé bien cela fait rigoureusement comme avant !

    La variable est initialisée au lancement donc si je clic j'ai mon ShowMessage, mais si ensuite je printe avec la printeuse branchée qui printait bien, ou bien si je tente de printer - printeuse débranchée - ensuite j'ai un message d'erreur du pilote d'imprimante = cela est du pareil au même = toujours le Beep !

    Bonne nuit tout le monde et pas encore cette nuit Christopher... il faut

    et à demain.

Discussions similaires

  1. [VB.NET][VS2005] Classe PrintDocument - annuler l'impression
    Par annedeblois dans le forum Windows Forms
    Réponses: 3
    Dernier message: 23/10/2006, 14h14
  2. Réponses: 1
    Dernier message: 13/06/2006, 15h11
  3. Annuler une impression ??
    Par Ben_Le_Cool dans le forum Delphi
    Réponses: 11
    Dernier message: 08/06/2006, 20h30
  4. Comment détecter une erreur dans un process
    Par chuckboy dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2005, 10h40
  5. annuler une impression en cour
    Par mondanikoffi dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/07/2005, 20h56

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