SignOnlineReportsFrm.pas 37 KB

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