Sonntag, 7. September 2008

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

Druckausgabe auf verschiede Schächte (Delphi5)

Frage: 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?

Antwort: Das folgende Beispiel für Delphi 4 demonstriert die Schachtsteuerung beim Laser-Drucker Brother HL-1260. Über die Hilfsmethode GetBinnames kann man aber den eigenen Drucker abfragen, welche Schachtbezeichnungen der verwendete Treiber nutzt. Der PDEVMODE-Eintrag dmDefaultSource legt den Papierschacht fest, allerdings wird diese Einstellung nur dann berücksichtigt, wenn vorher über die Konfiguration von dmFields die Schachtänderung auch angekündigt wird.

// Beispiel für Delphi 4

unit SelectPrinterBinFrm;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{ *.DFM}
uses Printers, WinSpool;
procedure TForm1.Button1Click(Sender: TObject); var aDevice : array[0..255] of char; aDriver : array[0..255] of char; aPort : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE; begin Printer.PrinterIndex := -1; Printer.GetPrinter(aDevice, aDriver, aPort, hDMode); if hDMode <> 0 then begin pDMode := GlobalLock(hDMode); if pDMode <> nil then begin // A4 pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE; pDMode^.dmPaperSize := DMPAPER_A4; { Druckerschacht (brother HL-1260) Automatische Auswahl (269) Oberer Papierschacht (1) Manuelle Papierzufuhr (4) Briefumschlag, Manuelle (6) Unterer Papierschacht (2) } pDMode^.dmFields := pDMode^.dmFields or DM_DEFAULTSOURCE; pDMode^.dmDefaultSource := DMBIN_MANUAL; //269; GlobalUnlock(hDMode); end; end; with Printer do begin PrinterIndex := Printer.PrinterIndex; BeginDoc; Canvas.TextOut(100,100, 'Aus welchem Schacht kommt dieses Blatt?'); EndDoc; end; end;
procedure GetBinnames(aStringList: TStrings); type TBinName = array [0..23] of Char; TBinNameArray = array [1..99] of TBinName; PBinnameArray = ^TBinNameArray; TBinArray = array [1..99] of Word; PBinArray = ^TBinArray; var szDevice, szDriver, szPort : array[0..255] of Char; hDevMode : THandle; i, iBinNames, iBins : Integer; pBinNames : PBinnameArray; pBins : PBinArray; begin Printer.PrinterIndex := -1; Printer.GetPrinter(szDevice, szDriver, szPort, hDevmode); iBinNames := DeviceCapabilities(szDevice, szPort, DC_BINNAMES, nil, nil); if iBinNames > 0 then begin pBins := nil; GetMem(pBinNames, iBinNames * Sizeof(TBinname)); GetMem(pBins, iBins * Sizeof(Word)); try DeviceCapabilities(szDevice, szPort, DC_BINNAMES, PChar(pBinNames), nil); DeviceCapabilities(szDevice, szPort, DC_BINS, PChar(pBins), nil); aStringList.Clear; for i:= 1 to iBinNames do aStringList.Add(Format('%s (%d)',[pBinNames^[i], pBins^[i]])); finally FreeMem(pBinNames ); if pBins <> nil then FreeMem(pBins); end; end; end;
procedure TForm1.Button2Click(Sender: TObject); begin GetBinnames(Memo1.Lines); end;
end.






Software & Support Verlag GmbH