sgcReports 2026.11: Import Your FastReport Reports, plus Parameters, Tables and Templates for Delphi, C++ Builder and .NET

· Components
sgcReports 2026.11: Import FastReport, Parameters, Tables and Templates for Delphi and .NET
✦  New in sgcUI 2026.11 · sgcReports

Keep your reports.
Change your report engine.

sgcReports now imports FastReport, QuickReport and ReportBuilder reports, and adds the features buyers check first: parameters, real tables, report templates, a searchable preview and electronic invoices. Twelve new features in one release.

  • VCL
  • FireMonkey
  • C++ Builder
  • WinForms
  • WPF
  • Avalonia

The twelve new features in under four minutes. Also on YouTube.

12new features
3report formats imported
68functions, plus 10 aggregates
6export formats in the preview

Most teams that would like to leave their report engine never do, for one reason: hundreds of existing reports that nobody wants to draw again. sgcReports 2026.11 removes that reason. It reads your FastReport, QuickReport and ReportBuilder files and converts them, and it closes the gaps that a team checks before it switches: report parameters, a real table item, report templates with inheritance, a preview with search and thumbnails, and PDF output for electronic invoices.

Everything below works the same way in Delphi and C++ Builder, with VCL and FireMonkey, and in .NET with WinForms, WPF and Avalonia. Every code sample on this page was compiled and run against the 2026.11 sources.

Part 1 · Remove the switching cost

Import FastReport, QuickReport and ReportBuilder Reports

The new TsgcReportImporter reads a FastReport .fr3 file, a QuickReport form (a .dfm with a TQuickRep) or a ReportBuilder .rtm template, as text or binary, and turns it into an sgcReports report definition. Pages, bands, items, styles and data sources come across, the expressions are translated to the sgcReports syntax, and QuickReport and ReportBuilder check boxes become the new check box item.

What makes it safe to use on a real project is the other half of the result. The importer lists every object, property, expression, script and data source it could not map, with the path inside the report and the reason, so you know exactly what to finish by hand. Nothing is dropped in silence.

Three report formats in, one sgcReports definition out.
The ReportImport demo after importing a FastReport file, with the summary, the list of issues and the preview of the converted report
A FastReport file imported: 13 items, 2 expressions translated, and every unsupported object listed with its reason.

The designers have an Import command, so a report can be brought in, checked in the preview and saved as JSON without writing code. From code it is four lines plus the cleanup:

  oImporter := TsgcReportImporter.Create;
  try
    oImporter.ImportFromFile(oReport, 'fr_items.fr3');
    for i := 0 to oImporter.ImportResult.Issues.Count - 1 do
      Writeln(oImporter.ImportResult.Issues[i].Reason);
  finally
    oImporter.Free;
  end;

And the same in C#:

    var oImporter = new TsgcReportImporter();
    oImporter.ImportFromFile(oReport, "fr_items.fr3");
    foreach (var oIssue in oImporter.ImportResult.Issues)
      Console.WriteLine(oIssue.Reason);

Scripts, rich text, charts and crosstabs of the source report are not converted. They appear in the issue list, so you can rebuild them with the sgcReports equivalents. The new ReportImport demo, for Delphi, C++ Builder and .NET, imports sample files of all three formats.

Report Parameters, Asked For by the Preview

A report can now declare its parameters: text, integer, number, date, date and time, or yes or no, each with a default value or a default expression, a required flag, multiple values, and a list of allowed values that is fixed or read from a data source. Expressions and scripts read them as :Name.

You do not write a form for them. The VCL and FireMonkey previews and designers ask for the parameters before the report is prepared, and so do the .NET previews. The HTML viewer shows a typed parameter form, and the HTTP endpoint reads ?param.Name=value from the query string and answers 400 for a value that does not fit, instead of returning a broken report.

The parameters dialog with a required date, a country chosen from a list read from the data and a minimum total
The prompt, with the country list read from the data
The orders report filtered by the chosen date, country and minimum total
The report, filtered by the values

In a JSON definition the parameters sit next to the pages:

"parameters": [
  { "name": "FromDate", "dataType": "rpdtDate", "required": true,
    "defaultExpression": "EncodeDate(2026, 1, 1)" },
  { "name": "MinTotal", "dataType": "rpdtFloat", "defaultValue": "0" }
]

