Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Fastreport: ExportPDF im TTask (https://www.delphipraxis.net/209405-fastreport-exportpdf-im-ttask.html)

haentschman 2. Dez 2021 14:34


Fastreport: ExportPDF im TTask
 
Hallöle...:P

Delphi-Quellcode:
function TPrintBase.ExportPDF(FilePath, FileName: string): Boolean;
begin
  Result := FReport.Export(FReportPDFExport); // in TPrintBase erstellt - Fehler: hier

  if Result then
  begin
    try
      if not FGhostscript.PDFShrink(FilePath + FileName) then // Fehler über Event
      begin
        Result := False;
      end;
    except
      Result := False;
    end;
  end;
end;
der Aufruf sollte so sein:
Delphi-Quellcode:
TTask.Run(procedure
          begin
            ExportPDF(Print.PDF.FilePath, Print.PDF.FileName); // Archiv
          end);
Fehler:
Im Projekt XX.exe ist eine Exception der Klasse EClassNotFound mit der Meldung 'Klasse Picture nicht gefunden' aufgetreten.

:74f7a8b2 KERNELBASE.RaiseException + 0x62
System.Classes.ClassNotFound('Picture')
System.Classes.FindClass('Picture')
frxXMLSerializer.TfrxXMLSerializer.ReadComponentSt r($25192D50,'Picture',True)
frxPreviewPages.DoObjects($28781730,$25192D50)
frxPreviewPages.TfrxPreviewPages.GetPage(0)

im Report:
Code:
<TfrxPictureView Name="TitleImageFirstPage" AllowVectorExport="True" Left="0" Top="0" Width="699,21305" Height="170,07885" Hyperlink.Value="" Frame.Typ="0" HightQuality="False" Transparent="False" TransparentColor="16777215"/>
sonst kein 'Picture':?


PS: Ohne den TTask wird normal das PDF exportiert. :?

Was habe ich übersehen? :wink:

Uwe Raabe 2. Dez 2021 14:47

AW: Fastreport: ExportPDF im TTask
 
Zitat:

Zitat von haentschman (Beitrag 1498562)
Was habe ich übersehen? :wink:

  • FReport.Export (oder FReport an sich) ist vielleicht nicht thread-sicher?
  • FGhostscript.PDFShrink ist nicht thread-sicher?
  • Print.PDF.FilePath und/oder Print.PDF.FileName enthalten bei Ausführen der Task nicht mehr den erwarteten Wert?

Letzteres könnte man mit folgendem Code beheben:
Delphi-Quellcode:
function TPrintBase.MakeExportPDF(FilePath, FileName: string):TProc;
begin
  Resulr :=
    procedure
    begin
      ExportPDF(FilePath, FileName); // Archiv
    end)
end;

...

TTask.Run(MakeExportPDF(Print.PDF.FilePath, Print.PDF.FileName)); // FilePath und FileName sofort auflösen

haentschman 2. Dez 2021 15:02

AW: Fastreport: ExportPDF im TTask
 
Zitat:

FReport.Export (oder FReport an sich) ist vielleicht nicht thread-sicher?
...vermute ich. :? Weil der Export u.a. auch eine Dialog Form kennt.
Zitat:

FGhostscript.PDFShrink ist nicht thread-sicher?
FGhostscript.PDFShrink...das ist ja nur ein "Wrapper" für die GhostscriptDLL. Ghostscript nicht Thread sicher...kann ich mir nicht vorstellen.
Zitat:

Print.PDF.FilePath und/oder Print.PDF.FileName enthalten bei Ausführen der Task nicht mehr den erwarteten Wert?
...es sollten noch die Werte drin stehen...ich probiere. :wink:

Nachtrag:

MakeExportPDF: das PDF wird nicht exportiert...aber keine Fehlermeldung. :zwinker:

PS: Diese Optimierung auf Eis gelegt...das mit dem Copy reicht erst mal. :thumb:

Danke

TiGü 2. Dez 2021 15:28

AW: Fastreport: ExportPDF im TTask
 
CoInitializeEx(nil,COINIT_MULTITHREADED); und CoUninitialize; innerhalb des Task/Threadkontextes aufrufen?

