Hallo
Ich bin am Verzweifeln... Ich probiere auf einem Drucker aus einem bestimmten Papierfach zu drucken.
Mein Vorgehen:
Als erstes wähle ich den Drucker:
Printer.PrinterIndex := Printer.Printers.indexOf(printername);
Danach selektiere ich das Papierfach:
Delphi-Quellcode:
printer.setPaperTrayIndex(printer.getPaperTrays.indexOf(trayname));
[...]
function TSZPrinter.getPaperTrays: TStrings;
var
pDevMode: PDeviceMode;
bin: array[0..255,0..23] of Char;
x: integer;
res: integer;
begin
if not Assigned(FPaperTrays) then
FPaperTrays := TStringList.Create;
FPaperTrays.Clear;
GetPrinter(aDevice, aDriver, aPort, hDMode);
pDevMode := nil;
res := DeviceCapabilities(aDevice, aPort, DC_BINNAMES, PChar(@(bin[0][0])), pDevMode);
for x := 0 to res - 1 do
FPaperTrays.Add(bin[x]);
Result := FPaperTrays;
end;
procedure TSZPrinter.setPaperTrayIndex(value: integer);
var
pDevMode: PDeviceMode;
p: array [0..99] of Word;
res: integer;
begin
if Printing then
raise EPrinter.Create(SPrinting);
if (value < 0) or (value >= PaperTrays.Count) then
Exit;
FPaperTrayIndex := Value;
GetPrinter(aDevice, aDriver, aPort, hDMode);
if hDMode = 0 then
begin
SetPrinter(aDevice, aDriver, aPort, hDMode);
GetPrinter(aDevice, aDriver, aPort, hDMode);
end;
pDevMode := nil;
res := DeviceCapabilities(aDevice, aPort, DC_BINS,PCHAR(@p[0]), pDevMode);
if (FPaperTrayIndex <= res) and (hDMode <> 0) then
begin
pDevMode := GlobalLock(hDMode);
if Assigned(pDevMode) then
begin
pDevMode^.dmFields := pDevMode^.dmFields or DM_DEFAULTSOURCE; // <----
pDevMode^.dmDefaultSource := p[FPaperTrayIndex];
end;
GlobalUnlock(hDMode);
end;
end;
Mein Problem liegt nun dabei, dass wenn ich drucke, nicht das richtige Papierfach gewählt wird.
Ich habe bemerkt, dass die Eigenschaft pDevMode^.dmDeviceName (lese ich per debugger an der mit <---- gekennzeichneten Stelle aus) nicht den richtigen Druckernamen angibt.
Weiter habe ich bemerkt, dass es bei
einzelnen Druckern funktioniert, wenn ich den Schacht nicht per Namen, sondern direkt über dessen Id selektiere.
Kann mir jemand einen Tipp geben, wie ich dieses Problem lösen könnte?
Danke
Sämy
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.