Czasami możesz potrzebować ograniczyć użytkownikom możliwość edycji i kopiowania raportów. Kluczem jest zrobienie tego tak, aby nawet nie domyślili się, że program korzysta z tak wspaniałego produktu, jakim jest FastReport. Porozmawiajmy o tym, jak ukryć szablony raportów przed niepowołanym dostępem.
Pomysł jest dość prosty: przechowywać szablony raportów w pliku wykonywalnym, a następnie wyodrębniać je i wykonywać w razie potrzeby.
Najpierw utworzymy pliki raportów w FastReport VCL i zapiszemy je do katalogu ReportList. Zasoby opiszemy za pomocą pliku tekstowego o następującej zawartości:
1 2 |
TEST RCDATA ".\ReportList\Test.fr3" TEST2 RCDATA ".\ReportList\Test2.fr3" |
Zapiszmy ten plik pod nazwą "TestFR.rc". Następnie skompilujmy go poleceniem BRCC32 TestFR.rc i otrzymamy TestFR.res. Na początku modułu należy dodać następujący ciąg znaków:
1 |
{$R TestFR.res}
|
Można to sobie ułatwić korzystając z biblioteki RxLib. Po jej zainstalowaniu, w menu Widok pojawi się pozycja Zasoby projektu. Wybierz Zasoby projektu-> Nowy-> Dane użytkownika i dodaj wymagane pliki raportów.
Napiszmy procedurę wyodrębniającą potrzebny nam zasób.
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; |
Teraz napiszmy obsługę wydruku dla naszego raportu.
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 '); //Dla checkoutu, wciąż wygodniej jest użyć LoadFromFile. Po wykonaniu checkout' u i po //utworzeniu pliku do opisu zasobu raportu, możesz zastosować procedurę 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; |
Oczywiście takie rozwiązanie ma wady. Pierwszą z nich jest duża zajętość zasobów programu, ponieważ plik wykonywalny zwiększa się kilkukrotnie, ale pakery dobrze go kompresują. Drugą to wolne generowanie raportów.
Autor artykułu: Oleg Leontiew Gennadiewicz