Hallo,
mit der unten aufgeführten Funktion ist es möglich eine PRN-Datei direkt zu drucken (über einen zuvor ausgewählten Drucker). Auch nach zahlreichen Versuchen (und ausgiebigen Recherchen im Internet) gelingt es mir leider nicht vor dem Drucken die Druckeinstellungen zu ändern (wie Anzahl der Kopien, Druckerschacht, Orientation usw...).
Laut einer
MSDN-FAQ werden die Druckeinstellungen in der PRN-Datei favorisiert, so dass die Standardeinstellungen des Druckers nicht berücksichtigt werden.
Ich weiß wie man temporär (über Delphi Printer-Objekt und über die
JEDI-
Unit JclPrint) oder global (über die WinSpool-Funktionen "DocumentProperties" und "SetPrinter") die Druckereinstellungen ändern kann. Das klappt ohne Probleme.
Aber ich kann einfach nicht daran glauben, dass man beim Drucken von PRN-Dateien (mit OpenPrinter und WritePrinter) keinen Druckerschacht vorgeben oder ihn nachträglich ändern kann!
Die Funktion, die ich oben erwähnt habe:
Delphi-Quellcode:
Printer.PrinterIndex := PrIndex; //einen Drucker auswählen
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
If Not WinSpool.OpenPrinter(@Device, hPrinter, nil) Then Exit;
DocInfo.pDocName := 'C:\Druckdatei.prn'; //die Datei, die an einen Drucker weitergeleitet werden soll
DocInfo.pOutputFile := Nil;
DocInfo.pDatatype :='RAW';
StartDocPrinter(hPrinter, 1, @DocInfo);
StartPagePrinter(hPrinter);
//die PRN-Datei mit WritePrinter ausdrucken:
System.Assign(f, string(sFileName));
try
Reset(f, 1);
GetMem(Buffer, cBUFSIZE);
While Not Eof(f) Do
begin
Blockread(f, Buffer^, cBUFSIZE, Count);
If Count > 0 Then
begin
If Not WritePrinter(hPrinter, Buffer, Count, BytesWritten) Then
begin
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
FreeMem(Buffer, cBUFSIZE);
Exit;
end;
end;
end;
FreeMem(Buffer, cBUFSIZE);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
finally
System.CloseFile(f);
end;
Das Drucken von einfachem Text funktioniert ja (auch mit Vorgabe des Druckerschachts und Anzahl der Kopien). Hier ein Beispiel mit JCLPrint:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
PSet:TJclPrintSet;
begin
PSet:= TJclPrintSet.Create;
Pset.Copies:=2; //Anzahl der Kopien
Pset.BinIndex:=4; //Druckerschacht
printer.Orientation:=poLandscape;
printer.BeginDoc;
printer.Canvas.textout(0,0,'Ein Test'); //kommt im Schacht Nr. 4 zwei mal raus!
printer.EndDoc;
end;
Ich bin euch für jeden Hinweis dankbar!
Die Hintergrundinformationen findet ihr im Anhang: