Использования ресурсов для хранения отчетов Fr
LOGic_BBS
Казань
Иногда не обходимо что бы конечные пользователи программы не имели возможности не то чтобы изменять или копировать отчеты, но и даже и не догадывались, что в программе используется такой замечательный продукт как FastReport. Как создать собственное окно предварительного просмотра, я рассказал, Туттеперь расскажу, как спрятать темплейты отчетов от посторонних глаз.
Идея заключается в том что бы, темплейты отчетов хранить в нутрии исполняемого файла и в нужный момент извлекались и выполнялись. Сразу скажу, что идея не моя, я ее подсмотрел у замечательного человека, который разрешил мне об ней рассказать.
Для начала, мы создадим файлы отчетов в FR и сохраним их в директорию ReportList, следующий шаг, создания описания ресурсов, создаем текстовый файл следующего содержания:
TEST RCDATA ".\ReportList\Test.fr3"
TEST2 RCDATA ".\ReportList\Test2.fr3"
и сохранить как TestFR.rc.
Потом скомпилировать его командой BRCC32 TestFR.rc и получить TestFR.res В начало модуля добавь строчку {$R TestFR.res}.
Или можно лучше, использовать библиотеку RxLib, что намного проще и доступнее. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужные файлы отчетов.
Пишем процедуру извлечения нужного нам ресурса.
Конечно, у этого решения есть недостатки, первый и самый это ресурсоемкость программы, исполняемый файл увеличивается в разы, но зато хорошо сжимается упаковщиками. Второй, это заторможенность построения отчета.
Ну и как всегда, в примере все есть.
Пример
Идея заключается в том что бы, темплейты отчетов хранить в нутрии исполняемого файла и в нужный момент извлекались и выполнялись. Сразу скажу, что идея не моя, я ее подсмотрел у замечательного человека, который разрешил мне об ней рассказать.
Для начала, мы создадим файлы отчетов в FR и сохраним их в директорию ReportList, следующий шаг, создания описания ресурсов, создаем текстовый файл следующего содержания:
TEST RCDATA ".\ReportList\Test.fr3"
TEST2 RCDATA ".\ReportList\Test2.fr3"
и сохранить как TestFR.rc.
Потом скомпилировать его командой BRCC32 TestFR.rc и получить TestFR.res В начало модуля добавь строчку {$R TestFR.res}.
Или можно лучше, использовать библиотеку RxLib, что намного проще и доступнее. После его установки в меню View появится пунктик Project Resources. Hужно выбрать Project Resources->New->User Data и добавить нужные файлы отчетов.
Пишем процедуру извлечения нужного нам ресурса.
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;
Теперь самое основное и за чего, все это затевалось, пишем обработчик печати нашего отчета.
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;
Конечно, у этого решения есть недостатки, первый и самый это ресурсоемкость программы, исполняемый файл увеличивается в разы, но зато хорошо сжимается упаковщиками. Второй, это заторможенность построения отчета.
Ну и как всегда, в примере все есть.
Пример
Комментарии
просто когда такие темы разбросаны по всему форуму это затруднительно для самих пользователей форума, а так все интересные разработки самих пользователей FR можно будет найти в одном месте!