How to add all paper bins of an active printer to a TListBox (Views: 29)
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); |