SignOnlineReportsFrm.pas 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187
  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. vPreviewImage.Height := PreviewComXML.PrintHeight;
  232. vPreviewImage.Width := PreviewComXML.PrintWidth;
  233. FPreviewList.Add(vPreviewImage);
  234. msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
  235. msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight;
  236. vPreviewImage.OnMouseMove := OnViewMouseMove;
  237. vPreviewImage.OnMouseDown := OnViewMouseDown;
  238. CurPage := 1;
  239. end;
  240. procedure PreviewTemplet(AIsShowAllPages: Boolean);
  241. begin
  242. try
  243. if AIsShowAllPages then
  244. ShowAllPages
  245. else
  246. ShowCurPages;
  247. pnlPageControl.Visible := not AIsShowAllPages;
  248. msbReportsPreview.SetFocus;
  249. except
  250. WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
  251. end;
  252. end;
  253. procedure LoadEmptyTempletAndDisplay;
  254. begin
  255. WaringAndEmptyPreview('报表无数据,请选择其他报表。');
  256. end;
  257. begin
  258. // 交互表
  259. if ATemplate.InteractFlag <> 0 then
  260. SaveReportInteractData(ATemplate);
  261. // 准备额外数据
  262. if ATemplate.DataPrepareFlag <> 0 then
  263. FReportDataPrepare.PrepareData(ATemplate.DataPrepareFlag);
  264. FReportCon.RefreshConnection(ATemplate);
  265. Screen.Cursor := crHourGlass;
  266. try
  267. LoadTemplet(ATemplate, PreviewComXML);
  268. if PreviewComXML.TotalPages > 0 then
  269. PreviewTemplet(False)
  270. else
  271. LoadEmptyTempletAndDisplay;
  272. finally
  273. Screen.Cursor := crDefault;
  274. end;
  275. end;
  276. procedure TSignOnlineReportsForm.LoadTemplet(ATemplate: TTemplateNode;
  277. APrintCom: TPrintComXML);
  278. var
  279. RptArchiverObj: TReportArchiver;
  280. Mem: TMemoryStream;
  281. begin
  282. RptArchiverObj := TReportArchiver.Create;
  283. if ATemplate.IsMulti then
  284. RptArchiverObj.FileName := ATemplate.MultiFileNames[FProjectData.PhaseIndex]
  285. else
  286. RptArchiverObj.FileName := ATemplate.FileName;
  287. Mem := RptArchiverObj.Extract;
  288. try
  289. // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
  290. // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
  291. // 读取报表模板
  292. if not APrintCom.ReadReportStream(Mem) then Exit;
  293. // 将报表设置中的数据覆盖掉原模板的数据
  294. InitReportSettings(APrintCom, ATemplate);
  295. // 保存
  296. APrintCom.SaveToStream(Mem);
  297. // 再次读取,使报表设置中的设置生效
  298. APrintCom.ReadReportStream(Mem);
  299. // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
  300. // To Do
  301. APrintCom.FillZero := cbFillZero.Checked;
  302. InitPageSettings(APrintCom);
  303. APrintCom.ReadDBData;
  304. APrintCom.AnalyseData(PreviewBox.Canvas);
  305. finally
  306. if Mem <> nil then
  307. Mem.Free;
  308. RptArchiverObj.Free;
  309. end;
  310. end;
  311. procedure TSignOnlineReportsForm.InitFont(APrintCom: TPrintComXML);
  312. procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);
  313. begin
  314. AFontRec.FontName := AFont.Name;
  315. AFontRec.FontHeight := Round(AFont.Size*4/3) ;
  316. AFontRec.FontBold := 400 + Integer(fsBold in AFont.Style)*200;
  317. AFontRec.FontItalic := Integer(fsItalic in AFont.Style);
  318. AFontRec.FontUnderLine := Integer(fsUnderLine in AFont.Style);
  319. end;
  320. procedure InitTitleFont;
  321. var
  322. TitleRec : PTitleRec;
  323. begin
  324. TitleRec := PreviewComXML.getTitleByID(1);
  325. if TitleRec <> nil then
  326. begin
  327. AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);
  328. APrintCom.setTitleObj(TitleRec);
  329. end;
  330. end;
  331. procedure InitColumnFont;
  332. procedure InitColumnThick(AColumnRec: PColumnRec);
  333. begin
  334. if (ReportConfig.ReportCellLine > 0.2) then
  335. begin
  336. if (AColumnRec.LineInfo.LeftThick > 0.2) then
  337. AColumnRec.LineInfo.LeftThick := ReportConfig.ReportCellLine;
  338. if (AColumnRec.LineInfo.RightThick > 0.2) then
  339. AColumnRec.LineInfo.RightThick := ReportConfig.ReportCellLine;
  340. if (AColumnRec.LineInfo.TopThick > 0.2) then
  341. AColumnRec.LineInfo.TopThick := ReportConfig.ReportCellLine;
  342. if (AColumnRec.LineInfo.BottomThick > 0.2) then
  343. AColumnRec.LineInfo.BottomThick := ReportConfig.ReportCellLine;
  344. end;
  345. end;
  346. var
  347. i, j: Integer;
  348. ObjList: TList;
  349. ColumnRec : PColumnRec;
  350. AAR : PActiveAreaRec;
  351. SER : PShowElementRec;
  352. begin
  353. ObjList := TList.Create;
  354. try
  355. APrintCom.getAllColumnHeadObjs(ObjList);
  356. for i := 0 to ObjList.Count - 1 do
  357. begin
  358. ColumnRec := ObjList[i];
  359. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  360. InitColumnThick(ColumnRec);
  361. APrintCom.setColumnHeadTailObj(0, ColumnRec);
  362. end;
  363. APrintCom.getAllColumnTailObjs(ObjList);
  364. for i := 0 to ObjList.Count - 1 do
  365. begin
  366. ColumnRec := ObjList[i];
  367. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  368. InitColumnThick(ColumnRec);
  369. APrintCom.setColumnHeadTailObj(1,ColumnRec);
  370. end;
  371. APrintCom.getAllActAreaObjs(ObjList);
  372. for i := 0 to ObjList.Count - 1 do
  373. begin
  374. AAR := ObjList[i];
  375. for j := 0 to AAR.ElementList.Count - 1 do
  376. begin
  377. SER := AAR.ElementList[j];
  378. if (SER.ElementType = 7) then
  379. begin
  380. ColumnRec := SER.Data;
  381. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  382. InitColumnThick(ColumnRec);
  383. APrintCom.setActShowElementObj(SER);
  384. end;
  385. end;
  386. end;
  387. finally
  388. ObjList.Free;
  389. end;
  390. end;
  391. procedure InitContentAndGatherFont;
  392. var
  393. i, j: Integer;
  394. ObjList: TList;
  395. FlowContentRec : PContentRec;
  396. CrossContentRec : PCrossContentRec;
  397. SumRec : PSumRec;
  398. begin
  399. ObjList := TList.Create;
  400. try
  401. // 设置表正文
  402. APrintCom.getAllFlowShowContentObjs(ObjList);
  403. for i := 0 to ObjList.Count - 1 do
  404. begin
  405. FlowContentRec := ObjList[i];
  406. if not (FlowContentRec.Fixed) then
  407. begin
  408. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  409. APrintCom.setFlowContentObj(FlowContentRec);
  410. end;
  411. end;
  412. APrintCom.getAllBillShowContentObjs(ObjList);
  413. for i := 0 to ObjList.Count - 1 do
  414. begin
  415. FlowContentRec := ObjList[i];
  416. if not(FlowContentRec.Fixed) then
  417. begin
  418. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  419. APrintCom.setBillContentObj(FlowContentRec);
  420. end;
  421. end;
  422. APrintCom.getAllCrossContentObjs(ObjList);
  423. for i := 0 to ObjList.Count - 1 do
  424. begin
  425. CrossContentRec := ObjList[i];
  426. if not(CrossContentRec.CrossContent.Fixed) then
  427. begin
  428. AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);
  429. APrintCom.setCrossContentObj(CrossContentRec);
  430. end;
  431. end;
  432. // 设置表合计
  433. for i := 0 to 2 do
  434. begin
  435. APrintCom.getAllSumObjs(i,ObjList);
  436. for j := 0 to ObjList.Count - 1 do
  437. begin
  438. SumRec := ObjList[j];
  439. AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
  440. APrintCom.setSumObj(SumRec);
  441. end;
  442. end;
  443. finally
  444. ObjList.Free;
  445. end;
  446. end;
  447. procedure InitGridHeaderFont;
  448. var
  449. i: Integer;
  450. ObjList: TList;
  451. HeadTailRec : PHeadRec;
  452. begin
  453. ObjList := TList.Create;
  454. try
  455. APrintCom.getAllHeadObjs(ObjList);
  456. for i := 0 to ObjList.Count - 1 do
  457. begin
  458. HeadTailRec := ObjList[i];
  459. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  460. APrintCom.setHeadTailObj(0, HeadTailRec);
  461. end;
  462. APrintCom.getAllTailObjs(ObjList);
  463. for i := 0 to ObjList.Count - 1 do
  464. begin
  465. HeadTailRec := ObjList[i];
  466. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  467. APrintCom.setHeadTailObj(1, HeadTailRec);
  468. end;
  469. finally
  470. ObjList.Free;
  471. end;
  472. end;
  473. begin
  474. InitTitleFont;
  475. InitColumnFont;
  476. InitContentAndGatherFont;
  477. InitGridHeaderFont;
  478. end;
  479. procedure TSignOnlineReportsForm.InitPageSettings(APrintCom: TPrintComXML);
  480. begin
  481. // 设置页面大小
  482. APrintCom.setPageSize(ReportConfig.PageSize);
  483. if ReportConfig.PageSize = 'A3' then
  484. APrintCom.PrintPageSizeIdx := DMPAPER_A3
  485. else if ReportConfig.PageSize = 'A4' then
  486. APrintCom.PrintPageSizeIdx := DMPAPER_A4;
  487. // 设置边距
  488. APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
  489. APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
  490. APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
  491. APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
  492. end;
  493. procedure TSignOnlineReportsForm.InitPaperSettings(
  494. ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  495. procedure InitRepBorderLine;
  496. var
  497. i: Integer;
  498. ObjList : TList;
  499. ShapeRec : PPicRec;
  500. begin
  501. ObjList := TList.Create;
  502. try
  503. APrintCom.getAllShapeObjs(1, ObjList);
  504. for i := 0 to ObjList.Count - 1 do
  505. begin
  506. ShapeRec := ObjList[i];
  507. // 设置报表边框线粗
  508. ShapeRec.PenWidth := ReportConfig.BorderLine;
  509. // 设置是否绘制报表边框横线
  510. if (ShapeRec.ExArea.ExLeft <> ShapeRec.ExArea.ExRight) then
  511. begin
  512. if not ReportConfig.RepBorderUnderLine then
  513. ShapeRec.PenStyle := integer(psClear)
  514. else
  515. ShapeRec.PenStyle := integer(psSolid);
  516. end;
  517. // 设置是否绘制报表边框竖线
  518. if (ShapeRec.ExArea.ExTop <> ShapeRec.ExArea.ExBottom) and
  519. ((ShapeRec.ExArea.ExLeft = 0) or (ShapeRec.ExArea.ExLeft = 100)) then
  520. begin //这里的判断条件是约定好的
  521. if not ReportConfig.RepBorderVerLine then
  522. ShapeRec.PenStyle := integer(psClear)
  523. else
  524. ShapeRec.PenStyle := integer(psSolid)
  525. end;
  526. APrintCom.setShapeObj(ShapeRec);
  527. end;
  528. finally
  529. ObjList.Free;
  530. end;
  531. end;
  532. procedure InitRepCellLine;
  533. var
  534. i: Integer;
  535. ObjList : TList;
  536. ColumnRec : PColumnRec;
  537. FlowContentRec : PContentRec;
  538. CrossContentRec : PCrossContentRec;
  539. begin
  540. ObjList := TList.Create;
  541. try
  542. APrintCom.getAllFlowShowContentObjs(ObjList);
  543. // 设置报表表格横线
  544. for i := 0 to ObjList.Count - 1 do
  545. begin
  546. FlowContentRec := ObjList[i];
  547. FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  548. FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  549. APrintCom.setFlowContentObj(FlowContentRec);
  550. end;
  551. APrintCom.getAllCrossContentObjs(ObjList);
  552. for i := 0 to ObjList.Count - 1 do
  553. begin
  554. CrossContentRec := ObjList[i];
  555. CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  556. CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  557. APrintCom.setCrossContentObj(CrossContentRec);
  558. end;
  559. // 设置报表表格竖线
  560. APrintCom.getAllFlowShowContentObjs(ObjList);
  561. for i := 0 to ObjList.Count - 1 do
  562. begin
  563. FlowContentRec := ObjList[i];
  564. FlowContentRec.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  565. FlowContentRec.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  566. // 如果设置无表格边框线,则两端的表格竖线线粗为0
  567. if (not ReportConfig.RepBorderVerLine) then
  568. if (i = 0) then
  569. FlowContentRec.LineInfo.LeftThick := 0
  570. else if (i = ObjList.Count - 1) then
  571. FlowContentRec.LineInfo.RightThick := 0;
  572. APrintCom.setFlowContentObj(FlowContentRec);
  573. end;
  574. APrintCom.getAllCrossContentObjs(ObjList);
  575. for i := 0 to ObjList.Count - 1 do
  576. begin
  577. CrossContentRec := ObjList[i];
  578. CrossContentRec.CrossContent.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  579. CrossContentRec.CrossContent.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  580. ColumnRec := CrossContentRec.CrossContent.Column;
  581. //这里还要判断如果没有边框竖线的情况下,表格竖线边缘的线粗也为0
  582. //前提是所属表栏最右位置位于边缘
  583. if (not ReportConfig.RepBorderVerLine) and (ColumnRec<>nil) and
  584. ((ColumnRec.ExArea.ExRight = 100.0) or (ColumnRec.ExArea.ExLeft = 0.0)) then
  585. begin
  586. case CrossContentRec.CrossType of
  587. 0 : //交叉行
  588. begin
  589. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  590. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  591. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  592. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  593. end;
  594. 1 : //交叉列
  595. begin
  596. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  597. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  598. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  599. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  600. //(*
  601. if (CrossContentRec.CrossContent.isSpecialBorder) then
  602. begin
  603. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  604. CrossContentRec.CrossContent.SpecialLineInfo.RightThick := 0;
  605. end;
  606. //*)
  607. end;
  608. 2 : //显示数据
  609. begin
  610. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  611. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  612. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  613. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  614. end;
  615. 3 : //固定LABEL
  616. begin
  617. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  618. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  619. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  620. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  621. end;
  622. 4 : //序号
  623. begin
  624. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  625. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  626. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  627. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  628. end;
  629. 5 : //横向统计
  630. begin
  631. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  632. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  633. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  634. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  635. end;
  636. end;
  637. end;
  638. APrintCom.setCrossContentObj(CrossContentRec);
  639. end;
  640. finally
  641. ObjList.Free;
  642. end;
  643. end;
  644. procedure InitOtherArea;
  645. procedure SetPTRBorder(PTR : PTextRec);
  646. procedure SetLeftRightBorder;
  647. begin
  648. if PTR.ExArea.ExLeft = 0.0 then
  649. begin
  650. if BorderWidth = 0.0 then
  651. PTR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth;
  652. end;
  653. if PTR.ExArea.ExRight = 100.0 then
  654. begin
  655. if BorderWidth = 0.0 then
  656. PTR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth
  657. end;
  658. end;
  659. procedure SetHorLine;
  660. begin
  661. if (PTR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  662. PTR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  663. if (PTR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  664. PTR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  665. end;
  666. begin
  667. SetLeftRightBorder;
  668. SetHorLine;
  669. end;
  670. procedure SetPCRBorder(PCR : PColumnRec);
  671. procedure SetLeftRightBorder;
  672. begin
  673. if PCR.ExArea.ExLeft = 0.0 then
  674. begin
  675. if BorderWidth = 0.0 then
  676. PCR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth
  677. end;
  678. if PCR.ExArea.ExRight = 100.0 then
  679. begin
  680. if BorderWidth = 0.0 then
  681. PCR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth;
  682. end;
  683. end;
  684. procedure SetVerLine;
  685. begin
  686. if PCR.ExArea.ExLeft = 0.0 then
  687. PCR.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  688. if PCR.ExArea.ExRight = 100.0 then
  689. PCR.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  690. end;
  691. procedure SetHorLine;
  692. begin
  693. if (PCR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  694. PCR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  695. if (PCR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  696. PCR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  697. end;
  698. begin
  699. SetLeftRightBorder;
  700. SetVerLine;
  701. SetHorLine;
  702. end;
  703. var i,k : integer;
  704. ObjList : TList;
  705. ActAreaRec : PActiveAreaRec;
  706. PSR : PShowElementRec;
  707. begin
  708. ObjList := TList.Create;
  709. try
  710. ActAreaRec := nil;
  711. PreviewComXML.getAllActAreaObjs(ObjList);
  712. for i := 0 to ObjList.Count - 1 do
  713. begin
  714. ActAreaRec := ObjList[i];
  715. if (ActAreaRec.ShowType < 0) or (ActAreaRec.ShowType > 2) then Continue;
  716. if not Assigned(ActAreaRec.ElementList) then Continue;
  717. for k := 0 to ActAreaRec.ElementList.Count - 1 do
  718. begin
  719. PSR := PShowElementRec(ActAreaRec.ElementList[k]);
  720. case PSR.ElementType of
  721. 0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏
  722. 7 : SetPCRBorder(PSR.Data) //Column
  723. end;
  724. APrintCom.setActShowElementObj(PSR);
  725. end;
  726. end;
  727. finally
  728. ObjList.Free;
  729. end;
  730. end;
  731. begin
  732. if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
  733. begin
  734. InitFont(APrintCom); // 各类字体
  735. InitRepBorderLine; // 报表边框
  736. InitRepCellLine; // 报表表格
  737. InitOtherArea; // 活动区域
  738. end;
  739. end;
  740. procedure TSignOnlineReportsForm.SaveAuditOpinion(
  741. ATemplate: TTemplateNode);
  742. var
  743. SelectForm: TAuditSelctForm;
  744. begin
  745. SelectForm := TAuditSelctForm.Create(FProjectData, ATemplate);
  746. try
  747. if SelectForm.ShowModal = mrOk then
  748. SelectForm.SaveAuditData;
  749. finally
  750. SelectForm.Free;
  751. end;
  752. end;
  753. procedure TSignOnlineReportsForm.SaveReportInteractData(
  754. ATemplate: TTemplateNode);
  755. begin
  756. case ATemplate.InteractFlag of
  757. 1: SaveAuditOpinion(ATemplate);
  758. end;
  759. end;
  760. procedure TSignOnlineReportsForm.InitReportSettings(
  761. APrintCom: TPrintComXML; ATemplate: TTemplateNode);
  762. begin
  763. InitPageSettings(APrintCom);
  764. InitPaperSettings(ATemplate, APrintCom);
  765. APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
  766. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;
  767. if FProjectData.ProjProperties.ReportShowState then
  768. begin
  769. if FProjectData.ProjProperties.ReportShowStateWithoutReply and
  770. ((FProjectData.ProjProperties.AuditStatus = -1) or (FProjectData.PhaseIndex < FProjectData.ProjProperties.PhaseCount)) then
  771. APrintCom.ShowBackgroundMark := False
  772. else
  773. APrintCom.ShowBackgroundMark := True;
  774. end
  775. else
  776. APrintCom.ShowBackgroundMark := False;
  777. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShowStateText;
  778. end;
  779. procedure TSignOnlineReportsForm.PreviewComXMLContentDisplay(
  780. var contentFontRec: TFontRec; dataType: Integer; isReading: Boolean;
  781. DrawType: Integer; isPrinting: Boolean);
  782. begin
  783. if ReportConfig.ContentIsNarrow then
  784. begin
  785. if (isReading) then
  786. begin
  787. begin
  788. contentFontRec.FontName := 'Arial Narrow';
  789. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  790. end;
  791. end else
  792. begin
  793. if (DrawType = 3) or (DrawType = 5) then
  794. begin
  795. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  796. end else if (isPrinting) 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.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  803. end;
  804. end;
  805. end;
  806. end;
  807. procedure TSignOnlineReportsForm.PreviewComXMLCrossTabLabelShow(
  808. valIDX: Integer; var ExLeft, ExRight: Double; var isShow: Boolean;
  809. CrsTabShowType: Integer);
  810. var
  811. field : PFieldRec;
  812. begin
  813. if (CrsTabShowType = -1) then exit;
  814. field := PreviewComXML.getFieldByID(6);
  815. if (field <> nil) then
  816. begin
  817. if (field.DataLen > valIDX) and (valIDX >= 0) then
  818. begin
  819. if (field.Value[valIDX] = 1.5) then
  820. begin
  821. case CrsTabShowType of
  822. 1 : begin
  823. isShow := false;
  824. end;
  825. 2 : begin
  826. ExLeft := 0;
  827. ExRight := 100;
  828. end;
  829. 3 : begin
  830. //
  831. end
  832. else
  833. begin
  834. //
  835. end;
  836. end;
  837. end;
  838. end;
  839. end;
  840. end;
  841. procedure TSignOnlineReportsForm.PreviewComXMLGetDataConnection(
  842. var ADOCon: TADOConnection);
  843. begin
  844. ADOCon := FReportCon.Connection;
  845. end;
  846. procedure TSignOnlineReportsForm.PreviewComXMLGetDatasetEvent(
  847. DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);
  848. begin
  849. if DatasetInfo.ID = 0 then
  850. ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)
  851. else
  852. ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);
  853. end;
  854. procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
  855. APageIndex: Integer);
  856. begin
  857. if Assigned(AImage) then
  858. begin
  859. AImage.Height := PreviewComXML.PrintHeight ;
  860. AImage.Picture.Bitmap.Height := PreviewComXML.PrintHeight;
  861. AImage.Width := PreviewComXML.PrintWidth;
  862. AImage.Picture.Bitmap.Width := PreviewComXML.PrintWidth;
  863. PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
  864. end;
  865. end;
  866. constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
  867. procedure LoadCursor(AIndex: Integer; const AFileName: string);
  868. var
  869. rst: Integer;
  870. begin
  871. rst := LoadCursorFromFile(PChar(AFileName));
  872. if rst <> 0 then
  873. Screen.Cursors[AIndex] := rst;
  874. end;
  875. begin
  876. inherited;
  877. FPreviewList := TList.Create;
  878. LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
  879. LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
  880. FPostedSignReports := TSignReports.Create;
  881. end;
  882. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
  883. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  884. var Handled: Boolean);
  885. begin
  886. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  887. end;
  888. procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelUp(
  889. Sender: TObject; Shift: TShiftState; MousePos: TPoint;
  890. var Handled: Boolean);
  891. begin
  892. SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  893. end;
  894. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelDown(Sender: TObject;
  895. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  896. begin
  897. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
  898. end;
  899. procedure TSignOnlineReportsForm.ScrollBox1MouseWheelUp(Sender: TObject;
  900. Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
  901. begin
  902. SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
  903. end;
  904. procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
  905. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  906. var
  907. img: TImage;
  908. begin
  909. img := TImage.Create(nil);
  910. try
  911. img.Height := PreviewComXML.PrintHeight;
  912. img.Width := PreviewComXML.PrintWidth;
  913. PreviewComXML.PrintPreviewCanvas(APage, 0, img.Canvas, False);
  914. img.Picture.SaveToFile(APageFileName);
  915. finally
  916. img.Free;
  917. end;
  918. end;
  919. var
  920. ATempFolder: String;
  921. i: Integer;
  922. begin
  923. ATempFolder := GenerateTempFolder(GetTempFilePath);
  924. for i := 1 to PreviewComXML.TotalPages do
  925. begin
  926. ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
  927. end;
  928. ZipFolder(ATempFolder, AFileName);
  929. end;
  930. procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
  931. begin
  932. if CurPage > 1 then
  933. CurPage := CurPage - 1
  934. else
  935. WarningMessage('已经是最前了');
  936. end;
  937. procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
  938. begin
  939. if CurPage < PreviewComXML.TotalPages then
  940. CurPage := CurPage + 1
  941. else
  942. WarningMessage('已经是最后了');
  943. end;
  944. procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
  945. begin
  946. FCurPage := Value;
  947. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  948. lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
  949. end;
  950. procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
  951. var
  952. sReportName, sZipFile, sPdfFile, sErrorMessage: string;
  953. vInFields, vInValues: array [0..5] of string;
  954. vUpFileFields, vUpFileNames: array [0..1] of string;
  955. begin
  956. sReportName := ReportTemplateManager.Current.TemplateName;
  957. if SafeReportName(sReportName) then
  958. begin
  959. CreateProgress('上传中,请等待...');
  960. vInFields[0] := 'project';
  961. vInValues[0] := IntToStr(FWebProjectID);
  962. vInFields[1] := 'tender';
  963. vInValues[1] := IntToStr(FWebTenderID);
  964. vInFields[2] := 'phaseno';
  965. vInValues[2] := IntToStr(FSignPhase);
  966. vInFields[3] := 'name';
  967. vInValues[3] := sReportName;
  968. vInFields[4] := 'ownuid';
  969. vInValues[4] := IntToStr(PHPWeb.UserID);
  970. vInFields[5] := 'widhei';
  971. vInValues[5] := Format('%d_%d', [Round(PreviewComXML.ReportSizeDou.X * 10), Round(PreviewComXML.ReportSizeDou.Y * 10)]);
  972. vUpFileFields[0] := 'upfile';
  973. vUpFileNames[0] := GetTempFileName(FTempPath, '.zip');
  974. ExportReports(vUpFileNames[0]);
  975. vUpFileFields[1] := 'upspdf';
  976. vUpFileNames[1] := GetTempFileName(FTempPath, '.pdf');
  977. PdfHelper.ExportAllPages(PreviewComXML, vUpFileNames[1]);
  978. if PHPWeb.UploadFiles('sign/create', vInFields, vInValues, vUpFileFields, vUpFileNames, sErrorMessage) then
  979. begin
  980. FPostedSignReports.AddSignReport(FSignPhase, ReportTemplateManager.Current.TemplateName, 234);
  981. lblAlreadyUpload.Visible := True;
  982. CloseProgress;
  983. TipMessage('上传完成。');
  984. end
  985. else
  986. begin
  987. CloseProgress;
  988. WarningMessage(Format('%s, 上传数据失败,请重试。', [sErrorMessage]));
  989. end;
  990. end;
  991. end;
  992. procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
  993. Shift: TShiftState; X, Y: Integer);
  994. begin
  995. if (X < offset) and (CurPage > 1) then
  996. begin
  997. TControl(Sender).Cursor := crPrevious;
  998. end
  999. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1000. begin
  1001. TControl(Sender).Cursor := crNext;
  1002. end
  1003. else
  1004. begin
  1005. TControl(Sender).Cursor := crDefault;
  1006. end;
  1007. end;
  1008. procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
  1009. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  1010. begin
  1011. if (X < offset) and (CurPage > 1) then
  1012. begin
  1013. CurPage := CurPage - 1;
  1014. end
  1015. else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
  1016. begin
  1017. CurPage := CurPage + 1;
  1018. end;
  1019. end;
  1020. procedure TSignOnlineReportsForm.ExportPdfReports(const AFileName: string);
  1021. procedure ExportReportPage(APage: Integer; const APageFileName: string);
  1022. var
  1023. imgEn: TImageEnView;
  1024. begin
  1025. imgEn := TImageEnView.Create(nil);
  1026. try
  1027. imgEn.Visible := False;
  1028. imgEn.Parent := Self;
  1029. imgEn.IO.CreatePDFFile(APageFileName);
  1030. imgEn.Bitmap.Height := PreviewComXML.PrintHeight;
  1031. imgEn.Bitmap.Width := PreviewComXML.PrintWidth;
  1032. PreviewComXML.PrintPreviewCanvas(APage, 0, imgEn.Bitmap.Canvas, False);
  1033. imgEn.IO.SaveToPDF;
  1034. finally
  1035. imgEn.Free;
  1036. end;
  1037. end;
  1038. var
  1039. ATempFolder: String;
  1040. i: Integer;
  1041. begin
  1042. ATempFolder := GenerateTempFolder(GetTempFilePath);
  1043. for i := 1 to PreviewComXML.TotalPages do
  1044. begin
  1045. ExportReportPage(i, Format('%s\%d.pdf', [ATempFolder, i]));
  1046. end;
  1047. ZipFolder(ATempFolder, AFileName);
  1048. end;
  1049. function TSignOnlineReportsForm.SafeReportName(var AName: string): Boolean;
  1050. var
  1051. sOrgName: string;
  1052. iCount: Integer;
  1053. bHasQuest: Boolean;
  1054. begin
  1055. Result := False;
  1056. sOrgName := AName;
  1057. iCount := 0;
  1058. FPostedSignReports.LoadAllSignReports(PhPWeb.MeasureURL + 'sign/list', IntToStr(FWebTenderID), IntToStr(FSignPhase));
  1059. while Assigned(FPostedSignReports.FindSignReport(FSignPhase, AName)) do
  1060. begin
  1061. Inc(iCount);
  1062. AName := Format('%s(%d)', [sOrgName, iCount]);
  1063. end;
  1064. Result := SameText(sOrgName, AName);
  1065. if not Result then
  1066. Result := QuestRenameSignReport(AName, FSignPhase);
  1067. end;
  1068. procedure TSignOnlineReportsForm.cbFillZeroClick(Sender: TObject);
  1069. begin
  1070. PreviewComXML.FillZero := cbFillZero.Checked;
  1071. PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
  1072. end;
  1073. end.