SignOnlineReportsFrm.pas 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213
  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. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  797. begin
  798. contentFontRec.FontName := 'Arial Narrow';
  799. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 7 div 6;
  800. end else
  801. begin
  802. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  803. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  804. end;
  805. end else
  806. begin
  807. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  808. begin
  809. contentFontRec.FontName := 'Arial Narrow';
  810. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  811. end else
  812. begin
  813. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  814. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  815. end;
  816. end;
  817. end;
  818. end;
  819. end;
  820. procedure TSignOnlineReportsForm.PreviewComXMLCrossTabLabelShow(
  821. valIDX: Integer; var ExLeft, ExRight: Double; var isShow: Boolean;
  822. CrsTabShowType: Integer);
  823. var
  824. field : PFieldRec;
  825. begin
  826. if (CrsTabShowType = -1) then exit;
  827. field := PreviewComXML.getFieldByID(6);
  828. if (field <> nil) then
  829. begin
  830. if (field.DataLen > valIDX) and (valIDX >= 0) then
  831. begin
  832. if (field.Value[valIDX] = 1.5) then
  833. begin
  834. case CrsTabShowType of
  835. 1 : begin
  836. isShow := false;
  837. end;
  838. 2 : begin
  839. ExLeft := 0;
  840. ExRight := 100;
  841. end;
  842. 3 : begin
  843. //
  844. end
  845. else
  846. begin
  847. //
  848. end;
  849. end;
  850. end;
  851. end;
  852. end;
  853. end;
  854. procedure TSignOnlineReportsForm.PreviewComXMLGetDataConnection(
  855. var ADOCon: TADOConnection);
  856. begin
  857. ADOCon := FReportCon.Connection;
  858. end;
  859. procedure TSignOnlineReportsForm.PreviewComXMLGetDatasetEvent(
  860. DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);
  861. begin
  862. if DatasetInfo.ID = 0 then
  863. ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)
  864. else
  865. ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);
  866. end;
  867. procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
  868. APageIndex: Integer);
  869. begin
  870. if Assigned(AImage) then
  871. begin
  872. AImage.Height := PreviewComXML.ReportSize.Y;
  873. AImage.Picture.Bitmap.Height := PreviewComXML.ReportSize.Y;
  874. AImage.Width := PreviewComXML.ReportSize.X;
  875. AImage.Picture.Bitmap.Width := PreviewComXML.ReportSize.X;
  876. PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
  877. end;
  878. end;
  879. constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
  880. procedure LoadCursor(AIndex: Integer; const AFileName: string);
  881. var
  882. rst: Integer;
  883. begin
  884. rst := LoadCursorFromFile(PChar(AFileName));
  885. if rst <> 0 then
  886. Screen.Cursors[AIndex] := rst;
  887. end;
  888. begin
  889. inherited;
  890. FPreviewList := TList.Create;
  891. LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
  892. LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
  893. FPostedSignReports := TSignReports.Create;
  894. end;
  895. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
  896. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  897. var Handled: Boolean);
  898. begin
  899. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  900. end;
  901. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelUp(
  902. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  903. var Handled: Boolean);
  904. begin
  905. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  906. end;
  907. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelDown(Sender: TObject;
  908. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  909. begin
  910. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  911. end;
  912. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelUp(Sender: TObject;
  913. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  914. begin
  915. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  916. end;
  917. procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
  918. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  919. var
  920. bmp: TBitmap;
  921. img: TJPEGImage;
  922. begin
  923. bmp := TBitmap.Create;
  924. img := TJPEGImage.Create;
  925. try
  926. bmp.Height := PreviewComXML.ReportSize.Y;
  927. bmp.Width := PreviewComXML.ReportSize.X;
  928. PreviewComXML.PrintPreviewCanvas(APage, 0, bmp.Canvas, False);
  929. img.Assign(bmp);
  930. img.CompressionQuality := 100;
  931. img.Compress;
  932. img.SaveToFile(APageFileName);
  933. finally
  934. bmp.Free;
  935. img.Free;
  936. end;
  937. end;
  938. var
  939. ATempFolder: String;
  940. i: Integer;
  941. begin
  942. ATempFolder := GenerateTempFolder(GetTempFilePath);
  943. for i := 1 to PreviewComXML.TotalPages do
  944. begin
  945. ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
  946. end;
  947. ZipFolder(ATempFolder, AFileName);
  948. end;
  949. procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
  950. begin
  951. if CurPage > 1 then
  952. CurPage := CurPage - 1
  953. else
  954. WarningMessage('已经是最前了');
  955. end;
  956. procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
  957. begin
  958. if CurPage < PreviewComXML.TotalPages then
  959. CurPage := CurPage + 1
  960. else
  961. WarningMessage('已经是最后了');
  962. end;
  963. procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
  964. begin
  965. FCurPage := Value;
  966. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  967. lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
  968. end;
  969. procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
  970. var
  971. sReportName, sZipFile, sPdfFile, sErrorMessage: string;
  972. vInFields, vInValues: array [0..5] of string;
  973. vUpFileFields, vUpFileNames: array [0..1] of string;
  974. begin
  975. if PreviewComXML.TotalPages > 200 then
  976. begin
  977. TipMessage('该报表不支持在线签署功能。');
  978. Exit;
  979. end;
  980. sReportName := ReportTemplateManager.Current.TemplateName;
  981. if SafeReportName(sReportName) then
  982. begin
  983. CreateProgress('上传中,请等待...');
  984. vInFields[0] := 'project';
  985. vInValues[0] := IntToStr(FWebProjectID);
  986. vInFields[1] := 'tender';
  987. vInValues[1] := IntToStr(FWebTenderID);
  988. vInFields[2] := 'phaseno';
  989. vInValues[2] := IntToStr(FSignPhase);
  990. vInFields[3] := 'name';
  991. vInValues[3] := sReportName;
  992. vInFields[4] := 'ownuid';
  993. vInValues[4] := IntToStr(PHPWeb.UserID);
  994. vInFields[5] := 'widhei';
  995. vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
  996. vUpFileFields[0] := 'upfile';
  997. vUpFileNames[0] := GetTempFileName(FTempPath, '.zip');
  998. ExportReports(vUpFileNames[0]);
  999. vUpFileFields[1] := 'upspdf';
  1000. vUpFileNames[1] := GetTempFileName(FTempPath, '.pdf');
  1001. PdfHelper.ExportAllPages(PreviewComXML, vUpFileNames[1]);
  1002. if PHPWeb.UploadFiles('sign/create', vInFields, vInValues, vUpFileFields, vUpFileNames, sErrorMessage) then
  1003. begin
  1004. FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, 234);
  1005. lblAlreadyUpload.Visible := True;
  1006. CloseProgress;
  1007. TipMessage('上传完成。');
  1008. end
  1009. else
  1010. begin
  1011. CloseProgress;
  1012. WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
  1013. end;
  1014. end;
  1015. end;
  1016. procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
  1017. Shift: TShiftState; X, Y: Integer);
  1018. begin
  1019. if (X < offset) and (CurPage > 1) then
  1020. begin
  1021. TControl(Sender).Cursor := crPrevious;
  1022. end
  1023. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1024. begin
  1025. TControl(Sender).Cursor := crNext;
  1026. end
  1027. else
  1028. begin
  1029. TControl(Sender).Cursor := crDefault;
  1030. end;
  1031. end;
  1032. procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
  1033. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1034. begin
  1035. if (X < offset) and (CurPage > 1) then
  1036. begin
  1037. CurPage := CurPage - 1;
  1038. end
  1039. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1040. begin
  1041. CurPage := CurPage + 1;
  1042. end;
  1043. end;
  1044. procedure TSignOnlineReportsForm.ExportPdfReports(const AFileName: string);
  1045. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  1046. var
  1047. imgEn: TImageEnView;
  1048. begin
  1049. imgEn := TImageEnView.Create(nil);
  1050. try
  1051. imgEn.Visible := False;
  1052. imgEn.Parent := Self;
  1053. imgEn.IO.CreatePDFFile(APageFileName);
  1054. imgEn.Bitmap.Height := PreviewComXML.ReportSize.X;
  1055. imgEn.Bitmap.Width := PreviewComXML.ReportSize.Y;
  1056. PreviewComXML.PrintPreviewCanvas(APage, 0, imgEn.Bitmap.Canvas, False);
  1057. imgEn.IO.SaveToPDF;
  1058. finally
  1059. imgEn.Free;
  1060. end;
  1061. end;
  1062. var
  1063. ATempFolder: String;
  1064. i: Integer;
  1065. begin
  1066. ATempFolder := GenerateTempFolder(GetTempFilePath);
  1067. for i := 1 to PreviewComXML.TotalPages do
  1068. begin
  1069. ExportReportPage(i, Format('%s\%d.pdf', [ATempFolder, i]));
  1070. end;
  1071. ZipFolder(ATempFolder, AFileName);
  1072. end;
  1073. function TSignOnlineReportsForm.SafeReportName(var AName: string): Boolean;
  1074. var
  1075. sOrgName: string;
  1076. iCount: Integer;
  1077. bHasQuest: Boolean;
  1078. begin
  1079. Result := False;
  1080. sOrgName := AName;
  1081. iCount := 0;
  1082. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', FWebTenderID, FSignPhase);
  1083. while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
  1084. begin
  1085. Inc(iCount);
  1086. AName := Format('%s(%d)', [sOrgName, iCount]);
  1087. end;
  1088. Result := SameText(sOrgName, AName);
  1089. if not Result then
  1090. Result := QuestRenameSignReport(AName, FSignPhase);
  1091. end;
  1092. procedure TSignOnlineReportsForm.cbFillZeroClick(Sender: TObject);
  1093. begin
  1094. PreviewComXML.FillZero := cbFillZero.Checked;
  1095. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  1096. end;
  1097. end.