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 :

[D6] Comment gérer les bacs de l'imprimante ?


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut [D6] Comment gérer les bacs de l'imprimante ?
    Comment gérer les bacs de l'imprimante, de manière à lancer certain document sur un bac, et d'autre sur un autre bac ?

    J'ai vu que je ne suis pas le seul à poser la question, mais je n'ai vu aucune réponse (http://www.developpez.net/forums/showthread.php?t=75867).

    Citation Envoyé par Laurent Dardenne Voir le message
    As-tu effectué une recherche sur les newsgroupe Borland ou MS ?
    J'ai suivi le conseil, et j'ai trouvé ca : http://codecentral.borland.com/Item.aspx?id=490
    Le problème, c'est qu'il faut s'enregistrer, et quand j'essai (http://codecentral.borland.com/Download.aspx?id=490), il me dit que l'adresse mail est déjà prise (ce qui est impossible).

    Quelqu'un aurait-il la solution ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 731
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 731
    Points : 15 136
    Points
    15 136
    Par défaut
    Yep !

    Cherche à partir de là (peux pas essayer, ma laser n'a qu'un seul bac, )
    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
    uses
      WinSpool, Printers;
     
    procedure GetPaperBins(sl: TStrings);
    //http://www.swissdelphicenter.ch/torry/showcode.php?id=796
    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;
    begin
      Printer.PrinterIndex := -1;
      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
      begin
        raise Exception.Create('DeviceCapabilities reports different number of bins and bin names!');
      end;
      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);
          sl.Clear;
          for i := 1 to numBinNames do
          begin
            temp := pBins^[i];
            sl.addObject(pBinNames^[i], TObject(temp));
          end;
        finally
          FreeMem(pBinNames);
          if pBins <> nil then
            FreeMem(pBins);
        end;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetPaperBins(Listbox1.Items);
    end;
    Mes 2 cts,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Ce code-là, je l'ai déjà testé, et effectivement, il détecte bien les bacs.


    Par contre, j'ai pas vu de fonctions dans WinSpool pour sélectionner les bacs.

    Je creuse ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut
    J'ai réussi à accéder à la page des newsgroup borland :
    > Anyone know how to easily change printer bins on the fly. Any assistance
    > would be much appreciated.
    > Howard

    One way to change printer settings at the start
    of a print job is to change the printers devicemode.

    See: TDEVMODE in the Delphi 1.02 help file or DEVMODE
    in the Delphi 2.01 help file for other settings you can
    change (providing the print driver supports the change).


    Here is an example of changing paper sizes:

    var
    Device : array[0..255] of char;
    Driver : array[0..255] of char;
    Port : array[0..255] of char;
    hDMode : THandle;
    PDMode : PDEVMODE;
    begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.GetPrinter(Device, Driver, Port, hDMode);
    if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
    pDMode^.dmPaperSize := DMPAPER_LEGAL;
    GlobalUnlock(hDMode);
    end;
    end;
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.BeginDoc;
    Printer.Canvas.TextOut(100,100, 'Test 1');
    Printer.EndDoc;
    end;


    Joe
    --
    Joe C. Hecht
    Mais je ne pense pas que la définition du PaperSize m'aide à choisir les bacs de l'imprimante.


    Sinon, j'ai trouvé une fonction qui a l'air intéressante (http://www.developpez.net/forums/sho...d.php?t=251013): WinSpool.AdvancedDocumentProperties.
    Le problème, c'est comment allouer PDeviceModeA.

    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
    procedure TForm1.Button2Click(Sender: TObject);
    var
       nIndex, nTaille: Integer;
       phPrinter: Cardinal;
       _PPrinterDefaultsA: PPrinterDefaultsA;
    //   Device, Driver, Port: array [0..255] of Char;
    //   hDevMode: THandle;
       pDEVMODE1: PDeviceModeA;
    begin
       Listbox.Clear;
       nIndex := Printer.PrinterIndex;
       Printer.PrinterIndex := Printer.Printers.IndexOf('imp-hm-be1');
       try
          GetMem(_PPrinterDefaultsA, SizeOf(TPrinterDefaultsA));
          _PPrinterDefaultsA.pDatatype := nil;
          _PPrinterDefaultsA.pDevMode := nil;
          _PPrinterDefaultsA.DesiredAccess := PRINTER_ACCESS_ADMINISTER;    // SERVER_ALL_ACCESS;       
     
          if not OpenPrinter('imp-hm-be1', phPrinter, _PPrinterDefaultsA) then
          begin
             ShowMessage(SysErrorMessage(GetLastError));
             Exit;
          end;
    //      Printer.GetPrinter(Device, Driver, Port, hDevmode);                 //Device
          GetMem(pDEVMODE1, SizeOf(DEVMODE));
          WinSpool.AdvancedDocumentProperties(Form1.Handle, phPrinter, 'imp-hm-be1', pDEVMODE1, nil);
          nTaille := pDEVMODE1.dmSize;
          FreeMem(pDEVMODE1);
     
          GetMem(pDEVMODE1, nTaille * SizeOf(DEVMODE));
          if WinSpool.AdvancedDocumentProperties(Form1.Handle, Printer.Handle, 'imp-hm-be1', pDEVMODE1, nil) = 0 then
          begin
             ShowMessage(SysErrorMessage(GetLastError));   <-------- ERREUR DECLANCHEE ICI
             Exit;
          end;
     
          ListBox.Items.Add('dmDeviceName :  ' + pDEVMODE1.dmDeviceName);
          ListBox.Items.Add('dmColor :  ' + IntToStr(pDEVMODE1.dmColor));
          ListBox.Items.Add('dmDefaultSource :  ' + IntToStr(pDEVMODE1.dmDefaultSource));
          FreeMem(pDEVMODE1);
       finally
          Printer.PrinterIndex := nIndex;
       end;
    end;
    J'ai l'erreur "Descripteur non valide" à l'appel de AdvancedDocumentProperties.

    Une idée ...?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Bon, j'arrive enfin à sélectionner le bac parmis la liste des bacs de l'imprimante (en affichant la boîte de dialogue ou non), mais ça n'a aucun effet.

    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
    var
       nIndex, nTaille: Integer;
       pDEVMODE1: PDeviceMode;
       Device, Driver, Port: array [0..255] of Char;
       hDevMode: THandle;
    begin
       Listbox.Clear;
       nIndex := Printer.PrinterIndex;               
    //   Printer.PrinterIndex := Printer.Printers.IndexOf('imp-hm-be1');
       try
          Printer.GetPrinter(Device, Driver, Port, hDevmode);
     
          pDEVMODE1 := nil;   
          nTaille := WinSpool.DocumentProperties(0, 0, Device, pDEVMODE1^, pDEVMODE1^, 0);
     
     
          GetMem(pDEVMODE1, nTaille * SizeOf(DEVMODE));
          WinSpool.DocumentProperties(0, 0, Device, pDEVMODE1^, pDEVMODE1^, {DM_IN_PROMPT or} DM_OUT_BUFFER);
     
          ListBox.Items.Add('dmDeviceName :  ' + pDEVMODE1^.dmDeviceName);
          ListBox.Items.Add('dmColor :  ' + IntToStr(pDEVMODE1^.dmColor));
          ListBox.Items.Add('dmDefaultSource :  ' + IntToStr(pDEVMODE1^.dmDefaultSource));
     
          pDEVMODE1.dmDefaultSource := DMBIN_MANUAL;
          WinSpool.DocumentProperties(0, 0, Device, pDEVMODE1^, pDEVMODE1^, DM_IN_BUFFER or DM_OUT_BUFFER);
     
          ListBox.Items.Add('');
          ListBox.Items.Add('dmDeviceName :  ' + pDEVMODE1^.dmDeviceName);
          ListBox.Items.Add('dmColor :  ' + IntToStr(pDEVMODE1^.dmColor));
          ListBox.Items.Add('dmDefaultSource :  ' + IntToStr(pDEVMODE1^.dmDefaultSource));
     
          FreeMem(pDEVMODE1);    
       finally
          Printer.PrinterIndex := nIndex;
       end;
     
       // ------------------------------------------------
       Printer.BeginDoc;
       Printer.Canvas.TextOut(StrToInt(Edit1.Text), StrToInt(Edit2.Text), 'Test X');
       Printer.EndDoc;


    Pourtant, j'ai l'impression d'avoir bien suivi les étapes :
    http://support.microsoft.com/kb/167345
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Victoire !!!

    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
    var
       nIndex: Integer;
       pDEVMODE1: PDeviceMode;
       Device, Driver, Port: array [0..255] of Char;
       hDevMode: THandle;
    begin
       Listbox.Clear;
       nIndex := Printer.PrinterIndex;               
    //   Printer.PrinterIndex := Printer.Printers.IndexOf('imp-hm-be1');
     
     
       try
          Printer.GetPrinter(Device, Driver, Port, hDevmode);
          pDEVMODE1 := GlobalLock(hDevmode);
     
          ListBox.Items.Add('dmDeviceName :  ' + pDEVMODE1^.dmDeviceName);
          ListBox.Items.Add('dmColor :  ' + IntToStr(pDEVMODE1^.dmColor));
          ListBox.Items.Add('dmDefaultSource :  ' + IntToStr(pDEVMODE1^.dmDefaultSource));
     
          pDEVMODE1.dmDefaultSource := DMBIN_MANUAL;
     
          ListBox.Items.Add('');
          ListBox.Items.Add('dmDeviceName :  ' + pDEVMODE1^.dmDeviceName);
          ListBox.Items.Add('dmColor :  ' + IntToStr(pDEVMODE1^.dmColor));
          ListBox.Items.Add('dmDefaultSource :  ' + IntToStr(pDEVMODE1^.dmDefaultSource));
     
          Printer.SetPrinter(Device, Driver, Port, hDevmode);
     
          // ------------------------------------------------
          Printer.BeginDoc;
          Printer.Canvas.TextOut(StrToInt(Edit1.Text), StrToInt(Edit2.Text), 'Test poiop');
          Printer.EndDoc;
     
          GlobalUnlock(hDevmode);
       finally
          Printer.PrinterIndex := nIndex;
       end;
    Bon, bin faut jouer avec GetPrinter et SetPrinter.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. Comment Gérer les imprimantes sous AS400
    Par nasr_live dans le forum AS/400
    Réponses: 2
    Dernier message: 01/08/2009, 18h57
  2. Gérer les bacs de l'imprimante
    Par Yphon dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 09/12/2005, 19h54
  3. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  4. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

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