[Erledigt] fpReport: Wie Design aus .lfm verwenden?

Rund um die LCL und andere Komponenten
Antworten
laz_frank
Beiträge: 14
Registriert: Mi 3. Okt 2012, 20:31
OS, Lazarus, FPC: Winux64 (Laz 2.1.0 FPC 3.3.1)
CPU-Target: x86-64

[Erledigt] fpReport: Wie Design aus .lfm verwenden?

Beitrag von laz_frank »

Hallo,

auf Basis des Beispielprogramms von Andreas (af0815) habe ich erfolgreich einfache Reports zur Laufzeit erzeugen können.

Auf Basis der Informationen im Wiki (TFPReport and TFPJSONReport component editor ... Basic usage) lässt sich im Komponenteneditor auch ein Reportdesign erstellen und in der Lazarus Formulardatei speichern. Ein "Preview Report" aus dem Komponenteneditor funktioniert damit einwandfrei. Aber wie kann dieser Report dann zur Laufzeit angezeigt werden? Die Anleitung "1. At runtime, run the report, ..." impliziert sicherlich einige notwendige Schritte vor dem Aufruf von fpJSONReportInstanz.RunReport, denn das bringt nur die Fehlermeldung "Invalid report, detect 1 errors: Need at least 1 report page.".

Wie lädt man das Design aus der Formulardatei?

fpJSONReportInstanz.LoadFromJSON(fpJSONReportInstanz.DesignTimeJSON) erzeugt erst einmal keinen Fehler.
fpReportPreviewExportInstanz.Execute bringt dann aber einen InvalidTypeCast in Unit fpReportLclExport, procedure TFPReportExportCanvas.RenderMemo, Zeile 484, lMemo := THackReportMemo(AMemo);

'Hack' klingt vielversprechend...

fpReport im aktuellen Zustand scheint sich eher für gestandene Computer-Forensikerinnen als für Einsteiger zu eignen.

EDIT: Nach einem "Clean up and Build" funktioniert es jetzt so:

Code: Alles auswählen

type
  TfrmRptAddress = class(TForm)
    fpRepAddress: TfpJSONReport;
    fprepAddressDatasetData: TFPReportDatasetData;
    fprepAddressPreview: TFPreportPreviewExport;
    .
    .
    .
  end;
.
.
.
procedure TfrmRptAddress.FormActivate(Sender: TObject);
begin
  gTTFontCache.SearchPath.Add('blabla\fonts');
  gTTFontCache.BuildFontCache;
  gTTFontCache.ReadStandardFonts;
  fpRepAddress.LoadFromJSON(fpRepAddress.DesignTimeJSON);
  fpRepAddressPreview.AutoRun := True;
  fpRepAddressPreview.Execute;
end;    

Ausführliche Tests stehen noch aus...
Gruß, Frank

Antworten