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:
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;
Ist irgendwas hier im Code nicht richtig?
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