Бывают ситуации, когда нужно ограничить пользователям программы возможности изменения и копирования отчётов. Главное это реализовать так, чтобы они даже и не догадывались, что в программе используется такой замечательный продукт как FastReport. Поговорим о том, как спрятать темплейты отчетов от посторонних глаз.
Идея очень проста - темплейты отчетов хранить внутри исполняемого файла, а в нужный момент извлекать и выполнять.
Для начала мы создадим файлы отчетов в FastReport VCL и сохраним их в директорию ReportList. Объявляем описание ресурсов через текстовый файл со следующим содержанием:
1 2 |
TEST RCDATA ".\ReportList\Test.fr3" TEST2 RCDATA ".\ReportList\Test2.fr3" |
Сохраняем файл с названием «TestFR.rc». После компилируем его командой BRCC32 TestFR.rc и получаем TestFR.res. В начало модуля нужно дописать строку:
1 |
{$R TestFR.res}
|
Можно пойти более простым путём использовав библиотеку RxLib. После его установки в меню View появится пункт Project Resources. Выбираем Project Resources->New->User Data и добавляем нужные файлы отчетов.
Напишем процедуру извлечения нужного нам ресурса.
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; |
Теперь напишем обработчик печати нашего отчета.
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 '); // Для отладки все таки, удобнее использовать LoadFromFile. После отладки и после // создания файла описания ресурсов отчета, можно применить процедуру LoadRptFromResource LoadRptFromResource(Report, 'Test'); // загрузка репорта из ресурсов Report.PrepareReport(True); //Report.LoadFromFile( ExtractFilePath(Application.ExeName) + 'ReportList\Test2.fr3 '); // LoadRptFromResource(Report, 'Test2'); // загрузка репорта из ресурсов Report.PrepareReport(False); Report.Preview:= PreviewForm.frxPreviewMain; PreviewForm.ShowModal; end; |
Конечно, у такого решения есть недостатки. Первый - это ресурсоемкость программы, ведь исполняемый файл увеличивается в разы, но зато хорошо сжимается упаковщиками. Второй - это заторможенность построения отчета.
Автор статьи: Леонтьев Олег Геннадьевич