![]() |
Drucken auf feste Drucker: Wie würdet ihr das lösen?
Hi allerseits,
ich bin derzeit am Verzweifeln, da ich mit dem Drucken unter Windows massive Probleme habe. Ich möchte passend zu Lieferscheine je Position Etiketten drucken. Zuerst werden die Lieferscheine per FreeReport erzeugt und gedruckt. Anschließend werden die Etiketten (ohne Reportgenerator) in einem Druckstring aufbereitet, der je Etikett und direkt an den entsprechenden Windows-Drucker gesendet wird. Ich verwende dazu den Treiber 'Generic / Text only', da so der komplette Druckstring (mehr oder weniger) ohne Änderung an den Drucker weitergegeben wird und der Windows-Druckmanager sich um Pufferüberläufe oder andere Probleme kümmern kann. Damit das ganze mit möglichst wenig Eingriffe des Users stattfinden kann, habe ich die Druckernamen in eine ini-Datei geschrieben und setze vor dem Lieferschein- bzw. Etikettendruck entsprechend den Standarddrucker und anschließend den vorher einstellten Standarddrucker wieder zurück.
Delphi-Quellcode:
Ist irgendwas hier im Code nicht richtig?
SetDefaultPrinter(Lieferscheindrucker);
Drucke_FreeReport; SetDefaultPrinter(EtikettenDrucker); while not lieferschein.positionen eof do begin Drucke_RohString(Etikett); next; end; SetDefaultPrinter(OriginalDrucker); //Setzen des StandardDruckers procedure TFMain.SetDefaultPrinter(PrinterName: String); var i: Integer; Device, Driver, Port : PChar; HdeviceMode: Thandle; aPrinter : TPrinter; begin Printer.PrinterIndex := -1; OriginalDrucker := Printer.Printers[Printer.PrinterIndex]; getmem(Device, 255); getmem(Driver, 255); getmem(Port, 255); aPrinter := TPrinter.create; for i := 0 to Printer.printers.Count-1 do begin if (uppercase(Printer.printers[i]) = uppercase(PrinterName)) then begin aprinter.printerindex := i; aPrinter.getprinter(device, driver, port, HdeviceMode); StrCat(Device, ','); StrCat(Device, Driver ); StrCat(Device, Port ); WriteProfileString('windows', 'device', Device); StrCopy( Device, 'windows' ); SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@Device)); end; end; Freemem(Device, 255); Freemem(Driver, 255); Freemem(Port, 255); aPrinter.Free; end; //Der Etikettendruck procedure TFMain.DruckeRoh_String(DiesenText:string); var MyPrinter : array [0..255] of char; p : Integer; begin // Wie kann ich hier statt PChar(Eti...) den Namen des aktuell gesetzten StdDruckers wählen? StrLCopy(MyPrinter, PChar(Etikettendrucker), SizeOf(MyPrinter) - 1); GetProfileString ('windows', 'device', ',,,', MyPrinter, sizeof(MyPrinter)); p := Pos (',', MyPrinter); if p > 0 then MyPrinter[p - 1] := #0; // hiermit wird der String auf den Drucker ausgegeben RawDataToPrinter(MyPrinter, DiesenText, length(DiesenText)); end; Das Programm soll auf den Windows-Versionen NT4, 2000 und XP funktionieren. Mein Problem ist, dass ab und an nichts am Etikettendrucker ankommt. Bei mir am Delphi-Rechner funktioniert alles, so dass ich per schrittweiser Auswertung des Codes nichts nachvollziehen kann. Wie würdet ihr das ganze machen? Gruß, Peter |
Re: Drucken auf feste Drucker: Wie würdet ihr das lösen?
Schmeiss deine Funktion DruckeRoh_String in die Tonne und verwende:
![]() Du siehst, dass du der Procedure RAWPrint den Druckernamen als Parameter mitgeben kannst. Also lass die Finger weg vom Verändern des Standarddruckers und alles wird gut. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 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