2008. szeptember 5., péntek
How to add all paper bins of an active printer to a TListBox
Problem/Question/Abstract:
How is it possible to add all paperbins from the active printer in a listbox (like in the PrinterSetupDialog)?
Answer:
uses
WinSpool;
procedure GetBinnames(sl: TStrings);
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;
Called like this:
GetBinnames(listbox1.items);
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése