Using resources for storing FastReport reports

2021-12-01

Sometimes you may need to restrict the users' ability to edit and copy reports. The key is to do it so that they would not even guess that the program uses such a wonderful product as FastReport. Let's talk about how to keep report templates hidden from prying eyes.

The idea is pretty simple: to store report templates inside an executable file, and to extract and execute them when you need it.

First, we will create report files in FastReport VCL and save them to the ReportList directory. Describe the resources through a text file with the following content:

1
2
TEST RCDATA ".\ReportList\Test.fr3"
TEST2 RCDATA ".\ReportList\Test2.fr3"

Let’s save the file with the name "TestFR.rc". Then we compile it with the BRCC32 TestFR.rc command and get TestFR.res. You need to add the following string to the beginning of the module:

1
{$R TestFR.res} 

You can make it easier using the RxLib library. After installing it, the Project Resources item will appear in the View menu. Select Project Resources-> New-> User Data and add the required report files.

Using resources for storing FastReport reports

Let's write a procedure for extracting the resource we need.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private
 { Private declarations }
 procedure LoadRptFromResource(Report: TfrxComponent; const ResName: string);
...............
procedure TFormMain.LoadRptFromResource(Report: TfrxComponent;
 const ResName: string);
var
 m: TResourceStream;
begin
 m := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
 try
 m.Position := 0;
 Report.LoadFromStream(m);
 finally
 m.Free;
 end;
end;

Now let's write a print handler for our report.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TFormMain.Button1Click(Sender: TObject);
var
Report: TfrxReport;
begin
 
 Report:= frxReportMain ;
 Report.Preview := nil ;
 
 Report.Script.Variables['dDAT'] := Edit1.Text;
 
 //Report.LoadFromFile( ExtractFilePath(Application.ExeName) + 'ReportList\Test.fr3 ');
 //For checkout, it is still more convenient to use LoadFromFile. After checkout and after 
 //created the file for report resource description, you can apply the procedure LoadRptFromResource 
 LoadRptFromResource(Report, 'Test'); //loading report from resources
 Report.PrepareReport(True);
 
 //Report.LoadFromFile( ExtractFilePath(Application.ExeName) + 'ReportList\Test2.fr3 ');
 //
 LoadRptFromResource(Report, 'Test2'); // loading report from resources
 Report.PrepareReport(False);
 
 Report.Preview:= PreviewForm.frxPreviewMain;
 PreviewForm.ShowModal;
end;

Of course, this solution has flaws. The first one is the resource intensity of the program because the executable file increases several times, but packers compress it well. The second is the slow report generation.

The author of the article: Oleg Leontiev Gennadievich

August 12, 2024

How to build and install the Postgres plugin in FastReport .NET

This article describes how to connect to the database using the FastReport .NET plugin for the report designer from Visual Studio via the NuGet server.
August 08, 2024

How to install FastReport .NET and its components on Windows

Step-by-step instructions for online and manual installation via the FastReport registration code.NET and its components in Windows.
July 26, 2024

Updating HTMLObject as a plugin for FastReport .NET

Detailed instructions for using the new HTMLObject plugin, which uses splitting DOM HTML into FastReport report objects.
Fast Reports
  • 800-985-8986 (English, US)
  • +4930568373928 (German)
  • +55 19 98147-8148 (Portuguese)
  • info@fast-report.com
  • 901 N Pitt Str #325 Alexandria VA 22314

© 1998-2024 Fast Reports Inc.