Textseite ist ok. Meine Programme die mit delph5 erzeugt wurden können sauber auf die Schächte zugreifen.
Sobald die selben Programme jedoch mit delphi 2009 erzeugt werden nur standartschacht möglich.
Also bisher habe ich bei jedem neuen Drucker mit unterem Programm die Schächte ausgelesen.
Bsp. HP 2055 Schacht 3 kann mit CustomBinCode:=260 angesteuert werden.
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
hDevMode: THandle;
Device,Driver,Port: array [0..1024] of Char;
bin: integer;
DevMode : PDevMode;
UserCollateCode: integer;
result:integer;
begin
Printer.GetPrinter(Device,Driver,Port,hDevMode);
bin := -1;
if hDevMode <> 0 then
begin
DevMode := GlobalLock (hDevMode);
//members von DevMode
bin := DevMode^.DMDEFAULTSOURCE;
UserCollateCode := DevMode^.dmCollate;
GlobalUnlock (hDevMode);
end;
result := bin;
showmessage(inttostr(result));
end;
procedure GetPaperBins(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;
Danach habe ich die Schächte in einer Datenbank hinterlegt und bei den einzelnen Programmen aufgerufen:
rechnung.rechnung.PrinterSettings.PrintMetaFile := True;
rechnung.rechnung.PrinterSettings.UseCustomBinCode := True;
rechnung.rechnung.PrinterSettings.CustomBinCode:=2 60;
Hat bisher immer sauber funktioniert bei HP, Koycera,Cannon.
Habe die selben Ergebnisse bei Rave, Fastreport und Quickreport. Es muß ein Delphi2009 Problem sein.
Sobald die Schächte eingestellt sind (auch über printersetup) überschreibt delphi die Eingaben und geht auf Standartdrucker und Standartschacht.
Hoffe auf Eure Hilfe.
Jürgen