SignOnlineReportsFrm.pas 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. unit SignOnlineReportsFrm;
  2. interface
  3. uses
  4. ProjectData, ReportManager, ReportConnection, ReportPrepare,
  5. PrintComTypeDefUnit, ADODB, DB,
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, sdIDTree, sdDB, ComCtrls, ExtCtrls, VirtualTrees, PrintCom,
  8. PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton;
  9. const
  10. crNext = -25;
  11. crPrevious = -26;
  12. offset = 150;
  13. type
  14. TSignOnlineReportsForm = class(TForm)
  15. tvReports: TTreeView;
  16. pnlBottom: TPanel;
  17. PreviewComXML: TPrintComXML;
  18. previewBox: TImage;
  19. msbReportsPreview: TMScrollBox;
  20. lblAlreadyUpload: TLabel;
  21. cbFillZero: TCheckBox;
  22. pnlPageControl: TPanel;
  23. btnPre: TButton;
  24. btnNext: TButton;
  25. lblPages: TLabel;
  26. pbGenerate: TPNGButton;
  27. procedure FormShow(Sender: TObject);
  28. procedure tvReportsClick(Sender: TObject);
  29. procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
  30. dataType: Integer; isReading: Boolean; DrawType: Integer;
  31. isPrinting: Boolean);
  32. procedure PreviewComXMLCrossTabLabelShow(valIDX: Integer; var ExLeft,
  33. ExRight: Double; var isShow: Boolean; CrsTabShowType: Integer);
  34. procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);
  35. procedure PreviewComXMLGetDatasetEvent(DatasetInfo: PDatasetInfoRec;
  36. var ADataset: TDataSet);
  37. procedure msbReportsPreviewMouseWheelDown(Sender: TObject;
  38. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  39. procedure msbReportsPreviewMouseWheelUp(Sender: TObject;
  40. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  41. procedure ScrollBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  42. MousePos: TPoint; var Handled: Boolean);
  43. procedure ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
  44. MousePos: TPoint; var Handled: Boolean);
  45. procedure btnPreClick(Sender: TObject);
  46. procedure btnNextClick(Sender: TObject);
  47. procedure pbGenerateClick(Sender: TObject);
  48. private
  49. FProjectData: TProjectData;
  50. // 数据库管理
  51. FReportCon: TReportConnection;
  52. // 报表数据准备
  53. FReportDataPrepare: TReportPrepare;
  54. FPreviewList: TList;
  55. FCurPage: Integer;
  56. procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  57. procedure OnViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  58. procedure ExportReports(const AFileName: string);
  59. procedure LoadReportTemplates;
  60. procedure PreviewPage(AImage: TImage; APageIndex: Integer);
  61. procedure InitPageSettings(APrintCom: TPrintComXML);
  62. procedure InitFont(APrintCom: TPrintComXML);
  63. procedure InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  64. procedure InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode = nil);
  65. procedure SaveAuditOpinion(ATemplate: TTemplateNode);
  66. procedure SaveReportInteractData(ATemplate: TTemplateNode);
  67. procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  68. procedure LoadTemplateAndDisplay(ATemplate: TTemplateNode);
  69. procedure SetCurPage(const Value: Integer);
  70. public
  71. constructor Create(AOwner: TComponent); override;
  72. destructor Destroy; override;
  73. procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
  74. property ProjectData: TProjectData read FProjectData;
  75. property CurPage: Integer read FCurPage write SetCurPage;
  76. end;
  77. procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
  78. implementation
  79. uses
  80. UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
  81. ScFileArchiver, ZhAPI;
  82. {$R *.dfm}
  83. procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
  84. var
  85. vSignForm: TSignOnlineReportsForm;
  86. begin
  87. vSignForm := TSignOnlineReportsForm.Create(nil);
  88. try
  89. vSignForm.Init(AProjectNode, ASignPhase);
  90. vSignForm.ShowModal;
  91. finally
  92. vSignForm.Free;
  93. end;
  94. end;
  95. { TSignOnlineReportsForm }
  96. destructor TSignOnlineReportsForm.Destroy;
  97. begin
  98. ClearObjects(FPreviewList);
  99. FPreviewList.Free;
  100. FReportCon.Free;
  101. FReportDataPrepare.Free;
  102. if Assigned(FProjectData) then
  103. FProjectData.Free;
  104. inherited;
  105. end;
  106. procedure TSignOnlineReportsForm.Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
  107. function getTopParent(ANode: TsdIDTreeNode): TsdIDTreeNode;
  108. begin
  109. if Assigned(ANode.Parent) then
  110. Result := getTopParent(ANode.Parent)
  111. else
  112. Result := ANode;
  113. end;
  114. function getName(ANode: TsdIDTreeNode): string;
  115. begin
  116. Result := ANode.Rec.ValueByName('Name').AsString;
  117. end;
  118. begin
  119. FProjectData := TProjectData.Create;
  120. FProjectData.OpenForSignOnline(GetMyProjectsFilePath + AProjNode.Rec.ValueByName('FileName').AsString, ASignPhase);
  121. FReportDataPrepare := TReportPrepare.Create(FProjectData);
  122. FReportCon := TReportConnection.Create(FProjectData);
  123. //Caption := Format('生成签署报表 %s-%s-第 %d 期', [getName(getTopParent(AProjectNode)), getName(AProjectNode), ASignPhase]);
  124. Caption := Format('生成签署报表 %s-第 %d 期', [getName(AProjNode), ASignPhase]);
  125. LoadReportTemplates;
  126. end;
  127. procedure TSignOnlineReportsForm.LoadReportTemplates;
  128. var
  129. vHelper: TTemplateManagerHelper;
  130. begin
  131. vHelper := TTemplateManagerHelper.Create;
  132. try
  133. vHelper.ExportToTreeView(tvReports, ReportTemplateManager);
  134. finally
  135. vHelper.Free;
  136. end;
  137. end;
  138. procedure TSignOnlineReportsForm.FormShow(Sender: TObject);
  139. var
  140. vNode: TTreeNode;
  141. begin
  142. vNode := tvReports.Items.GetFirstNode;
  143. while Assigned(vNode) do
  144. begin
  145. vNode.Expand(True);
  146. vNode := vNode.getNextSibling;
  147. end;
  148. tvReports.Selected := tvReports.Items[0];
  149. end;
  150. procedure TSignOnlineReportsForm.tvReportsClick(Sender: TObject);
  151. var
  152. vTemplate: TTemplateNode;
  153. begin
  154. if Assigned(tvReports.Selected) then
  155. begin
  156. vTemplate := TTemplateNode(tvReports.Selected.Data);
  157. if Assigned(vTemplate) then
  158. begin
  159. ReportTemplateManager.Current := vTemplate;
  160. LoadTemplateAndDisplay(vTemplate);
  161. end;
  162. end;
  163. end;
  164. procedure TSignOnlineReportsForm.LoadTemplateAndDisplay(ATemplate: TTemplateNode);
  165. procedure WaringAndEmptyPreview(AStr: string);
  166. var
  167. OldBrushColor, OldPenColor: TColor;
  168. begin
  169. TipMessage(AStr, Handle);
  170. ClearObjects(FPreviewList);
  171. pnlPageControl.Visible := False;
  172. end;
  173. procedure ShowAllPages;
  174. const
  175. Indent = 5;
  176. var
  177. iPage: Integer;
  178. vPreviewImage: TImage;
  179. begin
  180. ClearObjects(FPreviewList);
  181. msbReportsPreview.HorzScrollBar.Range := 0;
  182. msbReportsPreview.HorzScrollBar.Position := 0;
  183. msbReportsPreview.VertScrollBar.Range := 0;
  184. msbReportsPreview.VertScrollBar.Position := 0;
  185. for iPage := 1 to PreviewComXML.TotalPages do
  186. begin
  187. vPreviewImage := TImage.Create(msbReportsPreview);
  188. vPreviewImage.Parent := msbReportsPreview;
  189. vPreviewImage.Top := (PreviewComXML.PrintHeight + Indent) * (iPage - 1);
  190. vPreviewImage.Left := 0;
  191. PreviewPage(vPreviewImage, iPage);
  192. FPreviewList.Add(vPreviewImage);
  193. end;
  194. msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
  195. msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight * PreviewComXML.TotalPages + 10 * (PreviewComXML.TotalPages - 1);
  196. end;
  197. procedure ShowCurPages;
  198. var
  199. vPreviewImage: TImage;
  200. begin
  201. ClearObjects(FPreviewList);
  202. msbReportsPreview.HorzScrollBar.Position := 0;
  203. msbReportsPreview.VertScrollBar.Position := 0;
  204. vPreviewImage := TImage.Create(msbReportsPreview);
  205. vPreviewImage.Parent := msbReportsPreview;
  206. vPreviewImage.Top := 0;
  207. vPreviewImage.Left := 0;
  208. FPreviewList.Add(vPreviewImage);
  209. msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
  210. msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight;
  211. vPreviewImage.OnMouseMove := OnViewMouseMove;
  212. vPreviewImage.OnMouseDown := OnViewMouseDown;
  213. CurPage := 1;
  214. end;
  215. procedure PreviewTemplet(AIsShowAllPages: Boolean);
  216. begin
  217. try
  218. if AIsShowAllPages then
  219. ShowAllPages
  220. else
  221. ShowCurPages;
  222. pnlPageControl.Visible := not AIsShowAllPages;
  223. msbReportsPreview.SetFocus;
  224. except
  225. WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
  226. end;
  227. end;
  228. procedure LoadEmptyTempletAndDisplay;
  229. begin
  230. WaringAndEmptyPreview('报表无数据,请选择其他报表。');
  231. end;
  232. begin
  233. // 交互表
  234. if ATemplate.InteractFlag <> 0 then
  235. SaveReportInteractData(ATemplate);
  236. // 准备额外数据
  237. if ATemplate.DataPrepareFlag <> 0 then
  238. FReportDataPrepare.PrepareData(ATemplate.DataPrepareFlag);
  239. FReportCon.RefreshConnection(ATemplate);
  240. Screen.Cursor := crHourGlass;
  241. try
  242. LoadTemplet(ATemplate, PreviewComXML);
  243. if PreviewComXML.TotalPages > 0 then
  244. PreviewTemplet(False)
  245. else
  246. LoadEmptyTempletAndDisplay;
  247. finally
  248. Screen.Cursor := crDefault;
  249. end;
  250. end;
  251. procedure TSignOnlineReportsForm.LoadTemplet(ATemplate: TTemplateNode;
  252. APrintCom: TPrintComXML);
  253. var
  254. RptArchiverObj: TReportArchiver;
  255. Mem: TMemoryStream;
  256. begin
  257. RptArchiverObj := TReportArchiver.Create;
  258. if ATemplate.IsMulti then
  259. RptArchiverObj.FileName := ATemplate.MultiFileNames[FProjectData.PhaseIndex]
  260. else
  261. RptArchiverObj.FileName := ATemplate.FileName;
  262. Mem := RptArchiverObj.Extract;
  263. try
  264. // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
  265. // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
  266. // 读取报表模板
  267. if not APrintCom.ReadReportStream(Mem) then Exit;
  268. // 将报表设置中的数据覆盖掉原模板的数据
  269. InitReportSettings(APrintCom, ATemplate);
  270. // 保存
  271. APrintCom.SaveToStream(Mem);
  272. // 再次读取,使报表设置中的设置生效
  273. APrintCom.ReadReportStream(Mem);
  274. // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
  275. // To Do
  276. APrintCom.FillZero := cbFillZero.Checked;
  277. InitPageSettings(APrintCom);
  278. APrintCom.ReadDBData;
  279. APrintCom.AnalyseData(PreviewBox.Canvas);
  280. finally
  281. if Mem <> nil then
  282. Mem.Free;
  283. RptArchiverObj.Free;
  284. end;
  285. end;
  286. procedure TSignOnlineReportsForm.InitFont(APrintCom: TPrintComXML);
  287. procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);
  288. begin
  289. AFontRec.FontName := AFont.Name;
  290. AFontRec.FontHeight := Round(AFont.Size*4/3) ;
  291. AFontRec.FontBold := 400 + Integer(fsBold in AFont.Style)*200;
  292. AFontRec.FontItalic := Integer(fsItalic in AFont.Style);
  293. AFontRec.FontUnderLine := Integer(fsUnderLine in AFont.Style);
  294. end;
  295. procedure InitTitleFont;
  296. var
  297. TitleRec : PTitleRec;
  298. begin
  299. TitleRec := PreviewComXML.getTitleByID(1);
  300. if TitleRec <> nil then
  301. begin
  302. AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);
  303. APrintCom.setTitleObj(TitleRec);
  304. end;
  305. end;
  306. procedure InitColumnFont;
  307. procedure InitColumnThick(AColumnRec: PColumnRec);
  308. begin
  309. if (ReportConfig.ReportCellLine > 0.2) then
  310. begin
  311. if (AColumnRec.LineInfo.LeftThick > 0.2) then
  312. AColumnRec.LineInfo.LeftThick := ReportConfig.ReportCellLine;
  313. if (AColumnRec.LineInfo.RightThick > 0.2) then
  314. AColumnRec.LineInfo.RightThick := ReportConfig.ReportCellLine;
  315. if (AColumnRec.LineInfo.TopThick > 0.2) then
  316. AColumnRec.LineInfo.TopThick := ReportConfig.ReportCellLine;
  317. if (AColumnRec.LineInfo.BottomThick > 0.2) then
  318. AColumnRec.LineInfo.BottomThick := ReportConfig.ReportCellLine;
  319. end;
  320. end;
  321. var
  322. i, j: Integer;
  323. ObjList: TList;
  324. ColumnRec : PColumnRec;
  325. AAR : PActiveAreaRec;
  326. SER : PShowElementRec;
  327. begin
  328. ObjList := TList.Create;
  329. try
  330. APrintCom.getAllColumnHeadObjs(ObjList);
  331. for i := 0 to ObjList.Count - 1 do
  332. begin
  333. ColumnRec := ObjList[i];
  334. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  335. InitColumnThick(ColumnRec);
  336. APrintCom.setColumnHeadTailObj(0, ColumnRec);
  337. end;
  338. APrintCom.getAllColumnTailObjs(ObjList);
  339. for i := 0 to ObjList.Count - 1 do
  340. begin
  341. ColumnRec := ObjList[i];
  342. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  343. InitColumnThick(ColumnRec);
  344. APrintCom.setColumnHeadTailObj(1,ColumnRec);
  345. end;
  346. APrintCom.getAllActAreaObjs(ObjList);
  347. for i := 0 to ObjList.Count - 1 do
  348. begin
  349. AAR := ObjList[i];
  350. for j := 0 to AAR.ElementList.Count - 1 do
  351. begin
  352. SER := AAR.ElementList[j];
  353. if (SER.ElementType = 7) then
  354. begin
  355. ColumnRec := SER.Data;
  356. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  357. InitColumnThick(ColumnRec);
  358. APrintCom.setActShowElementObj(SER);
  359. end;
  360. end;
  361. end;
  362. finally
  363. ObjList.Free;
  364. end;
  365. end;
  366. procedure InitContentAndGatherFont;
  367. var
  368. i, j: Integer;
  369. ObjList: TList;
  370. FlowContentRec : PContentRec;
  371. CrossContentRec : PCrossContentRec;
  372. SumRec : PSumRec;
  373. begin
  374. ObjList := TList.Create;
  375. try
  376. // 设置表正文
  377. APrintCom.getAllFlowShowContentObjs(ObjList);
  378. for i := 0 to ObjList.Count - 1 do
  379. begin
  380. FlowContentRec := ObjList[i];
  381. if not (FlowContentRec.Fixed) then
  382. begin
  383. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  384. APrintCom.setFlowContentObj(FlowContentRec);
  385. end;
  386. end;
  387. APrintCom.getAllBillShowContentObjs(ObjList);
  388. for i := 0 to ObjList.Count - 1 do
  389. begin
  390. FlowContentRec := ObjList[i];
  391. if not(FlowContentRec.Fixed) then
  392. begin
  393. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  394. APrintCom.setBillContentObj(FlowContentRec);
  395. end;
  396. end;
  397. APrintCom.getAllCrossContentObjs(ObjList);
  398. for i := 0 to ObjList.Count - 1 do
  399. begin
  400. CrossContentRec := ObjList[i];
  401. if not(CrossContentRec.CrossContent.Fixed) then
  402. begin
  403. AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);
  404. APrintCom.setCrossContentObj(CrossContentRec);
  405. end;
  406. end;
  407. // 设置表合计
  408. for i := 0 to 2 do
  409. begin
  410. APrintCom.getAllSumObjs(i,ObjList);
  411. for j := 0 to ObjList.Count - 1 do
  412. begin
  413. SumRec := ObjList[j];
  414. AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
  415. APrintCom.setSumObj(SumRec);
  416. end;
  417. end;
  418. finally
  419. ObjList.Free;
  420. end;
  421. end;
  422. procedure InitGridHeaderFont;
  423. var
  424. i: Integer;
  425. ObjList: TList;
  426. HeadTailRec : PHeadRec;
  427. begin
  428. ObjList := TList.Create;
  429. try
  430. APrintCom.getAllHeadObjs(ObjList);
  431. for i := 0 to ObjList.Count - 1 do
  432. begin
  433. HeadTailRec := ObjList[i];
  434. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  435. APrintCom.setHeadTailObj(0, HeadTailRec);
  436. end;
  437. APrintCom.getAllTailObjs(ObjList);
  438. for i := 0 to ObjList.Count - 1 do
  439. begin
  440. HeadTailRec := ObjList[i];
  441. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  442. APrintCom.setHeadTailObj(1, HeadTailRec);
  443. end;
  444. finally
  445. ObjList.Free;
  446. end;
  447. end;
  448. begin
  449. InitTitleFont;
  450. InitColumnFont;
  451. InitContentAndGatherFont;
  452. InitGridHeaderFont;
  453. end;
  454. procedure TSignOnlineReportsForm.InitPageSettings(APrintCom: TPrintComXML);
  455. begin
  456. // 设置页面大小
  457. APrintCom.setPageSize(ReportConfig.PageSize);
  458. // 统一纸张大小
  459. APrintCom.PrintPageSizeIdx := DMPAPER_A4;
  460. {
  461. if ReportConfig.PageSize = 'A3' then
  462. APrintCom.PrintPageSizeIdx := DMPAPER_A3
  463. else if ReportConfig.PageSize = 'A4' then
  464. APrintCom.PrintPageSizeIdx := DMPAPER_A4;
  465. }
  466. // 设置边距
  467. APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
  468. APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
  469. APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
  470. APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
  471. end;
  472. procedure TSignOnlineReportsForm.InitPaperSettings(
  473. ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  474. procedure InitRepBorderLine;
  475. var
  476. i: Integer;
  477. ObjList : TList;
  478. ShapeRec : PPicRec;
  479. begin
  480. ObjList := TList.Create;
  481. try
  482. APrintCom.getAllShapeObjs(1, ObjList);
  483. for i := 0 to ObjList.Count - 1 do
  484. begin
  485. ShapeRec := ObjList[i];
  486. // 设置报表边框线粗
  487. ShapeRec.PenWidth := ReportConfig.BorderLine;
  488. // 设置是否绘制报表边框横线
  489. if (ShapeRec.ExArea.ExLeft <> ShapeRec.ExArea.ExRight) then
  490. begin
  491. if not ReportConfig.RepBorderUnderLine then
  492. ShapeRec.PenStyle := integer(psClear)
  493. else
  494. ShapeRec.PenStyle := integer(psSolid);
  495. end;
  496. // 设置是否绘制报表边框竖线
  497. if (ShapeRec.ExArea.ExTop <> ShapeRec.ExArea.ExBottom) and
  498. ((ShapeRec.ExArea.ExLeft = 0) or (ShapeRec.ExArea.ExLeft = 100)) then
  499. begin //这里的判断条件是约定好的
  500. if not ReportConfig.RepBorderVerLine then
  501. ShapeRec.PenStyle := integer(psClear)
  502. else
  503. ShapeRec.PenStyle := integer(psSolid)
  504. end;
  505. APrintCom.setShapeObj(ShapeRec);
  506. end;
  507. finally
  508. ObjList.Free;
  509. end;
  510. end;
  511. procedure InitRepCellLine;
  512. var
  513. i: Integer;
  514. ObjList : TList;
  515. ColumnRec : PColumnRec;
  516. FlowContentRec : PContentRec;
  517. CrossContentRec : PCrossContentRec;
  518. begin
  519. ObjList := TList.Create;
  520. try
  521. APrintCom.getAllFlowShowContentObjs(ObjList);
  522. // 设置报表表格横线
  523. for i := 0 to ObjList.Count - 1 do
  524. begin
  525. FlowContentRec := ObjList[i];
  526. FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  527. FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  528. APrintCom.setFlowContentObj(FlowContentRec);
  529. end;
  530. APrintCom.getAllCrossContentObjs(ObjList);
  531. for i := 0 to ObjList.Count - 1 do
  532. begin
  533. CrossContentRec := ObjList[i];
  534. CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  535. CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  536. APrintCom.setCrossContentObj(CrossContentRec);
  537. end;
  538. // 设置报表表格竖线
  539. APrintCom.getAllFlowShowContentObjs(ObjList);
  540. for i := 0 to ObjList.Count - 1 do
  541. begin
  542. FlowContentRec := ObjList[i];
  543. FlowContentRec.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  544. FlowContentRec.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  545. // 如果设置无表格边框线,则两端的表格竖线线粗为0
  546. if (not ReportConfig.RepBorderVerLine) then
  547. if (i = 0) then
  548. FlowContentRec.LineInfo.LeftThick := 0
  549. else if (i = ObjList.Count - 1) then
  550. FlowContentRec.LineInfo.RightThick := 0;
  551. APrintCom.setFlowContentObj(FlowContentRec);
  552. end;
  553. APrintCom.getAllCrossContentObjs(ObjList);
  554. for i := 0 to ObjList.Count - 1 do
  555. begin
  556. CrossContentRec := ObjList[i];
  557. CrossContentRec.CrossContent.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  558. CrossContentRec.CrossContent.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  559. ColumnRec := CrossContentRec.CrossContent.Column;
  560. //这里还要判断如果没有边框竖线的情况下,表格竖线边缘的线粗也为0
  561. //前提是所属表栏最右位置位于边缘
  562. if (not ReportConfig.RepBorderVerLine) and (ColumnRec<>nil) and
  563. ((ColumnRec.ExArea.ExRight = 100.0) or (ColumnRec.ExArea.ExLeft = 0.0)) then
  564. begin
  565. case CrossContentRec.CrossType of
  566. 0 : //交叉行
  567. begin
  568. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  569. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  570. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  571. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  572. end;
  573. 1 : //交叉列
  574. begin
  575. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  576. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  577. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  578. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  579. //(*
  580. if (CrossContentRec.CrossContent.isSpecialBorder) then
  581. begin
  582. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  583. CrossContentRec.CrossContent.SpecialLineInfo.RightThick := 0;
  584. end;
  585. //*)
  586. end;
  587. 2 : //显示数据
  588. begin
  589. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  590. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  591. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  592. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  593. end;
  594. 3 : //固定LABEL
  595. begin
  596. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  597. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  598. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  599. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  600. end;
  601. 4 : //序号
  602. begin
  603. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  604. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  605. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  606. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  607. end;
  608. 5 : //横向统计
  609. begin
  610. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  611. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  612. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  613. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  614. end;
  615. end;
  616. end;
  617. APrintCom.setCrossContentObj(CrossContentRec);
  618. end;
  619. finally
  620. ObjList.Free;
  621. end;
  622. end;
  623. procedure InitOtherArea;
  624. procedure SetPTRBorder(PTR : PTextRec);
  625. procedure SetLeftRightBorder;
  626. begin
  627. if PTR.ExArea.ExLeft = 0.0 then
  628. begin
  629. if BorderWidth = 0.0 then
  630. PTR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth;
  631. end;
  632. if PTR.ExArea.ExRight = 100.0 then
  633. begin
  634. if BorderWidth = 0.0 then
  635. PTR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth
  636. end;
  637. end;
  638. procedure SetHorLine;
  639. begin
  640. if (PTR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  641. PTR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  642. if (PTR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  643. PTR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  644. end;
  645. begin
  646. SetLeftRightBorder;
  647. SetHorLine;
  648. end;
  649. procedure SetPCRBorder(PCR : PColumnRec);
  650. procedure SetLeftRightBorder;
  651. begin
  652. if PCR.ExArea.ExLeft = 0.0 then
  653. begin
  654. if BorderWidth = 0.0 then
  655. PCR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth
  656. end;
  657. if PCR.ExArea.ExRight = 100.0 then
  658. begin
  659. if BorderWidth = 0.0 then
  660. PCR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth;
  661. end;
  662. end;
  663. procedure SetVerLine;
  664. begin
  665. if PCR.ExArea.ExLeft = 0.0 then
  666. PCR.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  667. if PCR.ExArea.ExRight = 100.0 then
  668. PCR.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  669. end;
  670. procedure SetHorLine;
  671. begin
  672. if (PCR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  673. PCR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  674. if (PCR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  675. PCR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  676. end;
  677. begin
  678. SetLeftRightBorder;
  679. SetVerLine;
  680. SetHorLine;
  681. end;
  682. var i,k : integer;
  683. ObjList : TList;
  684. ActAreaRec : PActiveAreaRec;
  685. PSR : PShowElementRec;
  686. begin
  687. ObjList := TList.Create;
  688. try
  689. ActAreaRec := nil;
  690. PreviewComXML.getAllActAreaObjs(ObjList);
  691. for i := 0 to ObjList.Count - 1 do
  692. begin
  693. ActAreaRec := ObjList[i];
  694. if (ActAreaRec.ShowType < 0) or (ActAreaRec.ShowType > 2) then Continue;
  695. if not Assigned(ActAreaRec.ElementList) then Continue;
  696. for k := 0 to ActAreaRec.ElementList.Count - 1 do
  697. begin
  698. PSR := PShowElementRec(ActAreaRec.ElementList[k]);
  699. case PSR.ElementType of
  700. 0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏
  701. 7 : SetPCRBorder(PSR.Data) //Column
  702. end;
  703. APrintCom.setActShowElementObj(PSR);
  704. end;
  705. end;
  706. finally
  707. ObjList.Free;
  708. end;
  709. end;
  710. begin
  711. if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
  712. begin
  713. InitFont(APrintCom); // 各类字体
  714. InitRepBorderLine; // 报表边框
  715. InitRepCellLine; // 报表表格
  716. InitOtherArea; // 活动区域
  717. end;
  718. end;
  719. procedure TSignOnlineReportsForm.SaveAuditOpinion(
  720. ATemplate: TTemplateNode);
  721. var
  722. SelectForm: TAuditSelctForm;
  723. begin
  724. SelectForm := TAuditSelctForm.Create(FProjectData, ATemplate);
  725. try
  726. if SelectForm.ShowModal = mrOk then
  727. SelectForm.SaveAuditData;
  728. finally
  729. SelectForm.Free;
  730. end;
  731. end;
  732. procedure TSignOnlineReportsForm.SaveReportInteractData(
  733. ATemplate: TTemplateNode);
  734. begin
  735. case ATemplate.InteractFlag of
  736. 1: SaveAuditOpinion(ATemplate);
  737. end;
  738. end;
  739. procedure TSignOnlineReportsForm.InitReportSettings(
  740. APrintCom: TPrintComXML; ATemplate: TTemplateNode);
  741. begin
  742. InitPageSettings(APrintCom);
  743. InitPaperSettings(ATemplate, APrintCom);
  744. APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
  745. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;
  746. if FProjectData.ProjProperties.ReportShowState then
  747. begin
  748. if FProjectData.ProjProperties.ReportShowStateWithoutReply and (FProjectData.ProjProperties.AuditStatus = -1) then
  749. APrintCom.ShowBackgroundMark := False
  750. else
  751. APrintCom.ShowBackgroundMark := True;
  752. end
  753. else
  754. APrintCom.ShowBackgroundMark := False;
  755. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShowStateText;
  756. end;
  757. procedure TSignOnlineReportsForm.PreviewComXMLContentDisplay(
  758. var contentFontRec: TFontRec; dataType: Integer; isReading: Boolean;
  759. DrawType: Integer; isPrinting: Boolean);
  760. begin
  761. if ReportConfig.ContentIsNarrow then
  762. begin
  763. if (isReading) then
  764. begin
  765. begin
  766. contentFontRec.FontName := 'Arial Narrow';
  767. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  768. end;
  769. end else
  770. begin
  771. if (DrawType = 3) or (DrawType = 5) then
  772. begin
  773. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  774. end else if (isPrinting) then
  775. begin
  776. contentFontRec.FontName := 'Arial Narrow';
  777. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 7 div 6;
  778. end else
  779. begin
  780. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  781. end;
  782. end;
  783. end;
  784. end;
  785. procedure TSignOnlineReportsForm.PreviewComXMLCrossTabLabelShow(
  786. valIDX: Integer; var ExLeft, ExRight: Double; var isShow: Boolean;
  787. CrsTabShowType: Integer);
  788. var
  789. field : PFieldRec;
  790. begin
  791. if (CrsTabShowType = -1) then exit;
  792. field := PreviewComXML.getFieldByID(6);
  793. if (field <> nil) then
  794. begin
  795. if (field.DataLen > valIDX) and (valIDX >= 0) then
  796. begin
  797. if (field.Value[valIDX] = 1.5) then
  798. begin
  799. case CrsTabShowType of
  800. 1 : begin
  801. isShow := false;
  802. end;
  803. 2 : begin
  804. ExLeft := 0;
  805. ExRight := 100;
  806. end;
  807. 3 : begin
  808. //
  809. end
  810. else
  811. begin
  812. //
  813. end;
  814. end;
  815. end;
  816. end;
  817. end;
  818. end;
  819. procedure TSignOnlineReportsForm.PreviewComXMLGetDataConnection(
  820. var ADOCon: TADOConnection);
  821. begin
  822. ADOCon := FReportCon.Connection;
  823. end;
  824. procedure TSignOnlineReportsForm.PreviewComXMLGetDatasetEvent(
  825. DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);
  826. begin
  827. if DatasetInfo.ID = 0 then
  828. ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)
  829. else
  830. ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);
  831. end;
  832. procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
  833. APageIndex: Integer);
  834. begin
  835. if Assigned(AImage) then
  836. begin
  837. AImage.Height := PreviewComXML.PrintHeight ;
  838. AImage.Picture.Bitmap.Height := PreviewComXML.PrintHeight;
  839. AImage.Width := PreviewComXML.PrintWidth;
  840. AImage.Picture.Bitmap.Width := PreviewComXML.PrintWidth;
  841. PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
  842. end;
  843. end;
  844. constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
  845. procedure LoadCursor(AIndex: Integer; const AFileName: string);
  846. var
  847. rst: Integer;
  848. begin
  849. rst := LoadCursorFromFile(PChar(AFileName));
  850. if rst <> 0 then
  851. Screen.Cursors[AIndex] := rst;
  852. end;
  853. begin
  854. inherited;
  855. FPreviewList := TList.Create;
  856. LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
  857. LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
  858. end;
  859. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
  860. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  861. var Handled: Boolean);
  862. begin
  863. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  864. end;
  865. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelUp(
  866. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  867. var Handled: Boolean);
  868. begin
  869. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  870. end;
  871. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelDown(Sender: TObject;
  872. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  873. begin
  874. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  875. end;
  876. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelUp(Sender: TObject;
  877. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  878. begin
  879. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  880. end;
  881. procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
  882. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  883. var
  884. img: TImage;
  885. begin
  886. img := TImage.Create(nil);
  887. try
  888. img.Height := PreviewComXML.PrintHeight;
  889. img.Width := PreviewComXML.PrintWidth;
  890. PreviewComXML.PrintPreviewCanvas(APage, 0, img.Canvas, False);
  891. img.Picture.SaveToFile(APageFileName);
  892. finally
  893. img.Free;
  894. end;
  895. end;
  896. var
  897. ATempFolder: String;
  898. i: Integer;
  899. begin
  900. ATempFolder := GenerateTempFolder(GetTempFilePath);
  901. for i := 1 to PreviewComXML.TotalPages do
  902. begin
  903. ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
  904. end;
  905. ZipFolder(ATempFolder, AFileName);
  906. end;
  907. procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
  908. begin
  909. if CurPage > 1 then
  910. CurPage := CurPage - 1
  911. else
  912. WarningMessage('已经是最前了');
  913. end;
  914. procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
  915. begin
  916. if CurPage < PreviewComXML.TotalPages then
  917. CurPage := CurPage + 1
  918. else
  919. WarningMessage('已经是最后了');
  920. end;
  921. procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
  922. begin
  923. FCurPage := Value;
  924. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  925. lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
  926. end;
  927. procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
  928. var
  929. sFileName: string;
  930. begin
  931. if SaveFile(sFileName, '.zip') then
  932. begin
  933. ExportReports(sFileName);
  934. end;
  935. end;
  936. procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
  937. Shift: TShiftState; X, Y: Integer);
  938. begin
  939. if (X < offset) and (CurPage > 1) then
  940. begin
  941. TControl(Sender).Cursor := crPrevious;
  942. end
  943. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  944. begin
  945. TControl(Sender).Cursor := crNext;
  946. end
  947. else
  948. begin
  949. TControl(Sender).Cursor := crDefault;
  950. end;
  951. end;
  952. procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
  953. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  954. begin
  955. if (X < offset) and (CurPage > 1) then
  956. begin
  957. CurPage := CurPage - 1;
  958. end
  959. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  960. begin
  961. CurPage := CurPage + 1;
  962. end;
  963. end;
  964. end.