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 :

Comment lire les propriétés d'une imprimante ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut Comment lire les propriétés d'une imprimante ?
    salut
    j'ai utiliser la bibliotèque printer pour afficher les propriétés de l'imprimente mais la page afficher ne me permer pas de faire de faire des modifications sur ces proriétés surtous le mode d'imprission (recto ou verso).
    j'ai utiliser la composante simpleGraphe1 pour dessiner le recto de mon document et simplegraphe2 pour dessiner la verso.
    j'ai un imprimente qui peux imprimer en recto et verso alors je veux laisser le choix à l'utilisateur pour imprimer le recto seullement ou bien le recto /verso ensemble .
    comment je doit faire, es que je doit lire les drivers de l'imprimente et comment je fait pour ça.
    merci d'avance.

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut,

    Pourrais tu poster ton code qui imprime ton document ?

    Celà me permettrait peut être de t'aider
    a+
    Bidouilleuse Delphi

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Voici comment tu peux faire pour forcer une impression Recto-verso :
    (dans la fiche de mon projet, j'ai juste mis un bouton, un PrintDialog (pour choisir l'imprimante) et codé son évènement OnClick)
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        PrintDialog1: TPrintDialog;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses WinSpool, Printers;
    {$R *.dfm}
    function PrinterSupportsDuplex: Boolean;
    var
      Device, Driver, Port: array[0..255] of Char;
      hDevMode: THandle;
    begin
      Printer.GetPrinter(Device, Driver, Port, hDevmode);
      Result :=
        WinSpool.DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil) <>
        0;
    end;
     
    procedure ForceDuplexMode;
    var
      Device, Driver, Port: array[0..80] of Char;
      DevMode: THandle;
      pDevmode: PDeviceMode;
    begin
      Printer.GetPrinter(Device, Driver, Port, DevMode);
      if Devmode <> 0 then begin
        pDevMode := GlobalLock(Devmode);
        if pDevmode <> nil then
        try
          with pDevmode^ do begin
            dmDuplex := DMDUP_VERTICAL;
            dmFields := dmFields or DM_DUPLEX;
          end;
        finally
          GlobalUnlock(Devmode);
        end;
      end; { If }
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if PrintDialog1.Execute then
      begin
        ForceDuplexMode;
     
        Printer.BeginDoc;
        printer.canvas.TextOut(10,10,'Recto');
     
        Printer.NewPage;
     
        printer.canvas.TextOut(10,10,'Verso');
     
        Printer.EndDoc;
      end;
    end;
     
    end.
    Bidouilleuse Delphi

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut
    salut;
    merci Waskol pour votre réponce ça resoudre un peut le probleme mais je veux comprendre une foit pour toute la méthode pour la lecture des drivers car j'ai un logiciel quand je choisie d'imprimer le recto et le verso ensemble avec un imprimente qui ne permer pas cette option il m'affiche un message d'erreur " le driver de cette imprimante ne permer pas l'impression en recto/verso " par contre avec votre code il imprime .
    bref je veux connaitre comment savoir es que cet imprimente choisie permet l'option imprimer recto verso.
    vous pouver meme me donner l'adresse d'un coure sur les driver car j'ai cherché mais aucun resultas
    merci une autre fois pour votre réponce.

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    L'implémentation des possibilités de l'imprimante n'est pas complête dans Delphi, il faut donc passer, comme je le fait, par les API Windows.

    Dans l'aide "SDK Windows", accessible depuis votre delphi, les fonctions et "enregistrements" que delphi utilise partiellement (et que vous pouvez donc utiliser a leur plein potentiel) sont assez bien décrites.

    Ainsi vous y trouverez en particulier une description de la structure de type DEVMODE qui est renvoyée sur le pointeur pDevMode;

    Pourquoi celà marche-t-il avec mon code et non pas avec le logiciel que vous utilisez ?
    peut-être parce que le logiciel que vous utilisez a été mal programmé, le programmeur ayant soit utilisé des bibliothèques toute faites mais pas complêtement finalisées à ce niveau, ou alors l'ayant mal codé lui-même...

    Souvent, les entreprises qui vendent des logiciels préfèrent dire que c'est de la faute de votre matériel plutôt que de dire que l'erreur ou leur incompétence est de leur propre fait (pas bon ça, pour leur image de marque !).
    Bidouilleuse Delphi

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Sinon, quand on interroge le pilote d'imprimante, pour savoir ce qu'il sait faire, il faut utiliser DeviceCapabilities (aussi dans l'aide "SDK Windows"), en utilisant l'une après l'autre les valeurs :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil) <>
        0 then //--> Recto-Verso possible
    DeviceCapabilities(Device, Port, DC_TRUETYPE	, nil, nil) <>
        0 then //-->peut utiliser polices True type
    etc...
    Pour les dimensions et zone d'impression qu'offre une imprimante, un écran, une carte graphique (bref les possibilités offertes par un Canvas), il faut utiliser GetDeviceCaps , il y a une rubrique How to Use a Program to Calculate Print Margins qui explique comment le faire en C++ dans l'aide "SDK Windows).

    Les variables intéressantes pour les imprimantes sont notemment :
    PHYSICALWIDTH, PHYSICALHEIGHT : pour la taille de la page (propriétés PageWidth et PageHeight de TPrinter)
    et PHYSICALOFFSETX, PHYSICALOFFSETY pour les coordonnées de la zone d'impression dans la page (tailles des marges gauche et haut de la page, où l'imprimante ne peut pas imprimer en fait).

    Bon courage
    Bidouilleuse Delphi

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut
    salut:
    merci waskol
    je veux prendre un peut de temps pour tester les idées que vous m'avez donner
    merci

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut
    Salut!

    J'ai utilisé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil) <> 
        0 then //--> Recto-Verso possible
    et j'ai déclaré les variables device et port comme TAnsiChart mais cette fonction me renvoi la valeur -1 qui n'est pas la bonne réponse.

    Est ce que cette fonction teste l'imprimante déclaré par défaut.

    Merci d'avance.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par zidenne
    Salut!

    J'ai utilisé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil) <> 
        0 then //--> Recto-Verso possible
    et j'ai déclaré les variables device et port comme TAnsiChart mais cette fonction me renvoi la valeur -1 qui n'est pas la bonne réponse.

    Est ce que cette fonction teste l'imprimante déclaré par défaut.
    ou je dois déclarer le nom de l'imprimente.

    Merci d'avance.

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Là, en l'occurence, ça teste l'imprimante par défaut ou sélectionnée à travers un TPrinterDialog
    Bidouilleuse Delphi

  11. #11
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Voici un exemple d'utilisation, avec dans une fiche :
    - 1 TListView
    - 1 Bouton
    - 1 Label

    Quand on clique sur le bouton, l'imprimante par défaut est indiquée dans le Label, la liste des imprimantes est indiquée dans le ListView avec, en vis à vis, leur possibilité Recto-Verso.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        PrintDialog1: TPrintDialog;
        ListView1: TListView;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure InitListView;
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses Printers,WinSpool;
    {$R *.dfm}
    procedure TForm1.InitListView;
    var AListColumn:TListColumn;
    begin
      ListView1.Clear;
      ListView1.Columns.Clear;
      ListView1.ViewStyle:=vsReport;
     
      AListColumn:=ListView1.Columns.Add;
      AListColumn.Caption:='Nom de l''imprimante';
        AListColumn:=ListView1.Columns.Add;
      AListColumn.Caption:='Nom du Driver';
        AListColumn:=ListView1.Columns.Add;
      AListColumn.Caption:='Recto Verso';
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
      AListItem:TListItem;
      Device, Driver, Port: array[0..255] of Char;
      hDevMode: THandle;
      TypeDeDuplex:Integer;
      s:string;
    begin
      InitListView;
      Printer.PrinterIndex:=-1;
      Printer.GetPrinter(Device, Driver, Port, hDevmode);
      Label1.Caption:='Imprimante par défaut : '+string(Device);
      for i:=-1 to printer.Printers.Count-1 do
      begin
        Printer.PrinterIndex:=i;
        Printer.GetPrinter(Device, Driver, Port, hDevmode);
        TypeDeDuplex:=WinSpool.DeviceCapabilities(Device, Port, DC_DUPLEX, nil, nil);
        AListItem:=ListView1.Items.Add;
        AListItem.Caption:=Device;
        s:=Driver;
        if s='' then s:='<Non fourni>';
        AListItem.SubItems.Add(s);
        case TypeDeDuplex of
          -1:s:='Erreur';
           0:s:='Non';
           1:s:='Oui';
        end;
        AListItem.SubItems.Add(s);
      end;
    end;
     
    end.

    Sinon, déclare plutot tes variables comme des array of char quand tu as besoin de passer un Buffer de caractères aux API Windows, ça marche mieux

    Si tu continue à avoir -1 au résultat de ta fonction, c'est probablement que tu doit mettre à jour les pilotes de ton imprimante.

    Sinon, c'est normal que DeviceCapabilities ne renvoi pas de Nom de Pilote (ca dépend du fabriquant du pilote), ni de nom de port (jamais rempli sous Windows 32 bits).
    Bidouilleuse Delphi

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 179
    Points : 65
    Points
    65
    Par défaut
    merci waskol tous fonctionne trés bien
    problème résolu

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour info, tu pourra creuser le sujet un peu plus ici :
    http://www.efg2.com/Lab/OtherProject...erProjects.htm

    Je trouve que les Printer Demo sont des tutoriaux vraiment bien faits.
    A+
    Bidouilleuse Delphi

  14. #14
    Membre régulier Avatar de Bourak
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 231
    Points : 84
    Points
    84
    Par défaut
    Salut waskol

    J'ai suivi votre reponse pour l'option d'impression retco verso.
    Mais mon problème si comment connaitre que cette imprimante supporte l'option d'encodage des piste magnetique (carte magnetique)

    J'ai chercher dans les documentaion du SDK Windows mais pas du solution

    Merci d'avance

  15. #15
    Débutant

    Inscrit en
    Décembre 2003
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 166
    Points : 120
    Points
    120
    Par défaut
    Bonjour,
    je viens de lire ce thread et j'ai testé ce que vous aviez proposé.

    Le probleme que je rencontre et que mon imprimante supporte le Recto/Verso mais en mode Manuel.
    Je doit aller vers l'imprimante pour lui reinserer la page pour qu'elle imprime le verso.

    Quand j'utilise la fontion PrinterSupportsDuplex elle me renvoi False.... C'est une HP Laserjet 1300n

    Je viens de mettre les drivers a jour et j'ai toujours le probleme.

    Merci d'avance.

  16. #16
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par SubZero2 Voir le message
    Bonjour,
    je viens de lire ce thread et j'ai testé ce que vous aviez proposé.

    Le probleme que je rencontre et que mon imprimante supporte le Recto/Verso mais en mode Manuel.
    Je doit aller vers l'imprimante pour lui reinserer la page pour qu'elle imprime le verso.

    Quand j'utilise la fontion PrinterSupportsDuplex elle me renvoi False.... C'est une HP Laserjet 1300n

    Je viens de mettre les drivers a jour et j'ai toujours le probleme.

    Merci d'avance.
    Non, ton imprimante ne supporte pas le recto verso !!! Donc c'est normal si elle te renvoie false pour la fonction PrinterSupportsDuplex.

    Le "recto/verso" est juste une fonctionalité de ton pilote d'impression, rien de plus.

    Par exemple, dans ce cas, je peux très bien dire que les vieilles imprimantes à aiguilles étaient "recto-verso en mode manuel". Suffisait juste de retourner le papier pour passer le coté verso après avoir imprimé le coté recto.

    Bref, il ne faut pas confondre les possibilités de l'imprimante et les astuces qui permettent de contourner les limitations de cette imprimante.
    Bidouilleuse Delphi

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous ;o)

    après plusieurs de recherche concernant les impressions recto-verso, vos problèmes se rapprochent le plus du mien.
    Pour faire court, j'ai repisla maintenance d'un logiciel développé en D7 et dont les impressions sont générées par QR4.
    Mon soucis est assez simple, les rapports peuvent être imprimés en recto-verso mais le soucis, c'est que l'impression réalisée et de type 'reliure haut-bas' alors que dans la boite de sélection des paramètres d'impression, l'option sélectionnée est 'reliure gauche droite'.

    Après vérification du code, il a un forcing du duplex, j'ai tenté de modifier celui-ci en testant le duplex vertical et horizontal, même résultat.

    Quelqu'un aurait-il des idées sur le sujet ?

  18. #18
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ca c'est du déterrage de topic
    La simple différence, entre le recto-verso "reliure haut-bas" et "reliure gauche droite", est purement logicielle et n'est pas vraiment une propriété de l'imprimante.
    En fait, c'est le même recto-verso pour windows, auquel le logiciel rajouté une marge en haut ou à gauche de la page (pour laisser de la place à la reliure), c'est tout !
    Bidouilleuse Delphi

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    en parlant de déterrage ....

    ceci dit , un post récent sur le forum BI/autres
    il semblerait que printersettings.ExtendedDuplex soit la réponse
    je n'ai pas le matériel (vacances oblige) pour tester et la version de quickreport peut peut-être jouer , a vous de confirmer , esperont que ce ne soit pas un hoax
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/01/2007, 17h46
  2. comment lire les donner d'une resource?
    Par yoyolerigolo dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 31/07/2006, 10h04
  3. Comment acceder à la propriété d'une imprimante
    Par lassad dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/10/2005, 13h55
  4. Réponses: 5
    Dernier message: 19/07/2005, 21h54

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