A service that prepares the report without a user sets the values in code, and no prompt is shown:

  oEngine.Report := oReport;
  oEngine.SetParameterValue('FromDate', VarFromDateTime(EncodeDate(2026, 3, 1)));
  oEngine.SetParameterValue('MinTotal', 100.0);

A Real Table Item

Lining up text items by hand to fake a table is over. The new table item has fixed, percent and automatic column widths, cells that span rows and columns, header rows that repeat on every page, data rows that come from their own data source, footer rows with totals, and rows that grow with their content. Cells have styles, Highlights and hyperlinks.

Merged cells, and a header row that follows the table onto every page.
A plan comparison table with merged cells and a products table with low stock values in red
Merged cells and a highlighted stock column
The table editor of the report designer with the rows, the columns and the merge and split commands
The table editor in the designer

The exports keep the structure. A table becomes a tagged table in an accessible PDF, with header cells and their scope and the spans, so a screen reader reads it as a table. It becomes an HTML table, a Word table with its header rows repeated, and merged cells in XLSX. In code, the fluent builder writes it in a few lines:

  oTable := oBuilder.Page('Main').Paper(rpsA4).Margins(15).ReportTitle(14)
    .CanGrow.Table(0, 0, 180, 'Products');
  oTable.Column(25).Column(0, rtwmAuto).Column(30)
    .HeaderRow(['Products', '', '']).RowStyle('Title').Cell(0, 0).Span(1, 3)
    .HeaderRow(['Code', 'Name', 'Price']).RowStyle('Head')
    .DataRow(['[Products.Code]', '[Products.Name]', '[Products.Price]'])
    .Cell(1, 2).Format('#,##0.00');
  oTable.Table.RepeatHeaderRows := True;

Check Boxes, SVG, Sparklines and Gauges

Four new things to draw on a page:

Check marks, sparklines and gauges, inside the report rows.
A project status report with an SVG logo, a check box, a sparkline and a progress gauge on every row and an average progress gauge
A project status report: an SVG logo, a check box, a 12 month sparkline and a progress gauge per project, and a radial gauge with the average.

The settings of custom items now accept expressions, evaluated for every printed band, which is how each row draws its own sparkline and gauge:

  oBand := oPage.MasterData('Projects', 14);
  oBand.CheckBox('Projects.Done', 4, 4, 6, 6).Name('DoneBox');
  oBand.Item.CheckBox.CheckStyle := rcsCheck;
  oBand.Custom('Sparkline', 75, 1, 60, 12, ['values=[Projects.Trend]',
    'kind=area', 'markers=last,high']).Name('Trend');
  oBand.Custom('Gauge', 140, 2, 50, 10, ['value=[Projects.Progress]',
    'gaugeKind=linear', 'unit=%']).Name('ProgressGauge');

Report Templates and Inheritance

Every company has a letterhead, and every invoice, statement and delivery note repeats it. With the new InheritsFrom property, "inheritsFrom" in the JSON, a report definition starts from a base definition and stores only its differences. Pages, bands, items and styles are merged by name. A child can override a property, add an item, place a band first with "$first" or drop an inherited item with "$remove". Change the logo in the base report, and every report that inherits it follows.

One letterhead, two reports that inherit it.
The letterhead base report
The base: letterhead.json
An invoice that inherits the letterhead
An invoice inherits it
A delivery note that inherits the letterhead and removes the contact block
So does a delivery note

The whole delivery note above is a few lines of differences. Here it removes the contact block of the letterhead:

"inheritsFrom": "letterhead.json",
"pages": [ { "name": "Page1", "bands": [
  { "name": "PageHeader", "items": [
    { "name": "Contact", "$remove": true }
  ] }
] } ]
  oDef.BaseFolder := ExtractFilePath(ExpandFileName('letterhead.json'));
  oDef.LoadFromFile(oReport, 'child.json');

The base is found under BaseFolder, or your OnResolveBase handler loads it from a database or a resource. Chains go up to eight levels, and Flat writes the merged definition when you need one file. The VCL, FireMonkey and HTML designers mark inherited objects, edit them as overrides and create a new report from a base report. In the VCL designer, an overridden property shows in bold.

The VCL report designer with the delivery note open, inherited bands marked and the overridden title in bold
Inherited bands are marked, and the overridden title shows in bold.

A Preview with Search, Thumbnails and an Export Menu

