ReportsFrm.pas 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785
  1. unit ReportsFrm;
  2. interface
  3. // 导出PDF须定义该编译指令
  4. {$DEFINE cplPrint}
  5. // 导出Excel须定义该编译指令
  6. {$DEFINE cplOutputToExcelRange}
  7. uses
  8. ProjectData, ScFileArchiver, ReportManager, ConditionalDefines,
  9. PrintComTypeDefUnit, ADODB, DB, ReportPrepare, ReportConnection,
  10. AuditSelectFrm, ExcelOutput,
  11. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12. Dialogs, PrintCom, PrintComXML, ExtCtrls, ExTreeView, ImgList,
  13. dxBarExtItems, dxBar, ComCtrls, ToolWin, StdCtrls, Jpeg;
  14. type
  15. TReportsForm = class(TForm)
  16. xmReports: TdxBarManager;
  17. xlbPrint: TdxBarLargeButton;
  18. xlbToExcel: TdxBarLargeButton;
  19. xlbToPDF: TdxBarLargeButton;
  20. xlbRealSize: TdxBarLargeButton;
  21. xlbOnePage: TdxBarLargeButton;
  22. xlbTwoPage: TdxBarLargeButton;
  23. xlbFourPage: TdxBarLargeButton;
  24. xcbPages: TdxBarCombo;
  25. xlbFirstPage: TdxBarLargeButton;
  26. xlbPrePage: TdxBarLargeButton;
  27. xlbNextPage: TdxBarLargeButton;
  28. xlbLastPage: TdxBarLargeButton;
  29. xcbStartPage: TdxBarCombo;
  30. xcbEndPage: TdxBarCombo;
  31. xlbSetup: TdxBarLargeButton;
  32. xlbClose: TdxBarLargeButton;
  33. xlbPrintCurPage: TdxBarLargeButton;
  34. dxcciSafePrint: TdxBarControlContainerItem;
  35. ilstLarge: TImageList;
  36. pnlReportsList: TPanel;
  37. extvReport: TExTreeView;
  38. sprReportPreview: TSplitter;
  39. sbReportsPreview: TScrollBox;
  40. PreviewBox: TImage;
  41. PreviewComXML: TPrintComXML;
  42. ilstTree: TImageList;
  43. pnlTopButton: TPanel;
  44. tobaTemplateManager: TToolBar;
  45. tbImportSrt: TToolButton;
  46. tbExportSrt: TToolButton;
  47. tbDeleteSrt: TToolButton;
  48. ilstTemplateContorl: TImageList;
  49. pnlPaperSize: TPanel;
  50. rdbtnA3: TRadioButton;
  51. rdbtnA4: TRadioButton;
  52. chkFillZero: TCheckBox;
  53. dxcciPageSize: TdxBarControlContainerItem;
  54. pnlExcelMode: TPanel;
  55. chkExcelMode: TCheckBox;
  56. chkExcel2010: TCheckBox;
  57. dxcciExcelMode: TdxBarControlContainerItem;
  58. pnlReports: TPanel;
  59. BatchPrintXml: TPrintComXML;
  60. btnRMgr: TToolButton;
  61. pnlSearch: TPanel;
  62. imgSearch: TImage;
  63. edtSearch: TEdit;
  64. procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);
  65. procedure xlbRealSizeClick(Sender: TObject);
  66. procedure xlbOnePageClick(Sender: TObject);
  67. procedure xlbTwoPageClick(Sender: TObject);
  68. procedure xlbFourPageClick(Sender: TObject);
  69. procedure xlbFirstPageClick(Sender: TObject);
  70. procedure xlbPrePageClick(Sender: TObject);
  71. procedure xlbNextPageClick(Sender: TObject);
  72. procedure xlbLastPageClick(Sender: TObject);
  73. procedure xcbPagesChange(Sender: TObject);
  74. procedure xlbPrintCurPageClick(Sender: TObject);
  75. procedure xcbStartPageChange(Sender: TObject);
  76. procedure xlbPrintClick(Sender: TObject);
  77. procedure xlbToPDFClick(Sender: TObject);
  78. procedure xlbToExcelClick(Sender: TObject);
  79. procedure extvReportClick(Sender: TObject);
  80. procedure xlbCloseClick(Sender: TObject);
  81. procedure tbImportSrtClick(Sender: TObject);
  82. procedure tbDeleteSrtClick(Sender: TObject);
  83. procedure tbExportSrtClick(Sender: TObject);
  84. procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
  85. dataType: Integer; isReading: Boolean; DrawType: Integer;
  86. isPrinting: Boolean);
  87. procedure xlbSetupClick(Sender: TObject);
  88. procedure PreviewComXMLCrossTabLabelShow(valIDX: Integer; var ExLeft,
  89. ExRight: Double; var isShow: Boolean; CrsTabShowType: Integer);
  90. procedure rdbtnA4Click(Sender: TObject);
  91. procedure chkFillZeroClick(Sender: TObject);
  92. procedure PreviewComXMLGetDatasetEvent(DatasetInfo: PDatasetInfoRec;
  93. var ADataset: TDataSet);
  94. procedure btnRMgrClick(Sender: TObject);
  95. procedure FormActivate(Sender: TObject);
  96. procedure imgSearchClick(Sender: TObject);
  97. procedure extvReportKeyDown(Sender: TObject; var Key: Word;
  98. Shift: TShiftState);
  99. private
  100. FProjectData: TProjectData;
  101. FCurPage: Integer;
  102. FiPageGroup: Integer;
  103. FiCenterPerPage: Integer;
  104. FbNormal : Boolean;
  105. FDisplayCount: Integer;
  106. FLockForm: Boolean;
  107. // 数据库管理
  108. FReportCon: TReportConnection;
  109. // 报表数据准备
  110. FReportDataPrepare: TReportPrepare;
  111. procedure InitPageSettings(APrintCom: TPrintComXML);
  112. procedure InitFont(APrintCom: TPrintComXML);
  113. procedure InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  114. function GetHintStr: string;
  115. function AddClassNode(AParent: TExTreeNode; const AName: string): TExTreeNode;
  116. function GetClassNode(ANode: TTemplateNode): TExTreeNode;
  117. function GetSubClassNode(AParent: TExTreeNode; AName: string): TExTreeNode;
  118. procedure AddReportTemplate(ANode: TTemplateNode);
  119. procedure LoadReportTemplets;
  120. procedure SaveAuditOpinion(ATemplate: TTemplateNode);
  121. procedure SaveReportInteractData(ATemplate: TTemplateNode);
  122. procedure ResizePreviewBox;
  123. procedure PreviewReportCurPage;
  124. procedure RepaintCurPagePreview;
  125. procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  126. procedure LoadTempletAndDisplay;
  127. procedure BeforeExport;
  128. procedure AfterExport;
  129. procedure LoadExcelBorder(var Border : TColumnLineRec);
  130. procedure PrintReport(ATemplateNode: TTemplateNode; isPDF, isExcel: boolean;
  131. ExcelOutputName, TemplateFileName: string);
  132. procedure ExportXlsReport(AStartPage, AEndPage: Integer; const AFileName: string; APrintCom: TPrintComXML);
  133. procedure ExportCurXlsReport;
  134. procedure ExportAllSelectedXlsReports;
  135. procedure PrintAllSelectedReports;
  136. procedure ExportAllSelectedPDFReports;
  137. procedure ExportReportPage(APage: Integer; const APageFileName: string; AOrg: Boolean);
  138. procedure SetProjectData(const Value: TProjectData);
  139. procedure SetCurPage(const Value: Integer);
  140. function GetPrintEndPage: Integer;
  141. function GetPrintStartPage: Integer;
  142. function GetPageCount: Integer;
  143. function GetPrecededCount: Integer;
  144. function GetExcelMode: TOutputExcelMode;
  145. function GetIsExcel2010: Boolean;
  146. function GetSysTempDirectory : String;
  147. public
  148. destructor Destroy; override;
  149. procedure RefreshReportTemplets;
  150. procedure InitFormView;
  151. procedure InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode = nil);
  152. property ProjectData: TProjectData read FProjectData write SetProjectData;
  153. // 当前预览的页码
  154. property CurPage: Integer read FCurPage write SetCurPage;
  155. // 显示几页
  156. property DisplayCount: Integer read FDisplayCount write FDisplayCount;
  157. // 翻到的页数(例如:当前显示9页,显示4页,则翻到的页数为3)
  158. property PrecededCount: Integer read GetPrecededCount;
  159. property PrintStartPage: Integer read GetPrintStartPage;
  160. property PrintEndPage: Integer read GetPrintEndPage;
  161. property PageCount: Integer read GetPageCount;
  162. property ExcelMode: TOutputExcelMode read GetExcelMode;
  163. property IsExcel2010: Boolean read GetIsExcel2010;
  164. property LockForm: Boolean read FLockForm write FLockForm;
  165. end;
  166. procedure DisplayReportsForm(AProjectData: TProjectData);
  167. implementation
  168. uses
  169. UtilMethods, Math, Globals, ZhAPI, ReportAdjustFrm,
  170. Contnrs, mEncryptUnit, Printers, WinSpool, MainFrm, ConstUnit,
  171. GclBillsGatherModel, ReportPdfHelper, ReportManagerFrm, ReportManagerDM;
  172. {$R *.dfm}
  173. procedure DisplayReportsForm(AProjectData: TProjectData);
  174. var
  175. ReportsForm: TReportsForm;
  176. begin
  177. ReportsForm := TReportsForm.Create(nil);
  178. {ReportsForm.BorderIcons := ReportsForm.BorderIcons - [biMaximize];
  179. ReportsForm.WindowState := wsMaximized;}
  180. ReportsForm.ProjectData := AProjectData;
  181. ReportsForm.InitReportSettings(ReportsForm.PreviewComXML);
  182. ReportsForm.InitFormView;
  183. try
  184. if not _IsDebugView then
  185. ReportsForm.extvReport.OnKeyDown := nil;
  186. ReportsForm.ShowModal;
  187. finally
  188. ReportsForm.Free;
  189. if not _IsDebugView then
  190. AProjectData.ClearReportCacheData;
  191. end;
  192. end;
  193. { TReportsForm }
  194. procedure TReportsForm.LoadReportTemplets;
  195. var
  196. iTemplate: Integer;
  197. TemplateNode: TTemplateNode;
  198. ClassNode: TExTreeNode;
  199. begin
  200. extvReport.Items.Clear;
  201. for iTemplate := 0 to ReportTemplateManager.Count - 1 do
  202. begin
  203. TemplateNode := ReportTemplateManager.Template[iTemplate];
  204. AddReportTemplate(TemplateNode);
  205. end;
  206. extvReport.AlphaSort;
  207. // 强制展开全部节点
  208. // 某些情况下,创建节点处的展开方法失效
  209. ClassNode := extvReport.Items.GetFirstNode;
  210. while Assigned(ClassNode) do
  211. begin
  212. ClassNode.ForcedExpand(True);
  213. ClassNode := ClassNode.getNextSibling;
  214. end;
  215. extvReport.Selected := extvReport.Items.GetFirstNode;
  216. end;
  217. procedure TReportsForm.LoadTempletAndDisplay;
  218. procedure ResetReportsVariant;
  219. var
  220. iPage: Integer;
  221. begin
  222. FbNormal := False;
  223. xcbPages.Items.Clear;
  224. for iPage := 1 to PreviewComXML.TotalPages do
  225. xcbPages.Items.Add(IntToStr(iPage));
  226. xcbStartPage.Items.Assign(xcbPages.Items);
  227. xcbStartPage.ItemIndex := 0;
  228. xcbEndPage.Items.Assign(xcbPages.Items);
  229. xcbEndPage.ItemIndex := xcbEndPage.Items.Count - 1;
  230. xlbRealSize.Down := True;
  231. DisplayCount := 1;
  232. CurPage := 1;
  233. end;
  234. procedure WaringAndEmptyPreview(AStr: string);
  235. var
  236. OldBrushColor, OldPenColor: TColor;
  237. begin
  238. TipMessage(AStr, Handle);
  239. OldBrushColor := PreviewBox.Canvas.Brush.Color;
  240. OldPenColor := PreviewBox.Canvas.Pen.Color;
  241. try
  242. PreviewBox.Canvas.Brush.Color := clBtnFace;
  243. PreviewBox.Canvas.Pen.Color := clBlack;
  244. PreviewBox.Canvas.Rectangle(PreviewBox.BoundsRect);
  245. finally
  246. PreviewBox.Canvas.Brush.Color := OldBrushColor;
  247. PreviewBox.Canvas.Pen.Color := OldPenColor;
  248. end;
  249. end;
  250. procedure PreviewTemplet;
  251. begin
  252. try
  253. ResizePreviewBox;
  254. ResetReportsVariant;
  255. except
  256. WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
  257. end;
  258. end;
  259. procedure LoadEmptyTempletAndDisplay;
  260. begin
  261. WaringAndEmptyPreview('报表无数据,请选择其他报表。');
  262. end;
  263. var
  264. vTemplateNode: TTemplateNode;
  265. pNode: PTemplateNode;
  266. begin
  267. if not Assigned(extvReport.Selected) then Exit;
  268. vTemplateNode := TTemplateNode(extvReport.Selected.Data);
  269. if not Assigned(vTemplateNode) then Exit;
  270. ReportTemplateManager.Current := vTemplateNode;
  271. // 交互表
  272. if vTemplateNode.InteractFlag <> 0 then
  273. SaveReportInteractData(vTemplateNode);
  274. // 准备额外数据
  275. if vTemplateNode.DataPrepareFlag <> 0 then
  276. FReportDataPrepare.PrepareData(vTemplateNode.DataPrepareFlag);
  277. FReportCon.RefreshConnection(vTemplateNode);
  278. Screen.Cursor := crHourGlass;
  279. try
  280. LoadTemplet(vTemplateNode, PreviewComXML);
  281. if PreviewComXML.TotalPages > 0 then
  282. PreviewTemplet
  283. else
  284. LoadEmptyTempletAndDisplay;
  285. finally
  286. Screen.Cursor := crDefault;
  287. end;
  288. end;
  289. procedure TReportsForm.SetProjectData(const Value: TProjectData);
  290. begin
  291. FProjectData := Value;
  292. FReportDataPrepare := TReportPrepare.Create(FProjectData);
  293. FReportCon := TReportConnection.Create(FProjectData);
  294. extvReport.Selected := extvReport.Items[0];
  295. LoadReportTemplets;
  296. LoadTempletAndDisplay;
  297. end;
  298. procedure TReportsForm.PreviewComXMLGetDataConnection(
  299. var ADOCon: TADOConnection);
  300. begin
  301. ADOCon := FReportCon.Connection;
  302. end;
  303. procedure TReportsForm.PreviewReportCurPage;
  304. begin
  305. if FbNormal then
  306. PreviewComXML.PrintPreviewCanvas(-1, PrecededCount, PreviewBox.Canvas, True)
  307. else //强制1:1显示
  308. PreviewComXML.PrintPreviewCanvas(CurPage, 0, PreviewBox.Canvas, True);
  309. end;
  310. procedure TReportsForm.ResizePreviewBox;
  311. var
  312. iHeight, iWidth: Integer;
  313. begin
  314. if FbNormal then
  315. begin
  316. iHeight := sbReportsPreview.ClientHeight;
  317. iWidth := sbReportsPreview.ClientWidth;
  318. end
  319. else
  320. begin
  321. iHeight := Max(PreviewComXML.PrintHeight + 20, sbReportsPreview.ClientHeight);
  322. iWidth := Max(PreviewComXML.PrintWidth + 20, sbReportsPreview.ClientWidth);
  323. end;
  324. if PreviewBox.Height <> iHeight then
  325. begin
  326. PreviewBox.Height := iHeight;
  327. PreviewBox.Picture.Bitmap.Height := iHeight;
  328. end;
  329. if PreviewBox.Width <> iWidth then
  330. begin
  331. PreviewBox.Width := iWidth;
  332. PreviewBox.Picture.Bitmap.Width := iWidth;
  333. end;
  334. end;
  335. procedure TReportsForm.RepaintCurPagePreview;
  336. begin
  337. ResizePreviewBox;
  338. PreviewReportCurPage;
  339. end;
  340. procedure TReportsForm.xlbRealSizeClick(Sender: TObject);
  341. begin
  342. FbNormal := False;
  343. DisplayCount := TdxBarLargeButton(Sender).Tag;
  344. RepaintCurPagePreview;
  345. end;
  346. procedure TReportsForm.xlbOnePageClick(Sender: TObject);
  347. begin
  348. PreviewComXML.PreviewRows := 1;
  349. PreviewComXML.PreviewCols := 1;
  350. DisplayCount := TdxBarLargeButton(Sender).Tag;
  351. FbNormal := True;
  352. RepaintCurPagePreview;
  353. end;
  354. procedure TReportsForm.xlbTwoPageClick(Sender: TObject);
  355. begin
  356. if PreviewComXML.ReportSize.X > PreviewComXML.ReportSize.Y then
  357. begin
  358. PreviewComXML.PreviewRows := 2;
  359. PreviewComXML.PreviewCols := 1;
  360. end
  361. else
  362. begin
  363. PreviewComXML.PreviewRows := 1;
  364. PreviewComXML.PreviewCols := 2;
  365. end;
  366. DisplayCount := TdxBarLargeButton(Sender).Tag;
  367. FbNormal := true;
  368. RepaintCurPagePreview;
  369. end;
  370. procedure TReportsForm.xlbFourPageClick(Sender: TObject);
  371. begin
  372. PreviewComXML.PreviewRows := 2;
  373. PreviewComXML.PreviewCols := 2;
  374. DisplayCount := TdxBarLargeButton(Sender).Tag;
  375. FbNormal := true;
  376. RepaintCurPagePreview;
  377. end;
  378. procedure TReportsForm.xlbFirstPageClick(Sender: TObject);
  379. begin
  380. CurPage := 1;
  381. end;
  382. procedure TReportsForm.SetCurPage(const Value: Integer);
  383. begin
  384. if (Value < 0) or (Value > PageCount) then Exit;
  385. FCurPage := Value;
  386. xcbPages.Text := IntToStr(FCurPage);
  387. //PreviewComXML.FillZero := chkFillZero.Checked;
  388. PreviewReportCurPage;
  389. end;
  390. function TReportsForm.GetPrintEndPage: Integer;
  391. begin
  392. Result := StrToIntDef(xcbEndPage.Text, 0);
  393. end;
  394. function TReportsForm.GetPrintStartPage: Integer;
  395. begin
  396. Result := StrToIntDef(xcbStartPage.Text, 0);
  397. end;
  398. function TReportsForm.GetPageCount: Integer;
  399. begin
  400. Result := PreviewComXML.TotalPages;
  401. end;
  402. function TReportsForm.GetPrecededCount: Integer;
  403. begin
  404. Result := (CurPage + (DisplayCount - 1)) div DisplayCount;
  405. end;
  406. procedure TReportsForm.xlbPrePageClick(Sender: TObject);
  407. begin
  408. if CurPage > 1 then
  409. CurPage := CurPage - 1;
  410. end;
  411. procedure TReportsForm.xlbNextPageClick(Sender: TObject);
  412. begin
  413. if CurPage < PageCount then
  414. CurPage := CurPage + 1;
  415. end;
  416. procedure TReportsForm.xlbLastPageClick(Sender: TObject);
  417. begin
  418. CurPage := PageCount;
  419. end;
  420. procedure TReportsForm.xcbPagesChange(Sender: TObject);
  421. begin
  422. if (StrToIntDef(xcbPages.Text, 0) > 0) and
  423. (StrToIntDef(xcbPages.Text, 0) <= PageCount) then
  424. CurPage := StrToIntDef(xcbPages.Text, 0)
  425. else
  426. xcbPages.Text := IntToStr(CurPage);
  427. end;
  428. procedure TReportsForm.xlbPrintCurPageClick(Sender: TObject);
  429. var
  430. img: TJPEGImage;
  431. begin
  432. if _IsEncrypt or G_IsCloud then
  433. PreviewComXML.Print(PreviewBox.Canvas, CurPage, 1)
  434. else
  435. TipMessage(GetHintStr, Handle);
  436. //PreviewBox.Picture.SaveToFile('E:\Org.bmp');
  437. //ExportReportPage(1, 'E:\Org.jpg', True);
  438. //ExportReportPage(1, 'E:\Cut.jpg', False);
  439. end;
  440. procedure TReportsForm.xcbStartPageChange(Sender: TObject);
  441. begin
  442. if (StrToIntDef(TdxBarCombo(Sender).Text, 0) > 0) and
  443. (StrToIntDef(TdxBarCombo(Sender).Text, 0) <= PageCount) then
  444. TdxBarCombo(Sender).Tag := StrToIntDef(TdxBarCombo(Sender).Text, 0)
  445. else
  446. TdxBarCombo(Sender).Text := IntToStr(TdxBarCombo(Sender).Tag);
  447. end;
  448. procedure TReportsForm.xlbPrintClick(Sender: TObject);
  449. begin
  450. if _IsEncrypt or G_IsCloud then
  451. begin
  452. if extvReport.LeafCheckedCount > 0 then
  453. PrintAllSelectedReports
  454. else
  455. PreviewComXML.PrintMultiPages(PreviewBox.Canvas, PrintStartPage, PrintEndPage);
  456. end
  457. else
  458. TipMessage(GetHintStr, Handle);
  459. end;
  460. procedure TReportsForm.PrintAllSelectedReports;
  461. var
  462. iIndex: Integer;
  463. Node: TExTreeNode;
  464. vTemplateNode: TTemplateNode;
  465. begin
  466. for iIndex := 0 to extvReport.Items.Count - 1 do
  467. begin
  468. Node := extvReport.Items[iIndex];
  469. if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;
  470. vTemplateNode := TTemplateNode(Node.Data);
  471. if FileExists(vTemplateNode.FileName) then
  472. PrintReport(vTemplateNode, False, False, '', '');
  473. end;
  474. extvReport.ClearChecked;
  475. end;
  476. procedure TReportsForm.xlbToPDFClick(Sender: TObject);
  477. var
  478. sFileName: string;
  479. begin
  480. if _IsEncrypt or G_IsCloud then
  481. begin
  482. if extvReport.LeafCheckedCount > 0 then
  483. ExportAllSelectedPDFReports
  484. else
  485. begin
  486. sFileName := PreviewComXML.ReportName + '.pdf';
  487. if SaveFile(sFileName, '.pdf') then
  488. PdfHelper.ExportPages(PreviewComXML, sFileName, PrintStartPage, PrintEndPage);
  489. end;
  490. end
  491. else
  492. TipMessage(GetHintStr, Handle);
  493. end;
  494. procedure TReportsForm.ExportAllSelectedPDFReports;
  495. var
  496. iIndex: Integer;
  497. Node: TExTreeNode;
  498. vTemplateNode: TTemplateNode;
  499. begin
  500. for iIndex := 0 to extvReport.Items.Count - 1 do
  501. begin
  502. Node := extvReport.Items[iIndex];
  503. if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;
  504. vTemplateNode := TTemplateNode(Node.Data);
  505. if FileExists(vTemplateNode.FileName) then
  506. PrintReport(vTemplateNode, True, False,'','');
  507. end;
  508. extvReport.ClearChecked;
  509. end;
  510. procedure TReportsForm.xlbToExcelClick(Sender: TObject);
  511. begin
  512. if _IsEncrypt or G_IsCloud then
  513. begin
  514. if extvReport.LeafCheckedCount > 0 then
  515. ExportAllSelectedXlsReports
  516. else
  517. ExportCurXlsReport;
  518. end
  519. else
  520. TipMessage(GetHintStr, Handle);
  521. end;
  522. procedure TReportsForm.ExportAllSelectedXlsReports;
  523. var
  524. iIndex: Integer;
  525. Node: TExTreeNode;
  526. vTemplateNode: TTemplateNode;
  527. sPath, sOutputFileName: String;
  528. begin
  529. if BrowseFolder(sPath, '请选择导出报表路径', Handle) then
  530. begin
  531. for iIndex := 0 to extvReport.Items.Count - 1 do
  532. begin
  533. Node := extvReport.Items[iIndex];
  534. if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;
  535. vTemplateNode := TTemplateNode(Node.Data);
  536. if IsExcel2010 then
  537. sOutputFileName := sPath + ExtractSimpleFileName(vTemplateNode.FileName) + '.xlsx'
  538. else
  539. sOutputFileName := sPath + ExtractSimpleFileName(vTemplateNode.FileName) + '.xls';
  540. if FileExists(vTemplateNode.FileName) then
  541. PrintReport(vTemplateNode, False, True, sOutputFileName, GetTemplateXlsFileName);
  542. end;
  543. extvReport.ClearChecked;
  544. end;
  545. end;
  546. procedure TReportsForm.ExportCurXlsReport;
  547. var
  548. sFileName: string;
  549. begin
  550. sFileName := extvReport.Selected.Text;
  551. if IsExcel2010 then
  552. begin
  553. if (PrintStartPage <= PrintEndPage) and SaveFile(sFileName, '.xlsx') then
  554. ExportXlsReport(PrintStartPage, PrintEndPage, sFileName, PreviewComXML);
  555. end
  556. else
  557. begin
  558. if (PrintStartPage <= PrintEndPage) and SaveFile(sFileName, '.xls') then
  559. ExportXlsReport(PrintStartPage, PrintEndPage, sFileName, PreviewComXML);
  560. end;
  561. end;
  562. procedure TReportsForm.AfterExport;
  563. begin
  564. // ToDo - 关闭进度条
  565. // ToDo - 取消设置Update进度条事件
  566. // PreviewComXML.OnProgress := nil;
  567. Screen.Cursor := crDefault;
  568. end;
  569. procedure TReportsForm.BeforeExport;
  570. begin
  571. Screen.Cursor := crHourGlass;
  572. // ToDo - 设置Update进度条事件
  573. // PreviewComXML.OnProgress := PreviewComXMLProgress;
  574. // ToDo - 打开进度条
  575. end;
  576. function TReportsForm.GetExcelMode: TOutputExcelMode;
  577. begin
  578. if chkExcelMode.Checked then
  579. Result := oemOneSheet
  580. else
  581. Result := oemNormal;
  582. end;
  583. procedure TReportsForm.extvReportClick(Sender: TObject);
  584. begin
  585. LoadTempletAndDisplay;
  586. end;
  587. procedure TReportsForm.xlbCloseClick(Sender: TObject);
  588. begin
  589. Close;
  590. end;
  591. procedure TReportsForm.AddReportTemplate(ANode: TTemplateNode);
  592. var
  593. vClassNode, vNode: TExTreeNode;
  594. begin
  595. vClassNode := GetClassNode(ANode);
  596. if ANode.SubClassNum <> '' then
  597. begin
  598. vClassNode := GetSubClassNode(vClassNode, ANode.SubClassNum + '.' + ANode.SubClassName);
  599. if ANode.Class3Num <> '' then
  600. begin
  601. vClassNode := GetSubClassNode(vClassNode, ANode.Class3Num + '.' + ANode.Class3Name);
  602. if ANode.Class4Num <> '' then
  603. vClassNode := GetSubClassNode(vClassNode, ANode.Class4Num + '.' + ANode.Class4Name);
  604. end;
  605. end;
  606. vNode := extvReport.Items.AddChildObject(vClassNode, ANode.TemplateName, Pointer(ANode));
  607. vNode.ImageIndex := 2;
  608. vNode.SelectedIndex := 3;
  609. vNode.Checked := csUnchecked;
  610. if (vClassNode <> nil) and not vClassNode.Expanded then
  611. vClassNode.Expanded := True;
  612. end;
  613. function TReportsForm.GetClassNode(ANode: TTemplateNode): TExTreeNode;
  614. function FindClassNode(const AName: string): TExTreeNode;
  615. var
  616. I: Integer;
  617. vNode: TExTreeNode;
  618. begin
  619. Result := nil;
  620. for I := 0 to extvReport.Items.Count - 1 do
  621. begin
  622. vNode := extvReport.Items.Item[I];
  623. if SameText(vNode.Text, AName) then
  624. begin
  625. Result := vNode;
  626. Break;
  627. end;
  628. end;
  629. end;
  630. begin
  631. Result := FindClassNode(ANode.ClassNum + '.' + ANode.ClassName);
  632. if not Assigned(Result) then
  633. Result := AddClassNode(nil, ANode.ClassNum + '.' + ANode.ClassName);
  634. end;
  635. procedure TReportsForm.tbImportSrtClick(Sender: TObject);
  636. procedure ImportReportTemplate(const AFileName: string);
  637. var
  638. sNewFileName: string;
  639. vTemplateNode: TTemplateNode;
  640. begin
  641. sNewFileName := GetReportTemplatePath + ExtractFileName(AFileName);
  642. if not FileExists(sNewFileName) then
  643. begin
  644. CopyFileOrFolder(AFileName, sNewFileName);
  645. vTemplateNode := ReportTemplateManager.AddReportTemplate(sNewFileName);
  646. AddReportTemplate(vTemplateNode);
  647. end
  648. else
  649. if QuestMessage('已存在报表模板' + ExtractFileName(AFileName) + ',是否覆盖原模板?', Handle) then
  650. begin
  651. CopyFileOrFolder(AFileName, sNewFileName);
  652. vTemplateNode := ReportTemplateManager.FindTemplate(sNewFileName);
  653. if Assigned(vTemplateNode) then
  654. vTemplateNode.RefreshTemplateProperties;
  655. end
  656. else
  657. Exit;
  658. end;
  659. var
  660. sgsFiles: TStrings;
  661. iFile: Integer;
  662. begin
  663. sgsFiles := TStringList.Create;
  664. try
  665. if SelectFiles(sgsFiles, '.srt') then
  666. begin
  667. for iFile := 0 to sgsFiles.Count - 1 do
  668. ImportReportTemplate(sgsFiles.Strings[iFile]);
  669. end;
  670. finally
  671. sgsFiles.Free;
  672. end;
  673. end;
  674. procedure TReportsForm.tbDeleteSrtClick(Sender: TObject);
  675. var
  676. vTemplateNode: TTemplateNode;
  677. begin
  678. if not Assigned(extvReport.Selected) then Exit;
  679. vTemplateNode := TTemplateNode(extvReport.Selected.Data);
  680. if not Assigned(vTemplateNode) then Exit;
  681. extvReport.Items.Delete(extvReport.Selected);
  682. DeleteFile(vTemplateNode.FileName);
  683. ReportTemplateManager.DeleteReportTemplate(vTemplateNode);
  684. LoadTempletAndDisplay;
  685. end;
  686. procedure TReportsForm.tbExportSrtClick(Sender: TObject);
  687. var
  688. vTemplateNode: TTemplateNode;
  689. sFileName: string;
  690. begin
  691. if not Assigned(extvReport.Selected) then Exit;
  692. vTemplateNode := TTemplateNode(extvReport.Selected.Data);
  693. if not Assigned(vTemplateNode) then Exit;
  694. sFileName := vTemplateNode.TemplateName;
  695. if SaveFile(sFileName, '.srt') then
  696. begin
  697. if not FileExists(sFileName) or QuestMessage('存在同名文件,是否覆盖?', Handle) then
  698. CopyFileOrFolder(vTemplateNode.FileName, sFileName);
  699. end;
  700. end;
  701. procedure TReportsForm.PreviewComXMLContentDisplay(
  702. var contentFontRec: TFontRec; dataType: Integer; isReading: Boolean;
  703. DrawType: Integer; isPrinting: Boolean);
  704. begin
  705. if ReportConfig.ContentIsNarrow then
  706. begin
  707. if (isReading) then
  708. begin
  709. begin
  710. contentFontRec.FontName := 'Arial Narrow';
  711. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  712. end;
  713. end else
  714. begin
  715. if (DrawType = DRAW_TYPE_EXCEL_XML) or (DrawType = DRAW_TYPE_EXCEL) or (DrawType = DRAW_TYPE_EXCEL_OE) then
  716. begin
  717. if (dataType <> DATA_TYPE_DOUBLE) and (dataType <> DATA_TYPE_FLOAT) then
  718. begin
  719. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  720. end;
  721. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  722. end else if (isPrinting) then
  723. begin
  724. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  725. begin
  726. contentFontRec.FontName := 'Arial Narrow';
  727. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 7 div 6;
  728. end else
  729. begin
  730. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  731. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  732. end;
  733. end else
  734. begin
  735. if (dataType = DATA_TYPE_DOUBLE) or (dataType = DATA_TYPE_FLOAT) then
  736. begin
  737. contentFontRec.FontName := 'Arial Narrow';
  738. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;
  739. end else
  740. begin
  741. contentFontRec.FontName := ReportConfig.ContentFont.Name;
  742. contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);
  743. end;
  744. end;
  745. end;
  746. end;
  747. end;
  748. procedure TReportsForm.xlbSetupClick(Sender: TObject);
  749. begin
  750. if AdjustReport then
  751. LoadTempletAndDisplay;
  752. end;
  753. procedure TReportsForm.InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode);
  754. begin
  755. APrintCom.FillZero := chkFillZero.Checked;
  756. InitPageSettings(APrintCom);
  757. InitPaperSettings(ATemplate, APrintCom);
  758. {APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
  759. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;}
  760. if FProjectData.ProjProperties.ReportShowState then
  761. begin
  762. if FProjectData.ProjProperties.ReportShowStateWithoutReply and
  763. ((FProjectData.ProjProperties.AuditStatus = -1) or (FProjectData.PhaseIndex < FProjectData.ProjProperties.PhaseCount)) then
  764. APrintCom.ShowBackgroundMark := False
  765. else
  766. APrintCom.ShowBackgroundMark := True;
  767. end
  768. else
  769. APrintCom.ShowBackgroundMark := False;
  770. APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShowStateText;
  771. end;
  772. procedure TReportsForm.InitPageSettings(APrintCom: TPrintComXML);
  773. begin
  774. // 设置页面大小
  775. APrintCom.setPageSize(ReportConfig.PageSize);
  776. if ReportConfig.PageSize = 'A3' then
  777. APrintCom.PrintPageSizeIdx := DMPAPER_A3
  778. else if ReportConfig.PageSize = 'A4' then
  779. APrintCom.PrintPageSizeIdx := DMPAPER_A4;
  780. // 设置边距
  781. APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
  782. APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
  783. APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
  784. APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
  785. end;
  786. procedure TReportsForm.InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  787. procedure InitRepBorderLine;
  788. var
  789. i: Integer;
  790. ObjList : TList;
  791. ShapeRec : PPicRec;
  792. begin
  793. ObjList := TList.Create;
  794. try
  795. APrintCom.getAllShapeObjs(1, ObjList);
  796. for i := 0 to ObjList.Count - 1 do
  797. begin
  798. ShapeRec := ObjList[i];
  799. // 设置报表边框线粗
  800. ShapeRec.PenWidth := ReportConfig.BorderLine;
  801. // 设置是否绘制报表边框横线
  802. if (ShapeRec.ExArea.ExLeft <> ShapeRec.ExArea.ExRight) then
  803. begin
  804. if not ReportConfig.RepBorderUnderLine then
  805. ShapeRec.PenStyle := integer(psClear)
  806. else
  807. ShapeRec.PenStyle := integer(psSolid);
  808. end;
  809. // 设置是否绘制报表边框竖线
  810. if (ShapeRec.ExArea.ExTop <> ShapeRec.ExArea.ExBottom) and
  811. ((ShapeRec.ExArea.ExLeft = 0) or (ShapeRec.ExArea.ExLeft = 100)) then
  812. begin //这里的判断条件是约定好的
  813. if not ReportConfig.RepBorderVerLine then
  814. ShapeRec.PenStyle := integer(psClear)
  815. else
  816. ShapeRec.PenStyle := integer(psSolid)
  817. end;
  818. APrintCom.setShapeObj(ShapeRec);
  819. end;
  820. finally
  821. ObjList.Free;
  822. end;
  823. end;
  824. procedure InitRepCellLine;
  825. var
  826. i: Integer;
  827. ObjList : TList;
  828. ColumnRec : PColumnRec;
  829. FlowContentRec : PContentRec;
  830. CrossContentRec : PCrossContentRec;
  831. begin
  832. ObjList := TList.Create;
  833. try
  834. APrintCom.getAllFlowShowContentObjs(ObjList);
  835. // 设置报表表格横线
  836. for i := 0 to ObjList.Count - 1 do
  837. begin
  838. FlowContentRec := ObjList[i];
  839. FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  840. FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  841. APrintCom.setFlowContentObj(FlowContentRec);
  842. end;
  843. APrintCom.getAllCrossContentObjs(ObjList);
  844. for i := 0 to ObjList.Count - 1 do
  845. begin
  846. CrossContentRec := ObjList[i];
  847. CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  848. CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  849. APrintCom.setCrossContentObj(CrossContentRec);
  850. end;
  851. // 设置报表表格竖线
  852. APrintCom.getAllFlowShowContentObjs(ObjList);
  853. for i := 0 to ObjList.Count - 1 do
  854. begin
  855. FlowContentRec := ObjList[i];
  856. FlowContentRec.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  857. FlowContentRec.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  858. // 如果设置无表格边框线,则两端的表格竖线线粗为0
  859. if (not ReportConfig.RepBorderVerLine) then
  860. if (i = 0) then
  861. FlowContentRec.LineInfo.LeftThick := 0
  862. else if (i = ObjList.Count - 1) then
  863. FlowContentRec.LineInfo.RightThick := 0;
  864. APrintCom.setFlowContentObj(FlowContentRec);
  865. end;
  866. APrintCom.getAllCrossContentObjs(ObjList);
  867. for i := 0 to ObjList.Count - 1 do
  868. begin
  869. CrossContentRec := ObjList[i];
  870. CrossContentRec.CrossContent.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  871. CrossContentRec.CrossContent.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  872. ColumnRec := CrossContentRec.CrossContent.Column;
  873. //这里还要判断如果没有边框竖线的情况下,表格竖线边缘的线粗也为0
  874. //前提是所属表栏最右位置位于边缘
  875. if (not ReportConfig.RepBorderVerLine) and (ColumnRec<>nil) and
  876. ((ColumnRec.ExArea.ExRight = 100.0) or (ColumnRec.ExArea.ExLeft = 0.0)) then
  877. begin
  878. case CrossContentRec.CrossType of
  879. 0 : //交叉行
  880. begin
  881. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  882. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  883. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  884. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  885. end;
  886. 1 : //交叉列
  887. begin
  888. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  889. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  890. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  891. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  892. //(*
  893. if (CrossContentRec.CrossContent.isSpecialBorder) then
  894. begin
  895. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  896. CrossContentRec.CrossContent.SpecialLineInfo.RightThick := 0;
  897. end;
  898. //*)
  899. end;
  900. 2 : //显示数据
  901. begin
  902. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  903. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  904. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  905. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  906. end;
  907. 3 : //固定LABEL
  908. begin
  909. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  910. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  911. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  912. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  913. end;
  914. 4 : //序号
  915. begin
  916. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  917. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  918. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  919. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  920. end;
  921. 5 : //横向统计
  922. begin
  923. if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then
  924. CrossContentRec.CrossContent.LineInfo.LeftThick := 0;
  925. if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then
  926. CrossContentRec.CrossContent.LineInfo.RightThick := 0;
  927. end;
  928. end;
  929. end;
  930. APrintCom.setCrossContentObj(CrossContentRec);
  931. end;
  932. finally
  933. ObjList.Free;
  934. end;
  935. end;
  936. procedure InitOtherArea;
  937. procedure SetPTRBorder(PTR : PTextRec);
  938. procedure SetLeftRightBorder;
  939. begin
  940. if PTR.ExArea.ExLeft = 0.0 then
  941. begin
  942. if BorderWidth = 0.0 then
  943. PTR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth;
  944. end;
  945. if PTR.ExArea.ExRight = 100.0 then
  946. begin
  947. if BorderWidth = 0.0 then
  948. PTR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth
  949. end;
  950. end;
  951. procedure SetHorLine;
  952. begin
  953. if (PTR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  954. PTR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  955. if (PTR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  956. PTR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  957. end;
  958. begin
  959. SetLeftRightBorder;
  960. SetHorLine;
  961. end;
  962. procedure SetPCRBorder(PCR : PColumnRec);
  963. procedure SetLeftRightBorder;
  964. begin
  965. if PCR.ExArea.ExLeft = 0.0 then
  966. begin
  967. if BorderWidth = 0.0 then
  968. PCR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth
  969. end;
  970. if PCR.ExArea.ExRight = 100.0 then
  971. begin
  972. if BorderWidth = 0.0 then
  973. PCR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth;
  974. end;
  975. end;
  976. procedure SetVerLine;
  977. begin
  978. if PCR.ExArea.ExLeft = 0.0 then
  979. PCR.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;
  980. if PCR.ExArea.ExRight = 100.0 then
  981. PCR.LineInfo.RightThick := ReportConfig.CellVerLineWidth;
  982. end;
  983. procedure SetHorLine;
  984. begin
  985. if (PCR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then
  986. PCR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
  987. if (PCR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then
  988. PCR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
  989. end;
  990. begin
  991. SetLeftRightBorder;
  992. SetVerLine;
  993. SetHorLine;
  994. end;
  995. var i,k : integer;
  996. ObjList : TList;
  997. ActAreaRec : PActiveAreaRec;
  998. PSR : PShowElementRec;
  999. begin
  1000. ObjList := TList.Create;
  1001. try
  1002. ActAreaRec := nil;
  1003. PreviewComXML.getAllActAreaObjs(ObjList);
  1004. for i := 0 to ObjList.Count - 1 do
  1005. begin
  1006. ActAreaRec := ObjList[i];
  1007. if (ActAreaRec.ShowType < 0) or (ActAreaRec.ShowType > 2) then Continue;
  1008. if not Assigned(ActAreaRec.ElementList) then Continue;
  1009. for k := 0 to ActAreaRec.ElementList.Count - 1 do
  1010. begin
  1011. PSR := PShowElementRec(ActAreaRec.ElementList[k]);
  1012. case PSR.ElementType of
  1013. 0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏
  1014. 7 : SetPCRBorder(PSR.Data) //Column
  1015. end;
  1016. APrintCom.setActShowElementObj(PSR);
  1017. end;
  1018. end;
  1019. finally
  1020. ObjList.Free;
  1021. end;
  1022. end;
  1023. begin
  1024. if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
  1025. begin
  1026. InitFont(APrintCom); // 各类字体
  1027. InitRepBorderLine; // 报表边框
  1028. InitRepCellLine; // 报表表格
  1029. InitOtherArea; // 活动区域
  1030. end;
  1031. end;
  1032. procedure TReportsForm.PreviewComXMLCrossTabLabelShow(valIDX: Integer;
  1033. var ExLeft, ExRight: Double; var isShow: Boolean;
  1034. CrsTabShowType: Integer);
  1035. var field : PFieldRec;
  1036. begin
  1037. if (CrsTabShowType = -1) then exit;
  1038. field := PreviewComXML.getFieldByID(6);
  1039. if (field <> nil) then
  1040. begin
  1041. if (field.DataLen > valIDX) and (valIDX >= 0) then
  1042. begin
  1043. if (field.Value[valIDX] = 1.5) then
  1044. begin
  1045. case CrsTabShowType of
  1046. 1 : begin
  1047. isShow := false;
  1048. end;
  1049. 2 : begin
  1050. ExLeft := 0;
  1051. ExRight := 100;
  1052. end;
  1053. 3 : begin
  1054. //
  1055. end
  1056. else
  1057. begin
  1058. //
  1059. end;
  1060. end;
  1061. end;
  1062. end;
  1063. end;
  1064. end;
  1065. procedure TReportsForm.rdbtnA4Click(Sender: TObject);
  1066. begin
  1067. ReportConfig.PageSize := TRadioButton(Sender).Caption;
  1068. SetPrinterPageSize(ReportConfig.PageSize);
  1069. LoadTempletAndDisplay;
  1070. end;
  1071. procedure TReportsForm.chkFillZeroClick(Sender: TObject);
  1072. begin
  1073. PreviewComXML.FillZero := chkFillZero.Checked;
  1074. PreviewReportCurPage;
  1075. end;
  1076. procedure TReportsForm.InitFont(APrintCom: TPrintComXML);
  1077. procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);
  1078. begin
  1079. AFontRec.FontName := AFont.Name;
  1080. AFontRec.FontHeight := Round(AFont.Size*4/3) ;
  1081. AFontRec.FontBold := 400 + Integer(fsBold in AFont.Style)*200;
  1082. AFontRec.FontItalic := Integer(fsItalic in AFont.Style);
  1083. AFontRec.FontUnderLine := Integer(fsUnderLine in AFont.Style);
  1084. end;
  1085. procedure InitTitleFont;
  1086. var
  1087. TitleRec : PTitleRec;
  1088. begin
  1089. TitleRec := PreviewComXML.getTitleByID(1);
  1090. if TitleRec <> nil then
  1091. begin
  1092. AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);
  1093. APrintCom.setTitleObj(TitleRec);
  1094. end;
  1095. end;
  1096. procedure InitColumnFont;
  1097. procedure InitColumnThick(AColumnRec: PColumnRec);
  1098. begin
  1099. if (ReportConfig.ReportCellLine > 0.2) then
  1100. begin
  1101. if (AColumnRec.LineInfo.LeftThick > 0.2) then
  1102. AColumnRec.LineInfo.LeftThick := ReportConfig.ReportCellLine;
  1103. if (AColumnRec.LineInfo.RightThick > 0.2) then
  1104. AColumnRec.LineInfo.RightThick := ReportConfig.ReportCellLine;
  1105. if (AColumnRec.LineInfo.TopThick > 0.2) then
  1106. AColumnRec.LineInfo.TopThick := ReportConfig.ReportCellLine;
  1107. if (AColumnRec.LineInfo.BottomThick > 0.2) then
  1108. AColumnRec.LineInfo.BottomThick := ReportConfig.ReportCellLine;
  1109. end;
  1110. end;
  1111. var
  1112. i, j: Integer;
  1113. ObjList: TList;
  1114. ColumnRec : PColumnRec;
  1115. AAR : PActiveAreaRec;
  1116. SER : PShowElementRec;
  1117. begin
  1118. ObjList := TList.Create;
  1119. try
  1120. APrintCom.getAllColumnHeadObjs(ObjList);
  1121. for i := 0 to ObjList.Count - 1 do
  1122. begin
  1123. ColumnRec := ObjList[i];
  1124. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  1125. InitColumnThick(ColumnRec);
  1126. APrintCom.setColumnHeadTailObj(0, ColumnRec);
  1127. end;
  1128. APrintCom.getAllColumnTailObjs(ObjList);
  1129. for i := 0 to ObjList.Count - 1 do
  1130. begin
  1131. ColumnRec := ObjList[i];
  1132. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  1133. InitColumnThick(ColumnRec);
  1134. APrintCom.setColumnHeadTailObj(1,ColumnRec);
  1135. end;
  1136. APrintCom.getAllActAreaObjs(ObjList);
  1137. for i := 0 to ObjList.Count - 1 do
  1138. begin
  1139. AAR := ObjList[i];
  1140. for j := 0 to AAR.ElementList.Count - 1 do
  1141. begin
  1142. SER := AAR.ElementList[j];
  1143. if (SER.ElementType = 7) then
  1144. begin
  1145. ColumnRec := SER.Data;
  1146. AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
  1147. InitColumnThick(ColumnRec);
  1148. APrintCom.setActShowElementObj(SER);
  1149. end;
  1150. end;
  1151. end;
  1152. finally
  1153. ObjList.Free;
  1154. end;
  1155. end;
  1156. procedure InitContentAndGatherFont;
  1157. var
  1158. i, j: Integer;
  1159. ObjList: TList;
  1160. FlowContentRec : PContentRec;
  1161. CrossContentRec : PCrossContentRec;
  1162. SumRec : PSumRec;
  1163. begin
  1164. ObjList := TList.Create;
  1165. try
  1166. // 设置表正文
  1167. APrintCom.getAllFlowShowContentObjs(ObjList);
  1168. for i := 0 to ObjList.Count - 1 do
  1169. begin
  1170. FlowContentRec := ObjList[i];
  1171. if not (FlowContentRec.Fixed) then
  1172. begin
  1173. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  1174. APrintCom.setFlowContentObj(FlowContentRec);
  1175. end;
  1176. end;
  1177. APrintCom.getAllBillShowContentObjs(ObjList);
  1178. for i := 0 to ObjList.Count - 1 do
  1179. begin
  1180. FlowContentRec := ObjList[i];
  1181. if not(FlowContentRec.Fixed) then
  1182. begin
  1183. AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);
  1184. APrintCom.setBillContentObj(FlowContentRec);
  1185. end;
  1186. end;
  1187. APrintCom.getAllCrossContentObjs(ObjList);
  1188. for i := 0 to ObjList.Count - 1 do
  1189. begin
  1190. CrossContentRec := ObjList[i];
  1191. if not(CrossContentRec.CrossContent.Fixed) then
  1192. begin
  1193. AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);
  1194. APrintCom.setCrossContentObj(CrossContentRec);
  1195. end;
  1196. end;
  1197. // 设置表合计
  1198. for i := 0 to 2 do
  1199. begin
  1200. APrintCom.getAllSumObjs(i,ObjList);
  1201. for j := 0 to ObjList.Count - 1 do
  1202. begin
  1203. SumRec := ObjList[j];
  1204. AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
  1205. APrintCom.setSumObj(SumRec);
  1206. end;
  1207. end;
  1208. finally
  1209. ObjList.Free;
  1210. end;
  1211. end;
  1212. procedure InitGridHeaderFont;
  1213. var
  1214. i: Integer;
  1215. ObjList: TList;
  1216. HeadTailRec : PHeadRec;
  1217. begin
  1218. ObjList := TList.Create;
  1219. try
  1220. APrintCom.getAllHeadObjs(ObjList);
  1221. for i := 0 to ObjList.Count - 1 do
  1222. begin
  1223. HeadTailRec := ObjList[i];
  1224. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  1225. APrintCom.setHeadTailObj(0, HeadTailRec);
  1226. end;
  1227. APrintCom.getAllTailObjs(ObjList);
  1228. for i := 0 to ObjList.Count - 1 do
  1229. begin
  1230. HeadTailRec := ObjList[i];
  1231. AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
  1232. APrintCom.setHeadTailObj(1, HeadTailRec);
  1233. end;
  1234. finally
  1235. ObjList.Free;
  1236. end;
  1237. end;
  1238. begin
  1239. InitTitleFont;
  1240. InitColumnFont;
  1241. InitContentAndGatherFont;
  1242. InitGridHeaderFont;
  1243. end;
  1244. procedure TReportsForm.PreviewComXMLGetDatasetEvent(
  1245. DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);
  1246. begin
  1247. if DatasetInfo.ID = 0 then
  1248. ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)
  1249. else
  1250. ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);
  1251. end;
  1252. function TReportsForm.GetIsExcel2010: Boolean;
  1253. begin
  1254. Result := chkExcel2010.Checked;
  1255. end;
  1256. procedure TReportsForm.InitFormView;
  1257. begin
  1258. rdbtnA3.Checked := SameText(rdbtnA3.Caption, ReportConfig.PageSize);
  1259. rdbtnA4.Checked := SameText(rdbtnA4.Caption, ReportConfig.PageSize);
  1260. SetPrinterPageSize(ReportConfig.PageSize);
  1261. pnlSearch.Visible := _IsDebugView;
  1262. if G_IsCloud then
  1263. begin
  1264. btnRMgr.Visible := True;
  1265. tbImportSrt.Visible := False;
  1266. end
  1267. else
  1268. begin
  1269. btnRMgr.Visible := False;
  1270. tbImportSrt.Visible := True;
  1271. end;
  1272. end;
  1273. procedure TReportsForm.LoadExcelBorder(var Border: TColumnLineRec);
  1274. begin
  1275. Border.LeftThick := 0.5;
  1276. Border.TopThick := 0.5;
  1277. Border.RightThick := 0.5;
  1278. Border.BottomThick := 0.5;
  1279. if not ReportConfig.RepBorderVerLine then
  1280. begin
  1281. Border.LeftThick := 0;
  1282. Border.RightThick := 0;
  1283. end;
  1284. end;
  1285. procedure TReportsForm.PrintReport(ATemplateNode: TTemplateNode;
  1286. isPDF, isExcel: boolean; ExcelOutputName, TemplateFileName: string);
  1287. function CheckPrinterReady: Boolean;
  1288. var
  1289. PrinterHD: THandle;
  1290. NoJobs: Word;
  1291. s: LongWord;
  1292. Job_Info: Array[0..10] of Job_INFO_1;
  1293. cbNeeded: Cardinal;
  1294. cReturned: Cardinal;
  1295. ret: LongBool;
  1296. begin
  1297. if OpenPrinter(PChar(Printer.Printers[Printer.PrinterIndex]), PrinterHD, 0) then
  1298. begin
  1299. s := SizeOf(Job_Info);
  1300. cbNeeded := 0;
  1301. cReturned := 0;
  1302. NoJobs := 10;
  1303. ret := ENumJobs(PrinterHD, 0, NoJobs, 1, @Job_Info, s, cbNeeded, cReturned);
  1304. Result := not((cReturned > 0) and (Job_Info[0].TotalPages > 0));
  1305. end
  1306. else
  1307. Result := True;
  1308. end;
  1309. procedure PrintTemplet;
  1310. var
  1311. sFileName: string;
  1312. begin
  1313. if isPDF then
  1314. begin
  1315. sFileName := BatchPrintXml.ReportName + '.pdf';
  1316. if SaveFile(sFileName, '.pdf') then
  1317. PdfHelper.ExportAllPages(BatchPrintXml, sFileName);
  1318. (*
  1319. BatchPrintXml.PrintPDFAll(PreviewBox.Canvas);
  1320. while not CheckPrinterReady do
  1321. Sleep(1000);
  1322. *)
  1323. end
  1324. else if not isExcel then
  1325. BatchPrintXml.PrintAll(PreviewBox.Canvas, 1)
  1326. else
  1327. ExportXlsReport(1, BatchPrintXml.TotalPages, ExcelOutputName, BatchPrintXml);
  1328. end;
  1329. var
  1330. strRptName : string;
  1331. begin
  1332. if not FileExists(ATemplateNode.FileName) then Exit;
  1333. ClearReportOprList;
  1334. ClearReportFuncList;
  1335. Screen.Cursor := crHourGlass;
  1336. try
  1337. LoadTemplet(ATemplateNode, BatchPrintXml);
  1338. if BatchPrintXml.TotalPages > 0 then
  1339. PrintTemplet
  1340. {else if strRptName <> '' then
  1341. begin
  1342. LoadTemplet(RptArchiverObj, strRptName);
  1343. PrintEmptyTemplet;
  1344. end;}
  1345. finally
  1346. Screen.Cursor := crDefault;
  1347. end;
  1348. end;
  1349. function TReportsForm.GetSysTempDirectory : String;
  1350. var TempDir : array[0..255] of Char;
  1351. begin
  1352. GetTempPath(255, @TempDir);
  1353. Result := StrPas(TempDir);
  1354. end;
  1355. procedure TReportsForm.ExportXlsReport(AStartPage, AEndPage: Integer;
  1356. const AFileName: string; APrintCom: TPrintComXML);
  1357. procedure ExportPagesXlsReport(AStartPage, AEndPage: Integer; const AFileName: string);
  1358. var
  1359. Border : TColumnLineRec;
  1360. themeFile, tmpPath : string;
  1361. begin
  1362. LoadExcelBorder(Border);
  1363. if IsExcel2010 then
  1364. begin
  1365. (*
  1366. APrintCom.OutputToExcelFileOE(PreviewBox.Canvas, AStartPage, AEndPage, AFileName, ExcelMode, Border, nil)
  1367. (*)
  1368. //用新方法处理
  1369. themeFile := ExtractFilePath(Application.ExeName) + 'Data\theme1.xml';
  1370. tmpPath := GetSysTempDirectory;
  1371. APrintCom.buildOutputData(PreviewBox.Canvas, AStartPage, AEndPage, Border);
  1372. ExcelOutput.outputAsExcel(APrintCom.OutputData, APrintCom.PageSize, (excelMode = oemOneSheet), tmpPath, themeFile, AFileName, nil);
  1373. //*)
  1374. end else
  1375. begin
  1376. //APrintCom.OutputToExcelFile(PreviewBox.Canvas, AStartPage, AEndPage, GetTemplateXlsFileName, AFileName, ExcelMode, Border);
  1377. APrintCom.OutputToExcelFileOE(PreviewBox.Canvas, AStartPage, AEndPage, AFileName, ExcelMode, Border, nil);
  1378. //现2010格式与之前格式应用同一控件导出
  1379. end;
  1380. end;
  1381. var
  1382. iStartPage, iEndPage, iCount: Integer;
  1383. sFileName: string;
  1384. begin
  1385. BeforeExport;
  1386. try
  1387. if (ExcelMode = oemNormal) and (PrintEndPage - PrintStartPage > 30) then
  1388. begin
  1389. iStartPage := PrintStartPage;
  1390. iEndPage := iStartPage + 19;
  1391. iCount := 1;
  1392. repeat
  1393. begin
  1394. if IsExcel2010 then
  1395. sFileName := Format('%s[%d].xlsx', [ExtractSimpleFileName(AFileName), iCount])
  1396. else
  1397. sFileName := Format('%s[%d].xls', [ExtractSimpleFileName(AFileName), iCount]);
  1398. ExportPagesXlsReport(iStartPage, iEndPage, sFileName);
  1399. iStartPage := iStartPage + 20;
  1400. iEndPage := Min(iEndPage + 20, PrintEndPage);
  1401. Inc(iCount);
  1402. end
  1403. until iStartPage > iEndPage;
  1404. end
  1405. else
  1406. ExportPagesXlsReport(AStartPage, AEndPage, AFileName);
  1407. finally
  1408. AfterExport;
  1409. end;
  1410. end;
  1411. procedure TReportsForm.LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
  1412. var
  1413. RptArchiverObj: TReportArchiver;
  1414. Mem: TMemoryStream;
  1415. begin
  1416. RptArchiverObj := TReportArchiver.Create;
  1417. if ATemplate.IsMulti then
  1418. RptArchiverObj.FileName := ATemplate.MultiFileNames[FProjectData.PhaseIndex]
  1419. else
  1420. RptArchiverObj.FileName := ATemplate.FileName;
  1421. Mem := RptArchiverObj.Extract;
  1422. try
  1423. // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
  1424. // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
  1425. // 读取报表模板
  1426. if not APrintCom.ReadReportStream(Mem) then Exit;
  1427. // 将报表设置中的数据覆盖掉原模板的数据
  1428. InitReportSettings(APrintCom, ATemplate);
  1429. // 保存
  1430. APrintCom.SaveToStream(Mem);
  1431. // 再次读取,使报表设置中的设置生效
  1432. APrintCom.ReadReportStream(Mem);
  1433. // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
  1434. APrintCom.FillZero := chkFillZero.Checked;
  1435. InitPageSettings(APrintCom);
  1436. APrintCom.ReadDBData;
  1437. //设置好字体,否则Canvas的默认字体在计算自动行高的时候会出现偏差
  1438. PreviewBox.Canvas.Font.Name := ReportConfig.ContentFont.Name;
  1439. PreviewBox.Canvas.Font.Size := ReportConfig.ContentFont.Size;
  1440. APrintCom.AnalyseData(PreviewBox.Canvas);
  1441. finally
  1442. if Mem <> nil then
  1443. Mem.Free;
  1444. RptArchiverObj.Free;
  1445. end;
  1446. end;
  1447. function TReportsForm.GetHintStr: string;
  1448. begin
  1449. Result := #13#10 +
  1450. '对不起,学习版不提供报表打印、导出功能。'#13#10 +
  1451. #13#10 +
  1452. '以下为收费服务项目,请在必要时联系纵横:'#13#10 +
  1453. #13#10 +
  1454. '企业QQ:800003850 客服热线:(0756)3850888';
  1455. end;
  1456. function TReportsForm.AddClassNode(AParent: TExTreeNode;
  1457. const AName: string): TExTreeNode;
  1458. begin
  1459. Result := extvReport.Items.AddChildObject(AParent, AName, Pointer(nil));
  1460. Result.ImageIndex := 0;
  1461. Result.SelectedIndex := 1;
  1462. Result.Checked := csUnchecked;
  1463. Result.Expanded := True;
  1464. end;
  1465. procedure TReportsForm.SaveReportInteractData(ATemplate: TTemplateNode);
  1466. begin
  1467. case ATemplate.InteractFlag of
  1468. 1: SaveAuditOpinion(ATemplate);
  1469. end;
  1470. end;
  1471. procedure TReportsForm.SaveAuditOpinion(ATemplate: TTemplateNode);
  1472. var
  1473. SelectForm: TAuditSelctForm;
  1474. begin
  1475. SelectForm := TAuditSelctForm.Create(FProjectData, ATemplate);
  1476. try
  1477. if SelectForm.ShowModal = mrOk then
  1478. SelectForm.SaveAuditData;
  1479. finally
  1480. SelectForm.Free;
  1481. end;
  1482. end;
  1483. destructor TReportsForm.Destroy;
  1484. begin
  1485. FReportCon.Free;
  1486. FReportDataPrepare.Free;
  1487. inherited;
  1488. end;
  1489. // 启用报表模板管理器,报表导入功能取消。
  1490. procedure TReportsForm.btnRMgrClick(Sender: TObject);
  1491. var vRMForm: TReportManagerForm;
  1492. begin
  1493. Screen.Cursor := crHourGlass;
  1494. vRMForm := TReportManagerForm.Create(nil);
  1495. vRMForm.ReportsForm := Self;
  1496. try
  1497. vRMForm.ShowModal;
  1498. finally
  1499. vRMForm.Free;
  1500. Screen.Cursor := crDefault;
  1501. end;
  1502. end;
  1503. procedure TReportsForm.RefreshReportTemplets;
  1504. begin
  1505. ReportTemplateManager.RefreshTemplates;
  1506. LoadReportTemplets;
  1507. LoadTempletAndDisplay;
  1508. end;
  1509. procedure TReportsForm.FormActivate(Sender: TObject);
  1510. var vReports: TReports;
  1511. begin
  1512. // 自动检测并提醒用户有新报表要更新
  1513. if G_IsCloud then
  1514. begin
  1515. vReports := TReports.Create(nil);
  1516. try
  1517. if vReports.HasNeedUpdateReport then
  1518. begin
  1519. Application.MessageBox('系统检测到有新的报表可以更新!', '提示', MB_OK + MB_ICONINFORMATION);
  1520. btnRMgr.Click;
  1521. end;
  1522. finally
  1523. vReports.Free;
  1524. end;
  1525. end;
  1526. end;
  1527. procedure TReportsForm.imgSearchClick(Sender: TObject);
  1528. function SearchAfter(const AText: string; vBegin: TExTreeNode): TExTreeNode;
  1529. var
  1530. vNext: TExTreeNode;
  1531. begin
  1532. Result := nil;
  1533. vNext := vBegin.GetNext;
  1534. while Assigned(vNext) and not Assigned(Result) do
  1535. begin
  1536. if (Pos(AText, vNext.Text) > 0) then
  1537. Result := vNext;
  1538. vNext := vNext.GetNext;
  1539. end;
  1540. end;
  1541. function SearchBegin(const AText: string; vEnd: TExTreeNode): TExTreeNode;
  1542. var
  1543. vPre: TExTreeNode;
  1544. begin
  1545. Result := nil;
  1546. vPre := extvReport.Items.GetFirstNode;
  1547. while (vPre <> vEnd) and not Assigned(Result) do
  1548. begin
  1549. if (Pos(AText, vPre.Text) > 0) then
  1550. Result := vPre;
  1551. vPre := vPre.GetNext;
  1552. end;
  1553. end;
  1554. procedure SearchReportTemplate(const AText: string);
  1555. var
  1556. vNode: TExTreeNode;
  1557. begin
  1558. vNode := SearchAfter(AText, extvReport.Selected);
  1559. if not Assigned(vNode) then
  1560. vNode := SearchBegin(AText, extvReport.Selected);
  1561. if Assigned(vNode) then
  1562. begin
  1563. extvReport.Selected := vNode;
  1564. extvReport.OnClick(extvReport);
  1565. end
  1566. else
  1567. WarningMessage(Format('未找到含关键字“%s”的报表,请缩短关键字后查询', [AText]));
  1568. end;
  1569. begin
  1570. SearchReportTemplate(edtSearch.Text);
  1571. end;
  1572. procedure TReportsForm.extvReportKeyDown(Sender: TObject; var Key: Word;
  1573. Shift: TShiftState);
  1574. begin
  1575. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  1576. and (Key in [67, 99]) then // 'c', 'C'
  1577. extvReport.FullCollapse;
  1578. end;
  1579. procedure TReportsForm.ExportReportPage(APage: Integer;
  1580. const APageFileName: string; AOrg: Boolean);
  1581. var
  1582. bmp, bmpCut: TBitmap;
  1583. img: TJPEGImage;
  1584. iCutHeight, iCutWidth, iCutTop, iCutLeft, iCutRight, iCutBottom: Integer;
  1585. begin
  1586. bmp := TBitmap.Create;
  1587. bmpCut := TBitmap.Create;
  1588. img := TJPEGImage.Create;
  1589. try
  1590. bmp.Height := PreviewComXML.ReportSize.Y;
  1591. bmp.Width := PreviewComXML.ReportSize.X;
  1592. PreviewComXML.PrintPreviewCanvas(APage, 0, bmp.Canvas, False);
  1593. iCutHeight := Round(PreviewComXML.ReportSize.Y / 200);
  1594. iCutWidth := Round(PreviewComXML.ReportSize.X / 200);
  1595. bmpCut.Height := PreviewComXML.ReportSize.Y - iCutHeight * 2;
  1596. bmpCut.Width := PreviewComXML.ReportSize.X - iCutWidth * 2;
  1597. bmpCut.Canvas.CopyRect(Rect(0, 0, bmpCut.Width, bmpCut.Height), bmp.Canvas, Rect(iCutWidth, iCutHeight, bmp.Width - iCutWidth, bmp.Height - iCutHeight));
  1598. if not AOrg then
  1599. img.Assign(bmpCut)
  1600. else
  1601. img.Assign(bmp);
  1602. img.CompressionQuality := 100;
  1603. img.Compress;
  1604. img.SaveToFile(APageFileName);
  1605. finally
  1606. bmpCut.Free;
  1607. bmp.Free;
  1608. img.Free;
  1609. end;
  1610. end;
  1611. function TReportsForm.GetSubClassNode(AParent: TExTreeNode;
  1612. AName: string): TExTreeNode;
  1613. function FindNode(AParent: TExTreeNode; const AName: string): TExTreeNode;
  1614. var
  1615. I: Integer;
  1616. vNode: TExTreeNode;
  1617. begin
  1618. Result := nil;
  1619. if Assigned(AParent) then
  1620. vNode := AParent.getFirstChild
  1621. else
  1622. vNode := extvReport.Items.GetFirstNode;
  1623. while not Assigned(Result) and Assigned(vNode) do
  1624. begin
  1625. if SameText(vNode.Text, AName) then
  1626. Result := vNode;
  1627. vNode := vNode.getNextSibling;
  1628. end;
  1629. end;
  1630. begin
  1631. Result := FindNode(AParent, AName);
  1632. if not Assigned(Result) then
  1633. Result := AddClassNode(AParent, AName);
  1634. end;
  1635. end.