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 :

Gestion TPrinter et multi imprimantes


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut Gestion TPrinter et multi imprimantes
    J'ai en tete un projet et j'aimerais avori quelques informations avant de me lancer, pour cibler mes rehcerches.

    Mon projet doit pouvoir scanner un repertoire pour lister les images qu'il contient et dispatcher automatiquement l'inpression de ces photos sur un parc de N imprimantes afin d'accelerer le rendement d'impression.
    Le repertoire est alimenté en cours de route par les photographes qui y dechargent leur appareils periodiquement.

    Pour l'enemble du projet, j'ai deja tout ce qu'il me faut, et sais comment gerer ma barque. Ce qui me manque c'est la gestion du transfert de l'image charge en memoire vers l'imprimante pour l'ajouter au pool d'impression et comment manager les N imprimantes et leurs configurations en simultanées.
    Accessoirement, savoir aussi detecter la fin d'une impression.

    Merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Accessoirement, savoir aussi detecter la fin d'une impression.
    C'est pas aussi "accessoire" que cela car pour gérer les N imprimantes faut savoir à chaque instant si telle ou telle imprimante :
    1 - est sous tension (doit être faisable),
    2 - est en état d'imprimer-correctement : bourrage intempestif, bac-à-papier épuisé, cartouche d'encre pas tout à fait vidée qui n'imprime plus que partiellement bien avant que le voyant rouge ne s'allume ... c'est à dire des incidents qui jouent dans la gestion,
    3 - et enfin, si tout se passe bien, détecter la fin de l'impression à moins que les fichiers-photo ne puissent s'accumuler dans la file d'attente de chaque imprimante (liste du Gestionnaire d'impression).

    TPrinter.Printing : Boolean indique si un travail d'impression est en cours sur l'imprimante concernée ... mais n'indique pas si l'impression est encore de bonne qualité. De plus Printing vaut True quand l'application a appelé la méthode BeginDoc mais qu'elle n'a pas encore appelé la méthode EndDoc (ou la méthode Abort) autrement dit si un incident survient avant le EndDoc Printing risque de rester à True longtemps.

    Le sujet m'intéresse, car je me suis déjà cassé la tête avec sans succès ... mais comme je ne suis qu'autodidacte en Delphi il y a certainement des plus fortiches que moi à pouvoir aller plus loin.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Par défaut
    Jetes un oeil sur cette source pour imprimer les images

    http://www.efg2.com/Lab/Library/Delp...ntGIFImage.TXT

    Pour le status de l'imprimante, use Winspool

    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
     
    function GetPrinterStatus(APrinterName: PChar): DWORD;
    var
      HPrinter: THandle;
      BytesNeeded: Cardinal;
      PrinterDefaults: PRINTER_DEFAULTS;
      PI2: ^PRINTER_INFO_2;
    begin
      with PrinterDefaults do
      begin
        DesiredAccess := PRINTER_ACCESS_USE;
        pDatatype := nil;
        pDevMode := nil;
      end;
      Win32Check(OpenPrinter(APrinterName, HPrinter, @PrinterDefaults));
      try
        if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
        begin
          GetMem(PI2, BytesNeeded);
          try
            if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
              Result := PI2^.Status
              ///  PI2^.cJobs <== INDIQUE LE NOMBRE DE DOCUMENTS EN COURS
            else
              Result := MaxWord;
          finally
            FreeMem(PI2);
          end;
        end
        else
          Result := MaxWord;
      finally
        ClosePrinter(HPrinter);
      end;
    end;
    limiter le nombre de documents envoyé pour chaque imprimante en scrutant les jobs en cours

    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
     
    function GetSpoolerJobs(sprinterName: string): JOB_INFO_1_ARRAY;
    var
     i: Integer;
     myprinter: THandle;
     bResult: Boolean;
     cbBuf: DWORD;
     pcbNeeded: DWORD;
     pcReturned: DWORD;
     aJobs: array[0..99] of JOB_INFO_1;
    begin
     cbBuf := 1000;
     bResult := Openprinter(PChar(sprinterName), myprinter, nil);
     if not bResult then begin
       ShowMessage('Error opening the printer');
       exit;
     end;
     bResult := EnumJobs(myprinter, 0, Length(aJobs),
                    1, @aJobs, cbBuf, pcbNeeded, pcReturned);
     if not bResult then begin
       ShowMessage('Error Getting Jobs information');
       exit;
     end;
     Closeprinter(myprinter);
     for i := 0 to pcReturned - 1 do begin
       if aJobs[i].pDocument <> nil then begin
         SetLength(Result, Length(Result) + 1);
         Result[Length(Result) - 1] := aJobs[i];
       end;
     end;
    end;

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par EPJSoft
    Jetes un oeil sur cette source pour imprimer les images

    http://www.efg2.com/Lab/Library/Delp...ntGIFImage.TXT

    Pour le status de l'imprimante, use Winspool
    [...]
    je vais voir ca plus en detail ....
    Ca m'a tout l'air interessant.


    Reste un point important : le parametrage des impressions (selection bac, correction couleurs, disposition, etc ...) telle que l'on peut le faire via tout logiciels gerant l'impression.
    Je sais qu'il y a le printerDialog mais je n'ai jamais eu l'occasion de bien cerner son fonctionnement ....

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 147
    Par défaut Tips and Tips
    as tu regardé en t'orientant vers un style report (crystal...) en collant les images dessus ?

    sinon
    http://www.scalabium.com/faq/dc_tips.htm section Report Printing


    (attention moi j'en suis pas encore à imprimer dans mes projets mais cela va venir lol alors j'ai juste testé l'histoire du status... je cherche pas pour rien cela me servira plus tard :=) )

    Phil

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Oui ca peut etre une solution .... mais pas franchement celle que j'attendais

  7. #7
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Gilbert Geyer
    C'est pas aussi "accessoire" que cela[...]
    JE me doutais bien que cela n'etait pas aussi trivial que ce qu'il ny parrait


    Citation Envoyé par Gilbert Geyer
    car pour gérer les N imprimantes faut savoir à chaque instant si telle ou telle imprimante :
    1 - est sous tension (doit être faisable),
    Dans un premier temps, on supposera qu'elle le sont on parametre le tout, et une fois ok, on lance le systeme.

    Citation Envoyé par Gilbert Geyer
    2 - est en état d'imprimer-correctement : bourrage intempestif, bac-à-papier épuisé, cartouche d'encre pas tout à fait vidée qui n'imprime plus que partiellement bien avant que le voyant rouge ne s'allume ... c'est à dire des incidents qui jouent dans la gestion,
    LA aussi, le parc d'imprimantes est constitué d'imprimantes photos style canon selphy, avec systeme d'impression par sublimation thermique.
    C'est une technique qui depends de la taille du ruban d'impression et non de la proportion de couleurs sur une image ... donc une cartouche de 36 photos, assure 36 impressions qualité optimale.
    Du coup ca doit etre jouable en utilisant une compteur interne qui gere le nombre de photos restante, sans avoir a dialoguer avec l'appareil.
    Quand au bourrage papier ... c'est une donnee a prendre en compte ... mais pour le moment extremement rare.


    Citation Envoyé par Gilbert Geyer
    3 - et enfin, si tout se passe bien, détecter la fin de l'impression à moins que les fichiers-photo ne puissent s'accumuler dans la file d'attente de chaque imprimante (liste du Gestionnaire d'impression).
    La, je mise quand meme sur la gestion du poll d'impression, qui a mon avis depends plus de la configuration windows que de la gestion via l'application ...

    Citation Envoyé par Gilbert Geyer
    TPrinter.Printing : Boolean indique si un travail d'impression est en cours sur l'imprimante concernée ... mais n'indique pas si l'impression est encore de bonne qualité. De plus Printing vaut True quand l'application a appelé la méthode BeginDoc mais qu'elle n'a pas encore appelé la méthode EndDoc (ou la méthode Abort) autrement dit si un incident survient avant le EndDoc Printing risque de rester à True longtemps.
    ok.
    J'ai deja eu affaire a la classe TPrinter mais juste comme ca ... pour m'amuser.
    Begin/endDoc lance le document ? ou sert juste a concevoir l'impression, etant apres transmise au systeme windows ?
    Ca me semble peu envisageable d'activer l'impression des le BeginDoc, ....

    Citation Envoyé par Gilbert Geyer
    Le sujet m'intéresse, car je me suis déjà cassé la tête avec sans succès ... mais comme je ne suis qu'autodidacte en Delphi il y a certainement des plus fortiches que moi à pouvoir aller plus loin.
    Moi aussi je suis autodicdate
    C'est pour ca que je requiere certains conseils pour cibler mes recherches

  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,

    J'ajoute ma petite contribution à ce thread :
    http://www.developpez.net/forums/showthread.php?t=86253

    En effet, ne pas négliger les aléas divers ; bourrages, imprimante non branchée, plus de paper, etc.

    Si seulement toutes les imprimantes étaient branchées sous LPT1, car sous USB...

    Bonne lecture

    PS : Un bon zip à Nono40, surveiller un serveur d'impression :
    http://delphi.developpez.com/sources...no40source0071

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    A Clorish / msg d'Hier, 15h15


    /à détection état de mise sous tension des imprimantes [/B]: Ok, y'a-k'à faire le tour pour les mettre toutes sous tension.

    /"bourrage papier ... extremement rare" : Ok, vu que le papier utilisé pour l'impression de photos (j'avais oublié) est certainement bien plus rigide que du papier à lettre courant.

    /"donc une cartouche de 36 photos, assure 36 impressions qualité optimale ... :
    Cela signifie-t-il qu'une cartouche d'encre doit être déjà remplacée au bout de la 36ème photo ? Bizarre... et si chaque lot de 36 photos est imprimé en X minutes faudrait changer les cartouches d'encre toutes les X minutes ?

    /"TPrinter.Printing" : Ok je me suis laissé tromper par l'intitulé "Printing" et par l'aide de Delphi. En fait Printing:=true seulement pendant que l'on trace qq-chose sur le canvas d'un Printer ... et ensuite Printing:=false à partir de l'instant où le EndDoc passe la main à Windows qui s'occupe de l'impression mécanique pendant laquelle Printing:=false (!!!) ... donc "Printing":=faux-ami.

    / ... je mise quand même sur la gestion du poll d'impression" :
    C'est de plus en plus clair ... d'autant plus qu'il a été cité plusieurs fonctions qui peuvent renvoyer le nombre de documents en attente ou en cours dans le pool d'impression et si ce nombre redescend à 0 on part remplacer la cartouche d'encre (oui/non ?) puis on envoie à l'imprimante en question une rafale de 36 photos suivantes.

    Reste plus qu'à tester les codes des diverses fonctions citées suivant la version de Windows utilisée.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Gilbert Geyer
    /"donc une cartouche de 36 photos, assure 36 impressions qualité optimale ... :
    Cela signifie-t-il qu'une cartouche d'encre doit être déjà remplacée au bout de la 36ème photo ? Bizarre... et si chaque lot de 36 photos est imprimé en X minutes faudrait changer les cartouches d'encre toutes les X minutes ?
    Bha vi C'est ca qui est bien
    Le principe de l'impression par sublimation thermique est qu'on utilise un ruban sur lequel sont disposée par alternance une bande rouge, une bande jaune et une bande bleue. Chaques bandes son de superficie egale a la superficie de la photo a imprimer.
    Ensuite, quand la photo passe au travers de l'imprimante, le rouleau defile en meme temps que le paper et transfert a la maniere des decalcomanie de notre enfance, la couleur du rouleau vers le papier. Couche par couche grace a des aller et retour de papier. Le plus par rapport au decalcomanie c'ets que la quantitée transferee depends j'imagine de la quantité de la composante du pixel a imprimer ...

    Du coup, 1 photo necessite une bande rouge une bande jaune et une bande bleu .. .(plus uen 4e de fixation j'imagine, sorte de vernis).

    Donc chaques cartouches est prevue pou N Photos ... pas uen de plus pas uen de moins, et de qualité constante

    Au passage, cest super ces imprimantes un peu cher (26cts/photos pour la mienne) par rapport aux tarifs du net, mais de bonne qualité et pratique pour l'urgence

    on a mis en palce un stand a la kermesse de l'ecole de ma femme et ca a fait fureur !
    On cherche a optimiser le rendement pour l'annee prochaine

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    A Clorish :

    Impression par sublimation thermique : Vu, ça a l'air pas mal, je ne connaissais pas ... bon ça se comprend vu que les photos c'est pas vraiment mon truc, chez moi elles passent dans les oubliettes.

    "Donc chaque cartouche est prevue pour N Photos" : Et, si N est le même pour toutes les imprimantes à gérer par ton projet et que toutes les imprimantes on la même vitesse d'impression cela devrait permettre de simplifier la mise au point du projet, comme toute constante. Non?
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Gilbert Geyer
    Impression par sublimation thermique : Vu, ça a l'air pas mal, je ne connaissais pas ... bon ça se comprend vu que les photos c'est pas vraiment mon truc, chez moi elles passent dans les oubliettes.
    A mon avis tu ne doit pas avoir encore de gosses

    Citation Envoyé par Gilbert Geyer
    "Donc chaque cartouche est prevue pour N Photos" : Et, si N est le même pour toutes les imprimantes à gérer par ton projet et que toutes les imprimantes on la même vitesse d'impression cela devrait permettre de simplifier la mise au point du projet, comme toute constante. Non?
    Tout a fait .. donc pour l'autonomie pas de soucis
    Mais pour l'impression, je prefere me baser sur un systeme de detection de fin d'impression que sur l'hypothetique duree d'impression .. car c'ets quand meme moins constant que le nombre de tirages (materiel qui chauffe, initialisations, transfert .....) ou alors on prends de la marge et ca empiete sur le rendement

    Non, l'ideal serait de lancer les impression dans le pool d'imrpession windows ... et ca je crois que c'est le cas. Du moins je l'espere .... Sinon ca deviendrais une tueris a mettre en place dans chaques applications

    Si tel est le cas .. alors calculer une duree moyenn des impression permettrait de temporiser le lancemetn des impressions pour ne pas surcharger le pool et donner une chance a l'imprimante de le vider un peu

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/09/2008, 12h26
  2. Réponses: 3
    Dernier message: 04/07/2008, 15h13
  3. Gestion flèches clavier multi touches
    Par PoZZyX dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/12/2007, 13h14
  4. [2.0][C#] : Gestion des droits Multi Siteweb
    Par stephane.net dans le forum ASP.NET
    Réponses: 1
    Dernier message: 05/01/2007, 09h42
  5. preconfiguration multi imprimantes
    Par EE dans le forum Access
    Réponses: 3
    Dernier message: 18/06/2006, 21h38

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