The previews have a find bar (Ctrl+F, F3, match case and whole word) that highlights every match on the page, a pane of page thumbnails, and an Export menu for PDF, XLSX, CSV, PNG, HTML and Word, with an OnExport event to take over the save. This is in the VCL and FireMonkey previews and in the WinForms, WPF and Avalonia previews, and the FireMonkey PDF viewer gets text search too.

Find, jump and export, from the preview your users already have.
The preview find bar with the current match in orange and the other matches in yellow
Find, with every match highlighted
The preview with the page thumbnails pane open
Page thumbnails
  oPreview.ShowThumbnails := True;
  oPreview.ExportFormats := [rpxPDF, rpxXLSX];
  if oPreview.SearchText('Total', False, True) then
    Writeln(oPreview.SearchResults, ' match(es)');

Part 2 · Close the gaps

Set the new Bookmark expression on a band or an item, and the PDF export writes the bookmarks as the document outline, nested by group, while the VCL and FireMonkey previews show them in an outline pane (ShowOutline). The new Hyperlink property opens a web or mailto address, or jumps to an Anchor in the same report with #name, and the links are kept in the PDF, HTML, Word and XLSX exports.

The preview outline pane with regions and customers from the group bookmarks
An outline built from two group levels
A report page with links that jump to each region and a link to a web page
Links to a web page and to anchors

E-Invoice PDF: Factur-X, ZUGFeRD and XRechnung

The PDF export embeds the e-invoice XML of your application as a PDF/A-3 associated file through the new EInvoice property, for Factur-X, ZUGFeRD and XRechnung, also as PDF/A-3a with PDF/UA. The invoice that people read and the data that machines read travel in one file. sgcReports does not write the XML itself: your application supplies it.

The XML goes inside the PDF/A-3 invoice.
The ReportEInvoice demo with buttons for Factur-X and ZUGFeRD, Spain Verifactu and Poland KSeF
The ReportEInvoice demo: a Factur-X invoice saved as PDF/A-3, and QR code templates for Verifactu (Spain) and KSeF (Poland).

An Expression Library of 68 Functions and 10 Aggregates

The expression library grows to 68 functions and 10 aggregates. New are date arithmetic, padding and formatting, Choose, ToWords to write an amount in words in the 12 sgcUI languages, and the aggregates SumIf, CountIf, Previous, RunningSum and RunningCount. An aggregate follows the band it is printed in: a group footer gives the total of the group, a page footer the total of the page.

A report page using PadLeft, Upper, Proper, ToWords, RunningSum and IIF
PadLeft, Upper, Proper, ToWords and a RunningSum column, on one report page.

Highlights: Conditional Styles without a Script

Highlights put a list of conditions and styles on an item. The first condition that is true replaces the style of the item, so negative totals print in red and good results in green without a line of script. They live in the JSON, in the fluent builder and in the VCL, FireMonkey and HTML designers.

Branch results with negative values in red and results above 5000 in green
Negatives in red, good months in green
The Highlights editor of the report designer with two conditions and their styles
The Highlights editor

Progress and Cancel for Big Reports

The engine has a new OnProgress event with the page and record counts and a Cancel method. The previews show the progress while a report is prepared, with a Cancel button that Esc also presses, and the HTTP endpoint has new MaxPages and Timeout limits, so one runaway report cannot hold a server.

The preview preparing a report of 40,000 records with the page and record counts and a Cancel button
Preparing 40,000 records: the page and record counts, and a Cancel button.

Every Platform, the Same API

Each feature on this page ships for Delphi and C++ Builder, with the VCL and FireMonkey previews and designers, and for .NET with WinForms, WPF and Avalonia, with the same class and property names. Reports defined in JSON move between the two worlds unchanged, and the engine still runs headless in services and Linux64 daemons.

The ReportTables demo running in .NET WinForms
The ReportTables demo in .NET WinForms.

Five new demos come with this release, for Delphi, C++ Builder and .NET: ReportImport, ReportParameters, ReportTables, ReportVisualItems and ReportInheritance, next to the ReportEInvoice demo.

Also New in sgcReports 2026.11

The report importer and the sparkline and gauge items need a registered edition. sgcReports is included in sgcUI Enterprise and in All-Access, and it is also sold on its own.

Try sgcReports 2026.11

Import one of your own FastReport, QuickReport or ReportBuilder files and see what comes across.

Questions or feedback? Get in touch, you will get a reply from the people who wrote the code.