SignOnlineReportsFrm.pas 29 KB

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