SignOnlineReportsFrm.pas 37 KB

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