|
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.
|