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

Composants VCL Delphi Discussion :

Sélection du bac d'impression


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut Sélection du bac d'impression
    Bonjour tout le monde,

    J'ai un nouveau problème d'impression. Je voudrais sélectionner le bac papier d'une imprimante et quoi que je fasse, l'imprimante prend les feuilles dans son bac par défaut. voici ce que j'ai fait :

    Affichage de la liste des bacs disponibles pour une imprimante :
    ComboBox2 contient le nom de mon imprimante.
    La liste des bacs est affichée dans ComboBox4.

    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
     
    Procedure TImprimer_Doc.RemplirSourcesPapier;
    Type
      TBinName      = array [0..23] of Char;
      TBinNameArray = array [1..High(Integer) div SizeOf(TBinName)] of TBinName;
      PBinnameArray = ^TBinNameArray;
      TBinArray     = array [1..High(Integer) div SizeOf(Word)] of Word;
      PBinArray     = ^TBinArray;
     
    Var
      Device, Driver, Port: array [0..255] of Char;
      hDevMode: THandle;
      i, numBinNames, numBins, temp: Integer;
      pBinNames: PBinnameArray;
      pBins: PBinArray;
      TrayName : AnsiString;
     
    Begin
         ComboBox4.Clear;
         If ComboBox2.Text = '' Then Exit;
     
         Printer.PrinterIndex:=PrntIndex;
         Printer.GetPrinter(Device, Driver, Port, hDevmode);
         numBinNames := WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES, nil, nil);
         numBins     := WinSpool.DeviceCapabilities(Device, Port, DC_BINS, nil, nil);
         If numBins <> numBinNames Then
         raise Exception.Create('DeviceCapabilities reports different number of bins and bin names!');
     
         If numBinNames > 0 Then
         Begin
              pBins := Nil;
              GetMem(pBinNames, numBinNames * SizeOf(TBinname));
              GetMem(pBins, numBins * SizeOf(Word));
              Try
                 WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES, PChar(pBinNames), Nil);
                 WinSpool.DeviceCapabilities(Device, Port, DC_BINS, PChar(pBins), Nil);
                 For i := 1 To numBinNames Do
                 Begin
                      temp := pBins^[i];
                      ComboBox4.Items.AddObject(pBinNames^[i], TObject(temp));
                 End;
              Finally
                     FreeMem(pBinNames);
                     If pBins <> Nil Then
                     FreeMem(pBins);
              End;
         End;
         ComboBox4.ItemIndex:=0;
    End;
    Sélection des propriétés de l'imprimante :
    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 TImprimer_Doc.SelectionPrinterIndex(PrinterIndex_ : Integer);
    Var
       FDevice,FDriver,FPort: array [0..255] of Char;
       DeviceMode: THandle;
       DevMode: PDeviceMode;
     
    Begin
         Printer.PrinterIndex:=PrinterIndex_;
         Printer.GetPrinter(FDevice, FDriver, FPort, DeviceMode);
         DevMode := GlobalLock(DeviceMode);
         CodeTray:=0;
         If ComboBox4.Items.Count > 0 Then
         CodeTray:=Integer(ComboBox4.Items.Objects[ComboBox4.ItemIndex]);
     
         DevMode^.dmFields:=DevMode^.dmFields or DM_DEFAULTSOURCE;
         DevMode^.dmDefaultSource:=CodeTray;
     
         ShowMessage(IntTOStr(DevMode^.dmDefaultSource));
     
         Printer.SetPrinter( FDevice , FDriver, FPort, DeviceMode);
         GlobalUnlock(DeviceMode);
    End;
    J'ai vérifié, la variable "CodeTray" contient le bon code correspondant au bac que je voudrais sélectionner.

    Si j'imprimer un document comme cela, le papier est toujours pris dans le bac par défaut de l'imprimante.

    Est-ce que vous avez une idée d'une solution?

    Merci d'avance

  2. #2
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    Bon problème a avancé (Mais n'est pas résolu). Je ne rencontre ce problème que si j'imprime un rapport QuickReport. Si j'imprime juste du texte sur une page, le bac d'impression est sélectionné correctement

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 680
    Points : 7 102
    Points
    7 102
    Par défaut
    Pour QuickReport, je détecte que l'imprimante est multi-bac, et je fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            if "multi-bac" then
                if ..... then
                   FormQrCBA4.QuickRep.PrinterSettings.OutputBin := Lower
                else
                   FormQrCBA4.QuickRep.PrinterSettings.OutputBin := Upper;
             end
             else
                FormQrCBA4.QuickRep.PrinterSettings.OutputBin := Auto;
    Faut peut-être ce uses QRPrntr.

Discussions similaires

  1. [AC-2003] problème de BAC à l'impression
    Par funkyjul dans le forum IHM
    Réponses: 4
    Dernier message: 30/08/2011, 10h38
  2. Sélection de ligne pour impression
    Par Niluge21 dans le forum WinDev
    Réponses: 1
    Dernier message: 04/12/2009, 21h58
  3. [Quick Report] - Sélection d'un bac d'impression.
    Par Argonz dans le forum Outils
    Réponses: 3
    Dernier message: 07/07/2007, 07h20
  4. Sélection du bac d'une imprimante
    Par olivc dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/12/2005, 13h08
  5. choisir le bac d'impression
    Par fitou45 dans le forum Access
    Réponses: 1
    Dernier message: 14/09/2005, 11h53

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