Announcement

Collapse
No announcement yet.

Druckausgabe auf verschieden Schächte (Delphi5)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Druckausgabe auf verschieden Schächte (Delphi5)

    Hallo.

    Für meine Anwendung möchte ich im Druck (Ausgabe über Printers.) bei einem HP-Drucker sagen können, aus welchem Schacht der fertige Druck herauskommen soll.
    Ist das Programmtechnisch möglich?
    Weiß dort jemand eine Lösung?

    MfG
    Thorsten

  • #2
    Hallo,

    das folgende Beispiel (Delphi 4) demonstriert die Schachtsteuerung beim Laser-Drucker <i>Brother HL-1260</i>. Über die Hilfsmethode <i>GetBinnames</i> kann man aber den eigenen Drucker abfragen, welche Schachtbezeichnungen der verwendete Treiber nutzt. Der <i>PDEVMODE</i>-Eintrag <b>dmDefaultSource</b> legt den Papierschacht fest, allerdings wird diese Einstellung nur dann berücksichtigt, wenn vorher über die Konfiguration von <b>dmFields</b> die Schachtänderung auch angekündigt wird.
    <pre>
    <font color="#003399"><i>// Beispiel für Delphi 4</i></font>
    <br>
    <b>unit</b> SelectPrinterBinFrm;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls;
    <br>
    <b>type</b>
    TForm1 = <b>class</b>(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    <b>procedure</b> Button1Click(Sender: TObject);
    <b>procedure</b> Button2Click(Sender: TObject);
    <b>private</b>
    <font color="#003399"><i>{ Private-Deklarationen }</i></font>
    <b>public</b>
    <font color="#003399"><i>{ Public-Deklarationen }</i></font>
    <b>end</b>;
    <br>
    <b>var</b>
    Form1: TForm1;
    <br>
    <b>implementation</b>
    <br>
    <font color="#003399"><i>{$R *.DFM}</i></font>
    <br>
    <b>uses</b> Printers, WinSpool;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    aDevice : <b>array</b>[0..255] <b>of</b> char;
    aDriver : <b>array</b>[0..255] <b>of</b> char;
    aPort : <b>array</b>[0..255] <b>of</b> char;
    hDMode : THandle;
    PDMode : PDEVMODE;
    <b>begin</b>
    Printer.PrinterIndex := -1;
    Printer.GetPrinter(aDevice, aDriver, aPort, hDMode);
    <b>if</b> hDMode &lt;&gt; 0 <b>then</b> <b>begin</b>
    pDMode := GlobalLock(hDMode);
    <b>if</b> pDMode &lt;&gt; <b>nil</b> <b>then</b> <b>begin</b>
    <font color="#003399"><i>// A4</i></font>
    pDMode^.dmFields := pDMode^.dmFields <b>or</b> DM_PAPERSIZE;
    pDMode^.dmPaperSize := DMPAPER_A4;
    <font color="#003399"><i>{ Druckerschacht (brother HL-1260)
    Automatische Auswahl (269)
    Oberer Papierschacht (1)
    Manuelle Papierzufuhr (4)
    Briefumschlag, Manuelle (6)
    Unterer Papierschacht (2)
    }</i></font>
    pDMode^.dmFields := pDMode^.dmFields <b>or</b> DM_DEFAULTSOURCE;
    pDMode^.dmDefaultSource := DMBIN_MANUAL; <font color="#003399"><i>//269;</i></font>
    GlobalUnlock(hDMode);
    <b>end</b>;
    <b>end</b>;
    <b>with</b> Printer <b>do</b>
    <b>begin</b>
    PrinterIndex := Printer.PrinterIndex;
    BeginDoc;
    Canvas.TextOut(100,100, <font color="#9933CC">'Aus welchem Schacht kommt dieses Blatt?'</font>);
    EndDoc;
    <b>end</b>;
    <b>end</b>;
    <br>
    <b>procedure</b> GetBinnames(aStringList: TStrings);
    <b>type</b>
    TBinName = <b>array</b> [0..23] <b>of</b> Char;
    TBinNameArray = <b>array</b> [1..99] <b>of</b> TBinName;
    PBinnameArray = ^TBinNameArray;
    TBinArray = <b>array</b> [1..99] <b>of</b> Word;
    PBinArray = ^TBinArray;
    <b>var</b>
    szDevice, szDriver, szPort : <b>array</b>[0..255] <b>of</b> Char;
    hDevMode : THandle;
    i, iBinNames, iBins : Integer;
    pBinNames : PBinnameArray;
    pBins : PBinArray;
    <b>begin</b>
    Printer.PrinterIndex := -1;
    Printer.GetPrinter(szDevice, szDriver, szPort, hDevmode);
    iBinNames := DeviceCapabilities(szDevice, szPort, DC_BINNAMES, <b>nil</b>, <b>nil</b>);
    <b>if</b> iBinNames &gt; 0 <b>then</b>
    <b>begin</b>
    pBins := <b>nil</b>;
    GetMem(pBinNames, iBinNames * Sizeof(TBinname));
    GetMem(pBins, iBins * Sizeof(Word));
    <b>try</b>
    DeviceCapabilities(szDevice, szPort, DC_BINNAMES, PChar(pBinNames), <b>nil</b>);
    DeviceCapabilities(szDevice, szPort, DC_BINS, PChar(pBins), <b>nil</b>);
    aStringList.Clear;
    <b>for</b> i:= 1 <b>to</b> iBinNames <b>do</b>
    aStringList.Add(Format(<font color="#9933CC">'%s (%d)'</font>,[pBinNames^[i], pBins^[i]]));
    <b>finally</b>
    FreeMem(pBinNames );
    <b>if</b> pBins &lt;&gt; <b>nil</b> <b>then</b>
    FreeMem(pBins);
    <b>end</b>;
    <b>end</b>;
    <b>end</b>;
    <br>
    <b>procedure</b> TForm1.Button2Click(Sender: TObject);
    <b>begin</b>
    GetBinnames(Memo1.Lines);
    <b>end</b>;
    <br>
    <b>end</b>.
    </pre&gt

    Comment


    • #3
      Hi,

      da bin ich wohl etwas missverstanden worden.
      Woher das Papier gezogen wird, habe ich schon hinbekommen, aber danke.

      Ich muss allerdings auch steuern können, in welchen Ausgabeschacht der Druck gehen soll, also eine Verteilung der Ausdrucke.
      Gibt es da auch eine Lösung?

      MfG
      Elm

      Comment


      • #4
        Hat sich erledigt.

        Habe erfahren, dass das Ansteuern nur am Drucker zu machen ist.

        Aber danke

        Comment

        Working...
        X