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 :

Problème de Printer.PageWidth lorsqu'il n'y a pas d'imprimante par défaut


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    604
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 604
    Points : 2 045
    Points
    2 045
    Par défaut Problème de Printer.PageWidth lorsqu'il n'y a pas d'imprimante par défaut
    Bonjour,

    et pb de PageHeight d'ailleurs.

    J'imprime à l'aide de l'objet TPrinter.
    Avant impression, je propose à mon utilisateur de sélectionner l'imprimante.

    Quoiqu'il choisisse (c'est à dire l'imprimante par défaut ou une autre) je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Printer.PrinterIndex := n ;
    Ca semblait fonctionner jusqu'à aujourd'hui. Sauf que j'ai un client qui a une imprimante A3.
    Quand cette imprimante est l'imprimante par défaut (au sens Windows du terme) : pas de problème. L'impression se passe bien.


    Mais si ce n'est pas l'imprimante par défaut, mon impression est tronquée.
    J'ai commencé de comprendre ce qui se passe.

    Je précise que je fait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Printer.PrinterIndex := n ;
    avant toute interrogation ou ordre à l'imprimante.

    Mais selon que l'imprimante est ou n'est pas l'imprimante par défaut, les Printer.PageWidth et PageHeight retrournées ne sont pas les même.
    Les valeurs sont justes si l'imp A3 est l'imp par défaut.
    Fausses quant l'imp A3 n'est pas l'imp par défaut.

    A noter que, dans ce dernier cas, les valeurs retournées ne correspondant pas non plus à la laser A4 actuellement défini comme défaut - donc non seulement il ne retourne pas les valeurs de l'imprimante sélectionnées, mais ce ne sont pas non plus les paramètres de l'imprimante par défaut .

    Pourtant, si je fait un GetDeviceCaps( Printer.handle, PHYSICALWIDTH ) ou GetDeviceCaps( Printer.handle, HORZSIZE ) , j'ai bien les données correspondant à la page A3.
    Mais même en utlisant ces valeurs (à la place de PageWidth) dans mes calculs, l'impression est tronquée.

    J'ai pensé à un pb de bac, mais l'impression se lance bien sur la page A3 (qui est bien le bac par défaut dans les propriétés du pilote).
    Donc c'est bien la bonne imprimante et le bon bac qui sont sélectionnés, mais l'objet Printer renvoie des valeurs erronés.

    Je pige pas ....

    Quelqu'un a-t-il déjà eu ce pb ?

    J'aimerais bien forcer le bac A3 par programmation, histoire de voir si ça règle le pb, mais je n'ai pas trouvé d'odre Delphi pour le faire.
    Quelqu'un sait faire cela ?
    --
    vanquish

  2. #2
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    je pense que c'estait un bug connu de la vcl Delphi sous Win95 et certaine version de Win98 (mais je pense que c'estait avec des imprimantes matricielles ).
    http://www.pocketmt.com GLCD Font Creator home site.

  3. #3
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    604
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 604
    Points : 2 045
    Points
    2 045
    Par défaut
    Là je pense que c'et sous XP et c'est sur une jet d'encre.

    Le pb c'est que j'ai pas d'imprimante A3 pour faire les essais.

    J'ai défini une imprimante A3 virtuelle avec FinPrint.
    En appelant GetDeviceCaps au lieu de PageWidth/Heigh, je règle le problème chez moi.

    Mais cela ne change rien chez le client avec une vrai imprimante.
    --
    vanquish

  4. #4
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    tu peux demander au client de mettre à jour son driver d'imprimante... des fois ca règle le pb.
    http://www.pocketmt.com GLCD Font Creator home site.

  5. #5
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    604
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 604
    Points : 2 045
    Points
    2 045
    Par défaut
    Ce n'est pas lié à son drivers, car j'ai un pb plus ou moins similaire avec FinePrint. C'est un driver particulier, certe, mais comme j'ai les même problème qu'avec un vrai driver .... il semble bel et bien que, là, ce soit un bug de la VCL.

    Après analyse, il semble que le Printer.canvas.ClipRect reste aux valeurs de l'imprimante par défaut.

    Comme ce rectangle est défini en pixel, que la page et la densité de pixels doublent (A4->A3 et 600 dpi à 1200 dpi), le clipping sur le 1/4 de page qu'observe le client me semble assez normal, compte tenu de mes propres observations.

    La propriété ClipRect est en lecture seule.
    Je suis en train de regarder comment la changer.
    --
    vanquish

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    salut
    tu peut me dire comment tu crée une imprimante virtuelle :


    une mauvaise idée je pence:
    imprime sur un canvas d'une forme a des dimention similaire à A3 puis imrime la forme : :
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    604
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 604
    Points : 2 045
    Points
    2 045
    Par défaut
    Salut,

    Citation Envoyé par edam
    tu peut me dire comment tu crée une imprimante virtuelle :
    Avec le logiciel FinePrint que je conseille à tous ceux qui veullent économiser du papier.

    Citation Envoyé par edam
    imprime sur un canvas d'une forme a des dimention similaire à A3 puis imrime la forme : :
    Mon pb est que les paramètres retournés et surtout le ClipRect sont faux.
    Rien ne s'immrime en dehors du cliprec, ni instruction directement sur le canvans, ni instruction API sur le canvas.handle, ni ligne, ni text - rien donc ni graphiques bitmap.


    En utilisant Printer.SetPrinter() au lieu de Printer.PrinterIndex, j'obtiens enfin la bonne taille de page et de ClipRect.
    Je vais envoyer une version au client et voir si cela fonctionne enfin.
    --
    vanquish

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    moi mes essait je les effets sur un TImage.canvas
    procedure printe(t:integer;canvas:TCanvas);
    begin
    if t=1 then printer.begin
    .....
    //dessin sur canvas
    //fin dessin
    if t=1 then printer.enddoc
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    604
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 604
    Points : 2 045
    Points
    2 045
    Par défaut
    Mais je n'ai pas de pb sur un TImage.canvas. Pas plus que sur n'importe qu'elle imprimante d'ailleurs. Car comme je le disais, si c'est l'imprimante par défaut cela fonctionne

    Visiblement c'est la property PrinterIndex qui ne fonctionne que très partiellement. Car si la sortie se fait bien sur l'imprimante indiquée, toutes les propriétés du canvas sont fausses (taille de page, ClipRect etc...)
    Par définition, quelque soit la méthode utilisé rien ne peut sortir du ClipRect. Et c'était cela mon problème.

    J'ai comparé le source de cette propriétés (et des fonctions qui sont derrière) avec le source de la procédure Printer.SetToDefaultPrinter.

    La seconde est beaucoup, beaucoup plus complète que la première (et je ne parle pas de la recherche du nom de l'imprimante défini comme étant par défaut).

    D'ou mon idée d'utiliser la méthode Printer.SetPrinter() au lieu de PrinterIndex (à ne pas confondre avec la méthode SetPrinter de l'unité et définie à l'extérieure à l'objet printer lui même)

    Et là miracle ! Ca marche.
    Mes PageWidth et PageHeight sont bons, le Cliprect aussi.

    J'ai envoyé le nouvel EXE au client, et il vient de me confirmer que l'impression A3 se déroule enfin normalement.

    Bref c'est à savoir.
    Tant que l'on utilise des imprimante relativement proche les unes des autres la propriété PrinterIndex suffit. Mais si les imprimantes ont des résolution et des tailles de pages différentes, il est de loin préférable de passer par Printer.SetPrinter.
    --
    vanquish

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

Discussions similaires

  1. Problème d'imprimante par défaut
    Par mlevaltier dans le forum SAP
    Réponses: 5
    Dernier message: 21/12/2011, 19h02
  2. Réponses: 0
    Dernier message: 29/10/2011, 11h27
  3. [AC-2010] Problème imprimante par défaut
    Par hepav dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/03/2011, 14h52
  4. Réponses: 0
    Dernier message: 03/04/2009, 18h31
  5. Problème imprimante par défaut non souhaité
    Par martyshel dans le forum Périphériques
    Réponses: 4
    Dernier message: 24/09/2008, 21h58

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