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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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 chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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
    Membre Expert
    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
    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 Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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
    Membre Expert
    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
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Algérie

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Par défaut comment configurer l'imprimante sous delphi ???
    Salut zazaraignée à ce ke je vois tu es assez calé coté impréssion, ce ki n'est pas le cas pour moi esq tu px me montrer stp comment appeller la fenetre de windows qui configure l'imprimante par ex la qualité du papier, le nombre de feuliies... ect merci d'avance

  16. #16
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Citation Envoyé par djazialger Voir le message
    Salut zazaraignée à ce ke je vois tu es assez calé coté impréssion, ce ki n'est pas le cas pour moi esq tu px me montrer stp comment appeller la fenetre de windows qui configure l'imprimante par ex la qualité du papier, le nombre de feuliies... ect merci d'avance
    Voici un cours très intéressant qui est une introduction à ce que vous cherchez.
    Bon courage.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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

  18. #18
    Membre chevronné

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    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

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    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'

    @+

  20. #20
    Membre Expert
    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
    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.

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