Delphi-Quellcode:
function TPrintBase.MakeExportPDF(FilePath, FileName: string):TProc;
begin
  Result :=
    procedure
    begin
      CoInitializeEx(nil,COINIT_MULTITHREADED);
      ExportPDF(FilePath, FileName); // Archiv
      CoUninitialize;
    end)
end;

...

TTask.Run(MakeExportPDF(Print.PDF.FilePath, Print.PDF.FileName)); // FilePath und FileName sofort auflösen

TiGü 2. Dez 2021 15:35

AW: Fastreport: ExportPDF im TTask
 
Vielleicht hilfreich: https://www.danysoft.com/estaticos/f...on%20hilos.pdf

haentschman 2. Dez 2021 15:40

AW: Fastreport: ExportPDF im TTask
 
Danke...:P

Im Prinzip habe ich das auch so...bis auf das CoInitialize.
...heute nicht mehr. :zwinker:

Amanda 2. Dez 2021 21:05

AW: Fastreport: ExportPDF im TTask
 
[QUOTE=Uwe Raabe;1498564]
Zitat:

Zitat von haentschman (Beitrag 1498562)
Was habe ich übersehen? :wink:


Fastreport Export ist Threadsicher möglich.

Beispiel:

frxReport := TfrxReport.Create(nil);
try

if not loadReport(fr3Lieferliste, frxReport) then begin
log(messageVarStr(reportNichtGeladenMsg, [fr3Lieferliste]), true);
exit;
end; // if

thr:= TThread.CurrentThread;
frxReport.EngineOptions.ReportThread := thr;
frxReport.EngineOptions.SilentMode := true;
frxReport.EngineOptions.NewSilentMode := simSilent;
frxReport.EngineOptions.EnableThreadSafe := true;
frxReport.EngineOptions.DestroyForms := false;
frxReport.PrintOptions.Printer := drucker;
frxReport.PrintOptions.ShowDialog := false;
frxReport.ReportOptions.Name := titelLieferliste+' '+fdAuftragAUFTRAGNR.DisplayText;
frxReport.PrepareReport();

if frxReport.Errors.Count<>0 then begin
log(fr3Lieferliste+' '+frxReport.Errors.Text, true);
exit;
end; // if

finally
frxReport.Free;
end; // try

Uwe Raabe 2. Dez 2021 23:47

AW: Fastreport: ExportPDF im TTask
 
Zitat:

Zitat von Amanda (Beitrag 1498596)
Fastreport Export ist Threadsicher möglich.

:thumb:

haentschman 3. Dez 2021 08:06

AW: Fastreport: ExportPDF im TTask
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin...:?

Ich hätte was Vernünftiges lernen sollen... :?

Das hat gestern funktioniert:
Delphi-Quellcode:
TTask.Run(procedure
          var
            I: Integer;
            Success: Boolean;
          begin
            Success := True;

            for I := 0 to FFileList.Count - 1 do
            begin
              NewFile := CurrentNewFilePath + ExtractFileName(FFileList[I]);

              if TFile.GetSize(FFileList[I]) > 0 then // keine leeren Dateien kopieren
              begin
                if CopyFileEx(PChar(FFileList[I]),
                              PChar(NewFile),
                              nil, nil, nil, COPY_FILE_NO_BUFFERING) then
                begin
                  TThread.Synchronize(nil,
                                      procedure
                                      begin
                                        WriteSendToDB(FFileList[I], sdtFolder); // Transus
                                      end);
                  end
                  else
                  begin
                    ...
...heute mache ich das Delphi an und "Erzeuge": Fehler: siehe Bilder :evil:

Eingegrenzt (Test):
Delphi-Quellcode:
    TTask.Run(procedure
              var
                Success: Boolean;
              begin
                Success := True;
              end);

//    TTask.Run(procedure
//              var
//                I: Integer;
Fehler: Fehler: siehe Bilder :evil:

Lasse ich TTask komplett weg...alles gut. :evil:

Uwe Raabe 3. Dez 2021 09:59

AW: Fastreport: ExportPDF im TTask
 
Das sieht mir nach einer verkorksten FastReport Installation aus. Eventuell werden Units unterschiedlicher Versionen verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz