Часто бывает, что клиентам нужно давать изменять свои логотипы, писать в колонтитулах, и так далее. Для этого можно задействовать динамический вывод компонентов.
В данной статье посмотрим как можно динамически вывести PageHeader и Page Footer с возможностью редактирования клиентом. Получится примерно так.
Сам отчет будет выглядеть так…
Header
И соответственно Footer
Код реализации
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
unit MainUnit; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, frxDesgn, frxClass, Vcl.StdCtrls; type TMainForm = class(TForm) HeaderMemo: TMemo; Button1: TButton; frxReport1: TfrxReport; FooterMemo: TMemo; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure HeaderMemoChange(Sender: TObject); procedure FormCreate(Sender: TObject); end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.Button1Click(Sender: TObject); var Page: TfrxReportPage; PageHeader:TFrxPageHeader; PageFooter:tFrxPageFooter; Memo: TfrxMemoView; begin frxReport1.Clear; { ДОБАВЛЯЕМ СТРАНИЦУ } Page := TfrxReportPage.Create(frxReport1); { создаем уникальное имя } Page.CreateUniqueName; { устанавливаем размеры полей, бумаги и ориентацию по умолчанию } Page.SetDefaults; { ДОБАВЛЯЕМ HEADER } PageHeader:=TFrxPageHeader.Create(Page); PageHeader.CreateUniqueName; PageHeader.Height:=HeaderMemo.Height; //Memo для Header Memo := TfrxMemoView.Create(PageHeader); Memo.CreateUniqueName; Memo.Lines.Assign(HeaderMemo.Lines); Memo.SetBounds(0,0,PageHeader.Width,PageHeader.Height); memo.Align:=baWidth; memo.HAlign:=haCenter; { ДОБАВЛЯЕМ FOOTER } PageFooter:=tFrxPageFooter.Create(Page); PageFooter.CreateUniqueName; PageFooter.Height:=FooterMemo.Height; //Memo для Footer Memo := TfrxMemoView.Create(PageFooter); Memo.CreateUniqueName; Memo.Lines.Assign(FooterMemo.Lines); Memo.SetBounds(0,0,PageFooter.Width,PageFooter.Height); memo.Align:=baWidth; memo.HAlign:=haCenter; // Показываем отчет frxReport1.ShowReport(); end; procedure TMainForm.FormCreate(Sender: TObject); begin HeaderMemo.Text:='SomeHeader'; FooterMemo.Text:='SomeFooter'; end; procedure TMainForm.HeaderMemoChange(Sender: TObject); // Ограничение числа строк для Header, такое же можно сделать и для Footer var i:integer; s:string; const MaxLinesCount=2; begin if HeaderMemo.Lines.Count>MaxLinesCount then begin showmessage('Высота ограничена 2 строками'); HeaderMemo.Lines[2]:=''; //HeaderMemo.Perform(EM_UNDO, 0, 0); //HeaderMemo.Perform(EM_EMPTYUNDOBUFFER, 0, 0); end; end; end. |
В принципе ничего сложного нет. Всё делается стандартными средствами. Единственное, что нужно подумать об ограничении числа строк,а в более общем смысле – ограничении пространства, занимаемого Header, если, скажем у нас будет компонент для ввода данных TRichViewEdit, то там надо будет думать о высоте контента, это общее направление мысли так сказать.
В данном коде я привел один из вариантов, как можно ограничить высоту Header через число строк, но это не самый лучший вариант. Вот как срабатывает ограничение.
В целом FastReport позволяет организовать удобный динамический вывод множества своих компонентов, что является огромным преимуществом при построении кастомизированных отчетов,то есть отчетов, которые могут править пользователи.
В следующей статье мы посмотрим реализацию FastReport в UniGUI – современном Delphi фрэймворке, который позволяет писать под Web на Delphi. Что приятно удивило, FastReport там отлично вписался!!!