![]() |
Druckproblem
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:
Delphi-Quellcode:
Danach selektiere ich das Papierfach:
Printer.PrinterIndex := Printer.Printers.indexOf(printername);
Delphi-Quellcode:
Mein Problem liegt nun dabei, dass wenn ich drucke, nicht das richtige Papierfach gewählt wird.
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; 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 |
Re: Druckproblem
Hallo Sämy,
hab schon lang nix mehr mit der unit printers gemacht und aktuell auch keinen drucker zur verfügung. Was ich mich frage ist, weshalb nimmste nicht RAVE? ist doch in D2007 mit dabei und die haben das schon implementiert, den druckerschachtwechsel. Über das Codebased Printing, biste da auch recht flexibel, ausserdem haste dann schon einige features (z. B. Seitenvorschau) welche du verwendeten kannst, wenn du Lust und Laune hast. grüsse GG |
Re: Druckproblem
Mein Problem ist, dass ich diese Methode bereits an vielen Orten einsetze.
hat bis jetzt mit allen Druckern funktioniert. Ausser eben jetzt, da ich auf ein anderes Papierformat als A4 drucken will... (ka, wieso dies nicht auch funktionieren soll) Auf Rave umzustellen wäre ein enormer Zeitaufwand... Diese Zeit habe ich jedoch nicht. :s |
Re: Druckproblem
Hab es selbst rausgefunden.
Da ich von der Klasse TPrinter ableitete, musste ich beim ändern der Eigenschaft PrinterIndex noch SetPrinter aufrufen:
Delphi-Quellcode:
Danke trotzdem!
procedure TSZPrinter.setPrinterIndex(value: integer);
begin inherited PrinterIndex := value; { Reinit the hDMode } GetPrinter(aDevice, aDriver, aPort, hDMode); hDMode := 0; SetPrinter(aDevice, aDriver, aPort, hDMode); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz