unit PrinterNamesAndTrays;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, winspool, printers ;
procedure GetPrnBinNames(PrnName :
string ; BinList: TStrings; BinNrList : TStrings);
procedure GetPrnNames(PrnList: TStrings) ;
implementation
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;
procedure GetPrnNames(PrnList: TStrings) ;
begin
PrnList.assign (Printer.Printers) ;
end ;
procedure GetPrnBinNames(PrnName :
string ; BinList: TStrings; BinNrList : TStrings);
Var
Device, Driver, Port:
Array [0..255]
of Char;
hDevMode: THandle;
i, numBinNames, numBins, temp: Integer;
pBinNames: PBinnameArray;
pBins: PBinArray;
begin
// Printer.PrinterIndex := -1;
if PrnName = '
'
then Printer.PrinterIndex := Printer.PrinterIndex
else Printer.PrinterIndex := Printer.Printers.IndexOf(PrnName) ;
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: unterschiedliche Anzahl und Namen!');
end;
// if
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);
BinList.Clear();
BinNrList.Clear ;
for i:= 1
to numBinNames
do begin
temp := pBins^[i];
BinList.AddObject( pBinNames^[i], TObject(temp)) ;
BinNrList.AddObject( IntToStr(temp), TObject(temp)) ;
end;
finally
FreeMem(pBinNames);
if (pBins <>
nil)
then FreeMem(pBins);
end;
end;
// if
end;
end.