![]() |
Quickreport und Windows-Pdf-Printer
Hallo in die Runde,
hat jemand eine Idee, wie ich einem Quickreport bei der Ausgabe über den Windows PDF-Printer den Dateinamen mitgeben kann? Vielen Dank Frank |
AW: Quickreport und Windows-Pdf-Printer
Hallo
ich mache das so.
Delphi-Quellcode:
Gruss
DateiName := EPANr.Text +'_'+ EdArtikelnummer.Text +'_'+ FMesswerkzeug.ESerieNr.Text +'.pdf';
DateiName := CheckCharsInString(['\','/',':','?','"','<','>','|','*'], '_', DateiName); SavePDF.FileName := DateiName; if SavePDF.Execute then begin expFilt := TQRPDFDocumentFilter.create(SavePDF.FileName); |
AW: Quickreport und Windows-Pdf-Printer
Zitat:
Ohne tiefe Eingriffe in den Code von QuickReport wird das kaum möglich sein. Das Windows-API bietet zwar eine Möglichkeit, den Ausgabe-Dateinamen beim Start des Druckjobs mitzugeben, aber leider ist dies in Vcl.Printers.pas so verkapselt, dass man da nicht dran kommt:
Code:
TPrinter.BeginDoc() ist leider nicht virtuell, kann also nicht mit eigenem Code überschrieben werden. Es gibt seit Jahren einen QP-Eintrag zu diesem Thema, aber da passiert nix:
procedure TPrinter.BeginDoc;
var DocInfo : TDocInfo; begin ... FillChar(DocInfo, SizeOf(DocInfo), 0); with DocInfo do begin cbSize := SizeOf(DocInfo); lpszDocName := PChar(Title); lpszOutput := PChar(OutFileName); // diese neue Zeile wäre erforderlich! end; ... if StartDoc(DC, DocInfo) <= 0 then... ![]() Ein anderer Weg ist ![]()
Code:
Aber QuickReport versteckt die Verwendung von TPrinter in seiner eigenen Klasse TQRPrinter, also müsste man das auch aufbohren.
var
DeviceMode: THandle; Device, Driver, Port: array[0..80] of Char; begin Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF'); Printer.GetPrinter(Device, Driver, Port, DeviceMode); Printer.SetPrinter(Device, Driver, 'C:\Temp\Test.pdf', 0); Printer.BeginDoc; Printer.Canvas.TextOut(100, 100, 'Test'); Printer.EndDoc; end; |
AW: Quickreport und Windows-Pdf-Printer
Hallo und vielen Dank an euch.
Da der QR in QRPRNTR bei Druckerwechsel jeweils ein eigenes GetPrinter, SetPrinter durchführt löse ich das durch Setzen des gewünschten PDF-Names in der aufrufenden Routine. Dort wechsle ich ja auch automatisch auf den PDF-Printer.
Code:
In der Unit QRPRNTR habe ich dann die Prozedur ResetDriver aufgeschlaut und schaue, ob ein Pdf erzeugt werden soll. Wenn ja, dann setze ich den Port eben mit diesen Dateinamen.
Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF'); // MS PDF-Drucker
Printer.Title:='xyz.pdf'; // der gewünschte Dateiname
Code:
Danke und ciao
procedure ResetDriver(aPrinter : TPrinter);
var Device, Name, Port: array[0..MAX_PATH] of Char; DevMode: THandle; begin aPrinter.GetPrinter( Device, Name, Port , DevMode ); if Pos('.pdf',aPrinter.Title)>0 then aPrinter.SetPrinter( Device, Name, PWideChar(aPrinter.Title) , 0 ) else aPrinter.SetPrinter( Device, Name, Port , 0 ); // 12/02/16 end; Frank |
AW: Quickreport und Windows-Pdf-Printer
Danke, das nutze ich auch so um PDFs mit Quickreport zu erstellen. Das Problem ist jetzt nur: Woher weiß ich, wann der PDF-Drucker fertig ist? Ich möchte die PDF-Datei per Schalterklick erstellen und dann auf ein Netzlaufwerk kopieren. Dazu muss sie vollständig erstellt sein.
|
AW: Quickreport und Windows-Pdf-Printer
Hi,
in der Tat habe ich das Problem "wann fertig" auch noch nicht gelöst. Was spricht in deinem Fall gegen den Dateinamen inklusive Netzwerkpfad? Ciao Frank |
AW: Quickreport und Windows-Pdf-Printer
Zitat:
|
AW: Quickreport und Windows-Pdf-Printer
Könnte man nicht testen, ob sich die Datei exklusiv (fmOpenRead or fmShareExclusive) öffnen lässt?
Wenn die noch offen zum Schreiben ist, sollte das dann einen Fehler erzeugen. ein kleines Beispiel: (Datei muss aber vorhanden sein)
Delphi-Quellcode:
function FileNotOpen(AFileName: string): Boolean;
begin try TFileStream.Create(AFileName, fmOpenRead or fmShareExclusive).Free; Result := True; except Result := False; end; end; |
AW: Quickreport und Windows-Pdf-Printer
Zitat:
|
AW: Quickreport und Windows-Pdf-Printer
Zitat:
dann hast Du doch das gleiche Problem, wenn Du die Datei auf das Netzwerklaufwerk kopierts. Die ist ja nun auch nicht "schwupps da". Ciao Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 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