SignOnlineReportsFrm.pas 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  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;
  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', IntToStr(FWebTenderID), IntToStr(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', IntToStr(FWebTenderID), IntToStr(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. img: TImage;
  906. begin
  907. img := TImage.Create(nil);
  908. try
  909. img.Height := PreviewComXML.PrintHeight;
  910. img.Width := PreviewComXML.PrintWidth;
  911. PreviewComXML.PrintPreviewCanvas(APage, 0, img.Canvas, False);
  912. img.Picture.SaveToFile(APageFileName);
  913. finally
  914. img.Free;
  915. end;
  916. end;
  917. var
  918. ATempFolder: String;
  919. i: Integer;
  920. begin
  921. ATempFolder := GenerateTempFolder(GetTempFilePath);
  922. for i := 1 to PreviewComXML.TotalPages do
  923. begin
  924. ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
  925. end;
  926. ZipFolder(ATempFolder, AFileName);
  927. end;
  928. procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
  929. begin
  930. if CurPage > 1 then
  931. CurPage := CurPage - 1
  932. else
  933. WarningMessage('已经是最前了');
  934. end;
  935. procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
  936. begin
  937. if CurPage < PreviewComXML.TotalPages then
  938. CurPage := CurPage + 1
  939. else
  940. WarningMessage('已经是最后了');
  941. end;
  942. procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
  943. begin
  944. FCurPage := Value;
  945. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  946. lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
  947. end;
  948. procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
  949. var
  950. sReportName, sZipFile, sPdfFile, sErrorMessage: string;
  951. vInFields, vInValues: array [0..5] of string;
  952. vUpFileFields, vUpFileNames: array [0..1] of string;
  953. begin
  954. sReportName := ReportTemplateManager.Current.TemplateName;
  955. if SafeReportName(sReportName) then
  956. begin
  957. CreateProgress('上传中,请等待...');
  958. vInFields[0] := 'project';
  959. vInValues[0] := IntToStr(FWebProjectID);
  960. vInFields[1] := 'tender';
  961. vInValues[1] := IntToStr(FWebTenderID);
  962. vInFields[2] := 'phaseno';
  963. vInValues[2] := IntToStr(FSignPhase);
  964. vInFields[3] := 'name';
  965. vInValues[3] := sReportName;
  966. vInFields[4] := 'ownuid';
  967. vInValues[4] := IntToStr(PHPWeb.UserID);
  968. vInFields[5] := 'widhei';
  969. vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
  970. vUpFileFields[0] := 'upfile';
  971. vUpFileNames[0] := GetTempFileName(FTempPath, '.zip');
  972. ExportReports(vUpFileNames[0]);
  973. vUpFileFields[1] := 'upspdf';
  974. vUpFileNames[1] := GetTempFileName(FTempPath, '.pdf');
  975. PdfHelper.ExportAllPages(PreviewComXML, vUpFileNames[1]);
  976. if PHPWeb.UploadFiles('sign/create', vInFields, vInValues, vUpFileFields, vUpFileNames, sErrorMessage) then
  977. begin
  978. FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, 234);
  979. lblAlreadyUpload.Visible := True;
  980. CloseProgress;
  981. TipMessage('上传完成。');
  982. end
  983. else
  984. begin
  985. CloseProgress;
  986. WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
  987. end;
  988. end;
  989. end;
  990. procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
  991. Shift: TShiftState; X, Y: Integer);
  992. begin
  993. if (X < offset) and (CurPage > 1) then
  994. begin
  995. TControl(Sender).Cursor := crPrevious;
  996. end
  997. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  998. begin
  999. TControl(Sender).Cursor := crNext;
  1000. end
  1001. else
  1002. begin
  1003. TControl(Sender).Cursor := crDefault;
  1004. end;
  1005. end;
  1006. procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
  1007. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1008. begin
  1009. if (X < offset) and (CurPage > 1) then
  1010. begin
  1011. CurPage := CurPage - 1;
  1012. end
  1013. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1014. begin
  1015. CurPage := CurPage + 1;
  1016. end;
  1017. end;
  1018. procedure TSignOnlineReportsForm.ExportPdfReports(const AFileName: string);
  1019. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  1020. var
  1021. imgEn: TImageEnView;
  1022. begin
  1023. imgEn := TImageEnView.Create(nil);
  1024. try
  1025. imgEn.Visible := False;
  1026. imgEn.Parent := Self;
  1027. imgEn.IO.CreatePDFFile(APageFileName);
  1028. imgEn.Bitmap.Height := PreviewComXML.PrintHeight;
  1029. imgEn.Bitmap.Width := PreviewComXML.PrintWidth;
  1030. PreviewComXML.PrintPreviewCanvas(APage, 0, imgEn.Bitmap.Canvas, False);
  1031. imgEn.IO.SaveToPDF;
  1032. finally
  1033. imgEn.Free;
  1034. end;
  1035. end;
  1036. var
  1037. ATempFolder: String;
  1038. i: Integer;
  1039. begin
  1040. ATempFolder := GenerateTempFolder(GetTempFilePath);
  1041. for i := 1 to PreviewComXML.TotalPages do
  1042. begin
  1043. ExportReportPage(i, Format('%s\%d.pdf', [ATempFolder, i]));
  1044. end;
  1045. ZipFolder(ATempFolder, AFileName);
  1046. end;
  1047. function TSignOnlineReportsForm.SafeReportName(var AName: string): Boolean;
  1048. var
  1049. sOrgName: string;
  1050. iCount: Integer;
  1051. bHasQuest: Boolean;
  1052. begin
  1053. Result := False;
  1054. sOrgName := AName;
  1055. iCount := 0;
  1056. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', IntToStr(FWebTenderID), IntToStr(FSignPhase));
  1057. while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
  1058. begin
  1059. Inc(iCount);
  1060. AName := Format('%s(%d)', [sOrgName, iCount]);
  1061. end;
  1062. Result := SameText(sOrgName, AName);
  1063. if not Result then
  1064. Result := QuestRenameSignReport(AName, FSignPhase);
  1065. end;
  1066. procedure TSignOnlineReportsForm.cbFillZeroClick(Sender: TObject);
  1067. begin
  1068. PreviewComXML.FillZero := cbFillZero.Checked;
  1069. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  1070. end;
  1071. end.