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.
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