rptcolumns.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. unit rptcolumns;
  2. {$mode objfpc}{$H+}
  3. {$I demos.inc}
  4. interface
  5. uses
  6. Classes,
  7. SysUtils,
  8. fpreport,
  9. udapp;
  10. type
  11. { TColumnsDemo }
  12. TColumnsDemo = class(TReportDemoApp)
  13. private
  14. FDataPage1: TFPReportUserData;
  15. FDataPage2: TFPReportUserData;
  16. FStringListPage1: TStringList;
  17. FStringListPage2: TStringList;
  18. procedure GetReportDataPage1Value(Sender: TObject; const AValueName: String; var AValue: Variant);
  19. procedure GetReportDataPage1EOF(Sender: TObject; var IsEOF: Boolean);
  20. procedure GetReportDataPage1Names(Sender: TObject; List: TStrings);
  21. procedure GetReportDataPage2Value(Sender: TObject; const AValueName: String; var AValue: Variant);
  22. procedure GetReportDataPage2EOF(Sender: TObject; var IsEOF: Boolean);
  23. procedure GetReportDataPage2Names(Sender: TObject; List: TStrings);
  24. protected
  25. procedure InitialiseData; override;
  26. procedure CreateReportDesign; override;
  27. public
  28. constructor Create(AOwner : TComponent); override;
  29. destructor Destroy; override;
  30. Class function Description : string; override;
  31. end;
  32. implementation
  33. uses
  34. fpTTF;
  35. { TColumnsDemo }
  36. procedure TColumnsDemo.GetReportDataPage1Value(Sender: TObject; const AValueName: String; var AValue: Variant);
  37. begin
  38. if AValueName = 'p1element' then
  39. begin
  40. AValue := FStringListPage1[FDataPage1.RecNo-1];
  41. end;
  42. end;
  43. procedure TColumnsDemo.GetReportDataPage1EOF(Sender: TObject; var IsEOF: Boolean);
  44. begin
  45. if FDataPage1.RecNo > FStringListPage1.Count then
  46. IsEOF := True
  47. else
  48. IsEOF := False;
  49. end;
  50. procedure TColumnsDemo.GetReportDataPage2Value(Sender: TObject; const AValueName: String; var AValue: Variant);
  51. begin
  52. if AValueName = 'p2element' then
  53. begin
  54. AValue := FStringListPage2[FDataPage2.RecNo-1];
  55. end;
  56. end;
  57. procedure TColumnsDemo.GetReportDataPage2EOF(Sender: TObject; var IsEOF: Boolean);
  58. begin
  59. if FDataPage2.RecNo > FStringListPage2.Count then
  60. IsEOF := True
  61. else
  62. IsEOF := False;
  63. end;
  64. procedure TColumnsDemo.InitialiseData;
  65. var
  66. i: integer;
  67. begin
  68. FStringListPage1 := TStringList.Create;
  69. for i := 1 to 50 do
  70. FStringListPage1.Add(Format('DataItem %d', [i]));
  71. FStringListPage2 := TStringList.Create;
  72. for i := 1 to 77 do
  73. FStringListPage2.Add(Format('Item %d', [i]));
  74. end;
  75. procedure TColumnsDemo.CreateReportDesign;
  76. var
  77. p: TFPReportPage;
  78. TitleBand: TFPReportTitleBand;
  79. DataBand: TFPReportDataBand;
  80. Memo: TFPReportMemo;
  81. PageFooter: TFPReportPageFooterBand;
  82. PageHeader: TFPReportPageHeaderBand;
  83. ColumnHeader: TFPReportColumnHeaderBand;
  84. ColumnFooter: TFPReportColumnFooterBand;
  85. DataHeader: TFPReportDataHeaderBand;
  86. DataFooter: TFPReportDataFooterBand;
  87. ChildBand: TFPReportChildBand;
  88. begin
  89. Inherited;
  90. rpt.Author := 'Graeme Geldenhuys';
  91. rpt.Title := 'FPReport Demo 9 - Multi Columns';
  92. { Page 1 }
  93. p := TFPReportPage.Create(rpt);
  94. p.Orientation := poPortrait;
  95. p.PageSize.PaperName := 'A4';
  96. { page margins }
  97. p.Margins.Left := 10;
  98. p.Margins.Top := 10;
  99. p.Margins.Right := 10;
  100. p.Margins.Bottom := 10;
  101. p.Data := FDataPage1;
  102. p.Font.Name := 'LiberationSans';
  103. p.ColumnCount := 2;
  104. p.ColumnGap := 10;
  105. TitleBand := TFPReportTitleBand.Create(p);
  106. TitleBand.Layout.Height := 277;
  107. TitleBand.Frame.Shape := fsRectangle;
  108. TitleBand.Frame.BackgroundColor := TFPReportColor($003366);
  109. Memo := TFPReportMemo.Create(TitleBand);
  110. Memo.Layout.Left := 3;
  111. Memo.Layout.Top := 3;
  112. Memo.Layout.Width := TitleBand.Layout.Width-6;
  113. Memo.Layout.Height := TitleBand.Layout.Height-6;
  114. Memo.Text := 'THE REPORT TITLE' + LineEnding + '(start of designed report page 1)';
  115. Memo.UseParentFont := False;
  116. Memo.Font.Name := 'LiberationSans-Bold';
  117. Memo.Font.Size := 20;
  118. Memo.Font.Color := TFPReportColor($5B7290);
  119. Memo.TextAlignment.Horizontal := taCentered;
  120. Memo.TextAlignment.Vertical := tlCenter;
  121. Memo.Frame.Shape := fsRectangle;
  122. Memo.Frame.Color := TFPReportColor($663366);
  123. Memo.Frame.BackgroundColor := TFPReportColor($E7EBF0);
  124. Memo.Frame.Width := 5;
  125. PageHeader := TFPReportPageHeaderBand.Create(p);
  126. PageHeader.Layout.Height := 30;
  127. PageHeader.VisibleOnPage := vpNotOnFirst;
  128. PageHeader.Frame.Shape := fsRectangle;
  129. PageHeader.Frame.BackgroundColor := TFPReportColor($003366);
  130. Memo := TFPReportMemo.Create(PageHeader);
  131. Memo.Layout.Left := 55;
  132. Memo.Layout.Top := 15;
  133. Memo.Layout.Width := 70;
  134. Memo.Layout.Height := 10;
  135. Memo.UseParentFont := False;
  136. Memo.Font.Color := clWhite;
  137. Memo.Text := 'PageHeader - designed report page 1';
  138. DataBand := TFPReportDataBand.Create(p);
  139. DataBand.Layout.Height := 6;
  140. DataBand.Frame.Shape := fsRectangle;
  141. DataBand.Frame.Color := TFPReportColor($B1BDCD);
  142. DataBand.Frame.BackgroundColor := TFPReportColor($E7EBF0);
  143. Memo := TFPReportMemo.Create(DataBand);
  144. Memo.Layout.Left := 5;
  145. Memo.Layout.Top := 0;
  146. Memo.Layout.Width := 55;
  147. Memo.Layout.Height := 6;
  148. Memo.Text := 'DataBand <[p1element]>.';
  149. Memo.TextAlignment.Horizontal := taCentered;
  150. Memo.TextAlignment.Vertical := tlCenter;
  151. PageFooter := TFPReportPageFooterBand.Create(p);
  152. PageFooter.Layout.Height := 20;
  153. PageFooter.VisibleOnPage := vpNotOnFirst;
  154. PageFooter.Frame.Shape := fsRectangle;
  155. PageFooter.Frame.BackgroundColor := TFPReportColor($5B7290);
  156. Memo := TFPReportMemo.Create(PageFooter);
  157. Memo.Layout.Left := 135;
  158. Memo.Layout.Top := 9;
  159. Memo.Layout.Width := 50;
  160. Memo.Layout.Height := 20;
  161. Memo.Text := 'PageFooter Band' + LineEnding + '<i>Page [PageNo]</i>';
  162. Memo.TextAlignment.Horizontal := taRightJustified;
  163. Memo.Options := [moAllowHTML];
  164. { Page 2 }
  165. p := TFPReportPage.Create(rpt);
  166. p.Orientation := poPortrait;
  167. p.PageSize.PaperName := 'A4';
  168. { page margins }
  169. p.Margins.Left := 30;
  170. p.Margins.Top := 20;
  171. p.Margins.Right := 30;
  172. p.Margins.Bottom := 20;
  173. p.Data := FDataPage2;
  174. p.Font.Name := 'LiberationSans';
  175. p.ColumnCount := 3;
  176. p.ColumnGap := 5;
  177. TitleBand := TFPReportTitleBand.Create(p);
  178. TitleBand.Layout.Height := 40;
  179. TitleBand.Frame.Shape := fsRectangle;
  180. TitleBand.Frame.BackgroundColor := clLtGray;
  181. Memo := TFPReportMemo.Create(TitleBand);
  182. Memo.Layout.Left := 55;
  183. Memo.Layout.Top := 20;
  184. Memo.Layout.Width := 65;
  185. Memo.Layout.Height := 10;
  186. Memo.Text := 'THE REPORT TITLE' + LineEnding + '(Start of Designed Report Page 2)';
  187. PageHeader := TFPReportPageHeaderBand.Create(p);
  188. PageHeader.Layout.Height := 20;
  189. PageHeader.Frame.Shape := fsRectangle;
  190. PageHeader.Frame.BackgroundColor := clTeal;
  191. Memo := TFPReportMemo.Create(PageHeader);
  192. Memo.Layout.Left := 10;
  193. Memo.Layout.Top := 5;
  194. Memo.Layout.Width := 50;
  195. Memo.Layout.Height := 10;
  196. Memo.Text := 'Page Header Band - designed report page 2';
  197. ColumnHeader := TFPReportColumnHeaderBand.Create(p);
  198. ColumnHeader.Layout.Height := 15;
  199. ColumnHeader.Frame.Shape := fsRectangle;
  200. ColumnHeader.Frame.BackgroundColor := clDkRed;
  201. Memo := TFPReportMemo.Create(ColumnHeader);
  202. Memo.Layout.Left := 5;
  203. Memo.Layout.Top := 2.5;
  204. Memo.Layout.Width := 50;
  205. Memo.Layout.Height := 10;
  206. Memo.UseParentFont := False;
  207. Memo.Font.Name := 'LiberationSans-Bold';
  208. Memo.Font.Color := clWhite;
  209. Memo.Text := 'ColumnHeader Band';
  210. Memo.TextAlignment.Horizontal := taLeftJustified;
  211. Memo.TextAlignment.Vertical := tlCenter;
  212. DataHeader := TFPReportDataHeaderBand.Create(p);
  213. DataHeader.Layout.Height := 10;
  214. DataHeader.Frame.Shape := fsRectangle;
  215. DataHeader.Frame.BackgroundColor := TFPReportColor($ffa500);
  216. DataHeader.Data:=FDataPage2;
  217. Memo := TFPReportMemo.Create(DataHeader);
  218. Memo.Layout.Left := 5;
  219. Memo.Layout.Top := 1.5;
  220. Memo.Layout.Width := 50;
  221. Memo.Layout.Height := 8;
  222. Memo.UseParentFont := False;
  223. Memo.Font.Name := 'LiberationSans-Bold';
  224. Memo.Font.Color := clWhite;
  225. Memo.Text := 'DataHeader Band';
  226. Memo.TextAlignment.Horizontal := taLeftJustified;
  227. Memo.TextAlignment.Vertical := tlCenter;
  228. DataFooter := TFPReportDataFooterBand.Create(p);
  229. DataFooter.Layout.Height := 10;
  230. DataFooter.Frame.Shape := fsRectangle;
  231. DataFooter.Frame.BackgroundColor := TFPReportColor($ffa500);
  232. DataFooter.UseParentFont := False;
  233. DataFooter.Font.Name := 'LiberationSans-Bold';
  234. DataFooter.Font.Color := clWhite;
  235. DataFooter.Data:=FDataPage2;
  236. Memo := TFPReportMemo.Create(DataFooter);
  237. Memo.Layout.Left := 5;
  238. Memo.Layout.Top := 1.5;
  239. Memo.Layout.Width := 50;
  240. Memo.Layout.Height := 8;
  241. Memo.Text := 'DataFooter Band';
  242. Memo.TextAlignment.Horizontal := taLeftJustified;
  243. Memo.TextAlignment.Vertical := tlCenter;
  244. DataBand := TFPReportDataBand.Create(p);
  245. DataBand.Layout.Height := 10;
  246. DataBand.Data := FDataPage2;
  247. DataBand.KeepTogetherWithChildren := False;
  248. DataBand.Frame.Shape := fsRectangle;
  249. DataBand.Frame.BackgroundColor := clDataBand;
  250. Memo := TFPReportMemo.Create(DataBand);
  251. Memo.Layout.Left := 5;
  252. Memo.Layout.Top := 1;
  253. Memo.Layout.Width := 40;
  254. Memo.Layout.Height := 5;
  255. Memo.Text := 'DataBand <[p2element]>.';
  256. ChildBand := TFPReportChildBand.Create(p);
  257. ChildBand.Layout.Height := 9;
  258. ChildBand.Frame.Shape := fsRectangle;
  259. ChildBand.Frame.BackgroundColor := clLtGray;
  260. Memo := TFPReportMemo.Create(ChildBand);
  261. Memo.Layout.Left := 5;
  262. Memo.Layout.Top := 1;
  263. Memo.Layout.Width := 40;
  264. Memo.Layout.Height := 5;
  265. Memo.Text := 'ChildBand - [p2element]';
  266. DataBand.ChildBand := ChildBand;
  267. ColumnFooter := TFPReportColumnFooterBand.Create(p);
  268. ColumnFooter.Layout.Height := 15;
  269. ColumnFooter.Frame.Shape := fsRectangle;
  270. ColumnFooter.Frame.BackgroundColor := clGreen;
  271. // ColumnFooter.FooterPosition := fpAfterLast;
  272. Memo := TFPReportMemo.Create(ColumnFooter);
  273. Memo.Layout.Left := 5;
  274. Memo.Layout.Top := 2.5;
  275. Memo.Layout.Width := 50;
  276. Memo.Layout.Height := 10;
  277. Memo.Text := 'ColumnFooter Band';
  278. Memo.TextAlignment.Horizontal := taLeftJustified;
  279. Memo.TextAlignment.Vertical := tlCenter;
  280. PageFooter := TFPReportPageFooterBand.Create(p);
  281. PageFooter.Layout.Height := 20;
  282. PageFooter.Frame.Shape := fsRectangle;
  283. PageFooter.Frame.BackgroundColor := clLtGray;
  284. Memo := TFPReportMemo.Create(PageFooter);
  285. Memo.Layout.Left := 135;
  286. Memo.Layout.Top := 13;
  287. Memo.Layout.Width := 20;
  288. Memo.Layout.Height := 5;
  289. Memo.Text := 'Page [PageNo]';
  290. Memo := TFPReportMemo.Create(PageFooter);
  291. Memo.Layout.Left := 10;
  292. Memo.Layout.Top := 5;
  293. Memo.Layout.Width := 50;
  294. Memo.Layout.Height := 10;
  295. Memo.Text := 'PageFooter Band';
  296. end;
  297. constructor TColumnsDemo.Create(AOwner: TComponent);
  298. begin
  299. Inherited;
  300. FDataPage1 := TFPReportUserData.Create(nil);
  301. FDataPage1.OnGetValue := @GetReportDataPage1Value;
  302. FDataPage1.OnGetEOF := @GetReportDataPage1EOF;
  303. FDataPage1.OnGetNames := @GetReportDataPage1Names;
  304. FDataPage2 := TFPReportUserData.Create(nil);
  305. FDataPage2.OnGetValue := @GetReportDataPage2Value;
  306. FDataPage2.OnGetEOF := @GetReportDataPage2EOF;
  307. FDataPage2.OnGetNames := @GetReportDataPage2Names;
  308. end;
  309. destructor TColumnsDemo.Destroy;
  310. begin
  311. FreeAndNil(FDataPage1);
  312. FreeAndNil(FDataPage2);
  313. FreeAndNil(FStringListPage1);
  314. FreeAndNil(FStringListPage2);
  315. inherited Destroy;
  316. end;
  317. class function TColumnsDemo.Description: string;
  318. begin
  319. Result:='Demo showing support for multiple columns';
  320. end;
  321. procedure TColumnsDemo.GetReportDataPage2Names(Sender: TObject; List: TStrings);
  322. begin
  323. List.Add('p2element');
  324. end;
  325. procedure TColumnsDemo.GetReportDataPage1Names(Sender: TObject; List: TStrings);
  326. begin
  327. List.Add('p1element');
  328. end;
  329. end.