| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449 | unit ReportsFrm;interface// 导出PDF须定义该编译指令{$DEFINE cplPrint}// 导出Excel须定义该编译指令{$DEFINE cplOutputToExcelRange}uses  ProjectData, ScFileArchiver, ReportManager, ConditionalDefines,  PrintComTypeDefUnit, ADODB, DB,  AuditSelectFrm,  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, PrintCom, PrintComXML, ExtCtrls, ExTreeView, ImgList,  dxBarExtItems, dxBar, ComCtrls, ToolWin, StdCtrls;type  TReportsForm = class(TForm)    xmReports: TdxBarManager;    xlbPrint: TdxBarLargeButton;    xlbToExcel: TdxBarLargeButton;    xlbToPDF: TdxBarLargeButton;    xlbRealSize: TdxBarLargeButton;    xlbOnePage: TdxBarLargeButton;    xlbTwoPage: TdxBarLargeButton;    xlbFourPage: TdxBarLargeButton;    xcbPages: TdxBarCombo;    xlbFirstPage: TdxBarLargeButton;    xlbPrePage: TdxBarLargeButton;    xlbNextPage: TdxBarLargeButton;    xlbLastPage: TdxBarLargeButton;    xcbStartPage: TdxBarCombo;    xcbEndPage: TdxBarCombo;    xlbSetup: TdxBarLargeButton;    xlbClose: TdxBarLargeButton;    xlbPrintCurPage: TdxBarLargeButton;    dxcciSafePrint: TdxBarControlContainerItem;    ilstLarge: TImageList;    pnlReportsList: TPanel;    extvReport: TExTreeView;    sprReportPreview: TSplitter;    sbReportsPreview: TScrollBox;    PreviewBox: TImage;    PreviewComXML: TPrintComXML;    ilstTree: TImageList;    pnlTopButton: TPanel;    tobaTemplateManager: TToolBar;    tbImportSrt: TToolButton;    tbExportSrt: TToolButton;    tbDeleteSrt: TToolButton;    ilstTemplateContorl: TImageList;    pnlPaperSize: TPanel;    rdbtnA3: TRadioButton;    rdbtnA4: TRadioButton;    chkFillZero: TCheckBox;    dxcciPageSize: TdxBarControlContainerItem;    pnlExcelMode: TPanel;    chkExcelMode: TCheckBox;    chkExcel2010: TCheckBox;    dxcciExcelMode: TdxBarControlContainerItem;    pnlReports: TPanel;    procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);    procedure xlbRealSizeClick(Sender: TObject);    procedure xlbOnePageClick(Sender: TObject);    procedure xlbTwoPageClick(Sender: TObject);    procedure xlbFourPageClick(Sender: TObject);    procedure xlbFirstPageClick(Sender: TObject);    procedure xlbPrePageClick(Sender: TObject);    procedure xlbNextPageClick(Sender: TObject);    procedure xlbLastPageClick(Sender: TObject);    procedure xcbPagesChange(Sender: TObject);    procedure xlbPrintCurPageClick(Sender: TObject);    procedure xcbStartPageChange(Sender: TObject);    procedure xlbPrintClick(Sender: TObject);    procedure xlbToPDFClick(Sender: TObject);    procedure xlbToExcelClick(Sender: TObject);    procedure extvReportClick(Sender: TObject);    procedure xlbCloseClick(Sender: TObject);    procedure tbImportSrtClick(Sender: TObject);    procedure tbDeleteSrtClick(Sender: TObject);    procedure tbExportSrtClick(Sender: TObject);    procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;      dataType: Integer; isReading: Boolean; DrawType: Integer;      isPrinting: Boolean);    procedure xlbSetupClick(Sender: TObject);    procedure PreviewComXMLCrossTabLabelShow(valIDX: Integer; var ExLeft,      ExRight: Double; var isShow: Boolean; CrsTabShowType: Integer);    procedure rdbtnA4Click(Sender: TObject);    procedure chkFillZeroClick(Sender: TObject);    procedure PreviewComXMLGetDatasetEvent(DatasetInfo: PDatasetInfoRec;      var ADataset: TDataSet);  private    FProjectData: TProjectData;    FCurPage: Integer;    FiPageGroup: Integer;    FiCenterPerPage: Integer;    FbNormal : Boolean;    FDisplayCount: Integer;    procedure InitPageSettings;    procedure InitFont;    procedure InitPaperSettings;    function GetHintStr: string;    function AddClassNode(AParent: TExTreeNode; const AName: string): TExTreeNode;    function GetClassNode(ANode: TTemplateNode): TExTreeNode;    function GetSubClassNode(AClassNode: TExTreeNode; ANode: TTemplateNode): TExTreeNode;    procedure AddReportTemplate(ANode: TTemplateNode);    procedure LoadReportTemplets;    procedure SaveAuditOpinion(ATemplate: TTemplateNode);    procedure SaveReportInteractData(ATemplate: TTemplateNode);    procedure ResizePreviewBox;    procedure PreviewReportCurPage;    procedure RepaintCurPagePreview;    procedure LoadTemplet(const ATempletName: string);    procedure LoadTempletAndDisplay;    procedure BeforeExport;    procedure AfterExport;    procedure LoadExcelBorder(var Border : TColumnLineRec);    procedure PrintReport(ATemplateNode: TTemplateNode; isPDF, isExcel: boolean;      ExcelOutputName, TemplateFileName: string);    procedure ExportXlsReport(AStartPage, AEndPage: Integer; const AFileName: string);    procedure ExportCurXlsReport;    procedure ExportAllSelectedXlsReports;    procedure PrintAllSelectedReports;    procedure ExportAllSelectedPDFReports;    procedure SetProjectData(const Value: TProjectData);    procedure SetCurPage(const Value: Integer);    function GetPrintEndPage: Integer;    function GetPrintStartPage: Integer;    function GetPageCount: Integer;    function GetPrecededCount: Integer;    function GetExcelMode: TOutputExcelMode;    function GetIsExcel2010: Boolean;  public    procedure InitFormView;    procedure InitReportSettings;    property ProjectData: TProjectData read FProjectData write SetProjectData;    // 当前预览的页码    property CurPage: Integer read FCurPage write SetCurPage;    // 显示几页    property DisplayCount: Integer read FDisplayCount write FDisplayCount;    // 翻到的页数(例如:当前显示9页,显示4页,则翻到的页数为3)    property PrecededCount: Integer read GetPrecededCount;    property PrintStartPage: Integer read GetPrintStartPage;    property PrintEndPage: Integer read GetPrintEndPage;    property PageCount: Integer read GetPageCount;    property ExcelMode: TOutputExcelMode read GetExcelMode;    property IsExcel2010: Boolean read GetIsExcel2010;  end;  procedure DisplayReportsForm(AProjectData: TProjectData);implementationuses  UtilMethods, Math, DirectPrintUnit, Globals, ZhAPI, ReportAdjustFrm,  Contnrs, mEncryptUnit, Printers;{$R *.dfm}procedure DisplayReportsForm(AProjectData: TProjectData);var  ReportsForm: TReportsForm;begin  ReportsForm := TReportsForm.Create(nil);  ReportsForm.ProjectData := AProjectData;  ReportsForm.InitReportSettings;  ReportsForm.InitFormView;  try    ReportsForm.ShowModal;  finally    ReportsForm.Free;  end;end;{ TReportsForm }procedure TReportsForm.LoadReportTemplets;var  iTemplate: Integer;  TemplateNode: TTemplateNode;  ClassNode: TExTreeNode;begin  extvReport.Items.Clear;  for iTemplate := 0 to ReportTemplateManager.Count - 1 do  begin    TemplateNode := ReportTemplateManager.Template[iTemplate];    AddReportTemplate(TemplateNode);  end;  extvReport.AlphaSort;  // 强制展开全部节点  // 某些情况下,创建节点处的展开方法失效  ClassNode := extvReport.Items.GetFirstNode;  while Assigned(ClassNode) do  begin    ClassNode.ForcedExpand(True);    ClassNode := ClassNode.getNextSibling;  end;  extvReport.Selected := extvReport.Items.GetFirstNode;end;procedure TReportsForm.LoadTempletAndDisplay;  procedure ResetReportsVariant;  var    iPage: Integer;  begin    FbNormal := False;    xcbPages.Items.Clear;    for iPage := 1 to PreviewComXML.TotalPages do      xcbPages.Items.Add(IntToStr(iPage));    xcbStartPage.Items.Assign(xcbPages.Items);    xcbStartPage.ItemIndex := 0;    xcbEndPage.Items.Assign(xcbPages.Items);    xcbEndPage.ItemIndex := xcbEndPage.Items.Count - 1;    xlbRealSize.Down := True;    DisplayCount := 1;    CurPage := 1;  end;  procedure WaringAndEmptyPreview(AStr: string);  var    OldBrushColor, OldPenColor: TColor;  begin    Application.MessageBox(PChar(AStr), '注意', MB_OK or MB_ICONINFORMATION);    OldBrushColor := PreviewBox.Canvas.Brush.Color;    OldPenColor := PreviewBox.Canvas.Pen.Color;    try      PreviewBox.Canvas.Brush.Color := clBtnFace;      PreviewBox.Canvas.Pen.Color := clBlack;      PreviewBox.Canvas.Rectangle(PreviewBox.BoundsRect);    finally      PreviewBox.Canvas.Brush.Color := OldBrushColor;      PreviewBox.Canvas.Pen.Color := OldPenColor;    end;  end;  procedure PreviewTemplet;  begin    try      ResizePreviewBox;      ResetReportsVariant;    except      WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');    end;  end;  procedure LoadEmptyTempletAndDisplay;  begin    WaringAndEmptyPreview('报表无数据,请选择其他报表。');  end;var  vTemplateNode: TTemplateNode;  pNode: PTemplateNode;begin  if not Assigned(extvReport.Selected) then Exit;  vTemplateNode := TTemplateNode(extvReport.Selected.Data);  if not Assigned(vTemplateNode) then Exit;  ReportTemplateManager.Current := vTemplateNode;  // 交互表  if vTemplateNode.InteractFlag <> 0 then    SaveReportInteractData(vTemplateNode);  Screen.Cursor := crHourGlass;  try    if vTemplateNode.IsMulti then      LoadTemplet(vTemplateNode.MultiFileNames[FProjectData.PhaseIndex])    else      LoadTemplet(vTemplateNode.FileName);    if PreviewComXML.TotalPages > 0 then      PreviewTemplet    else      LoadEmptyTempletAndDisplay;  finally    Screen.Cursor := crDefault;  end;end;procedure TReportsForm.SetProjectData(const Value: TProjectData);begin  FProjectData := Value;  extvReport.Selected := extvReport.Items[0];  LoadReportTemplets;  LoadTempletAndDisplay;end;procedure TReportsForm.PreviewComXMLGetDataConnection(  var ADOCon: TADOConnection);begin  ADOCon := FProjectData.ADOConnection;end;procedure TReportsForm.PreviewReportCurPage;begin  if FbNormal then    PreviewComXML.PrintPreviewCanvas(-1, PrecededCount, PreviewBox.Canvas)  else //强制1:1显示    PreviewComXML.PrintPreviewCanvas(CurPage, 0, PreviewBox.Canvas);end;procedure TReportsForm.ResizePreviewBox;var  iHeight, iWidth: Integer;begin  if FbNormal then  begin    iHeight := sbReportsPreview.ClientHeight;    iWidth := sbReportsPreview.ClientWidth;  end  else  begin    iHeight := Max(PreviewComXML.PrintHeight + 20, sbReportsPreview.ClientHeight);    iWidth := Max(PreviewComXML.PrintWidth + 20, sbReportsPreview.ClientWidth);  end;  if PreviewBox.Height <> iHeight then  begin    PreviewBox.Height := iHeight;    PreviewBox.Picture.Bitmap.Height := iHeight;  end;  if PreviewBox.Width <> iWidth then  begin    PreviewBox.Width := iWidth;    PreviewBox.Picture.Bitmap.Width := iWidth;  end;end;procedure TReportsForm.RepaintCurPagePreview;begin  ResizePreviewBox;  PreviewReportCurPage;end;procedure TReportsForm.xlbRealSizeClick(Sender: TObject);begin  FbNormal := False;  DisplayCount := TdxBarLargeButton(Sender).Tag;  RepaintCurPagePreview;end;procedure TReportsForm.xlbOnePageClick(Sender: TObject);begin  PreviewComXML.PreviewRows := 1;  PreviewComXML.PreviewCols := 1;  DisplayCount := TdxBarLargeButton(Sender).Tag;  FbNormal := True;  RepaintCurPagePreview;end;procedure TReportsForm.xlbTwoPageClick(Sender: TObject);begin  if PreviewComXML.ReportSize.X > PreviewComXML.ReportSize.Y then  begin    PreviewComXML.PreviewRows := 2;    PreviewComXML.PreviewCols := 1;  end  else  begin    PreviewComXML.PreviewRows := 1;    PreviewComXML.PreviewCols := 2;  end;  DisplayCount := TdxBarLargeButton(Sender).Tag;  FbNormal := true;  RepaintCurPagePreview;end;procedure TReportsForm.xlbFourPageClick(Sender: TObject);begin  PreviewComXML.PreviewRows := 2;  PreviewComXML.PreviewCols := 2;  DisplayCount := TdxBarLargeButton(Sender).Tag;  FbNormal := true;  RepaintCurPagePreview;end;procedure TReportsForm.xlbFirstPageClick(Sender: TObject);begin  CurPage := 1;end;procedure TReportsForm.SetCurPage(const Value: Integer);begin  if (Value < 0) or (Value > PageCount) then Exit;  FCurPage := Value;  xcbPages.Text := IntToStr(FCurPage);  //PreviewComXML.FillZero := chkFillZero.Checked;  PreviewReportCurPage;end;function TReportsForm.GetPrintEndPage: Integer;begin  Result := StrToIntDef(xcbEndPage.Text, 0);end;function TReportsForm.GetPrintStartPage: Integer;begin  Result := StrToIntDef(xcbStartPage.Text, 0);end;function TReportsForm.GetPageCount: Integer;begin  Result := PreviewComXML.TotalPages;end;function TReportsForm.GetPrecededCount: Integer;begin  Result := (CurPage + (DisplayCount - 1)) div DisplayCount;end;procedure TReportsForm.xlbPrePageClick(Sender: TObject);begin  if CurPage > 1 then    CurPage := CurPage - 1;end;procedure TReportsForm.xlbNextPageClick(Sender: TObject);begin  if CurPage < PageCount then    CurPage := CurPage + 1;end;procedure TReportsForm.xlbLastPageClick(Sender: TObject);begin  CurPage := PageCount;end;procedure TReportsForm.xcbPagesChange(Sender: TObject);begin  if (StrToIntDef(xcbPages.Text, 0) > 0) and      (StrToIntDef(xcbPages.Text, 0) <= PageCount) then    CurPage := StrToIntDef(xcbPages.Text, 0)  else    xcbPages.Text := IntToStr(CurPage);end;procedure TReportsForm.xlbPrintCurPageClick(Sender: TObject);begin  if _IsEncrypt then    PreviewComXML.Print(CurPage, 1)  else    TipMessage(GetHintStr);end;procedure TReportsForm.xcbStartPageChange(Sender: TObject);begin  if (StrToIntDef(TdxBarCombo(Sender).Text, 0) > 0) and      (StrToIntDef(TdxBarCombo(Sender).Text, 0) <= PageCount) then    TdxBarCombo(Sender).Tag := StrToIntDef(TdxBarCombo(Sender).Text, 0)  else    TdxBarCombo(Sender).Text := IntToStr(TdxBarCombo(Sender).Tag);end;procedure TReportsForm.xlbPrintClick(Sender: TObject);begin  if _IsEncrypt then  begin    if extvReport.LeafCheckedCount > 0 then      PrintAllSelectedReports    else      PreviewComXML.PrintMultiPages(PrintStartPage, PrintEndPage);  end  else    TipMessage(GetHintStr);end;procedure TReportsForm.PrintAllSelectedReports;var  iIndex: Integer;  Node: TExTreeNode;  vTemplateNode: TTemplateNode;begin  for iIndex := 0 to extvReport.Items.Count - 1 do  begin    Node := extvReport.Items[iIndex];    if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;    vTemplateNode := TTemplateNode(Node.Data);    if FileExists(vTemplateNode.FileName) then      directPrintReport(PreviewBox.Canvas, vTemplateNode.FileName,          PreviewComXML, False, False, oemNormal,'','', IsExcel2010);  end;  extvReport.ClearChecked;end;procedure TReportsForm.xlbToPDFClick(Sender: TObject);begin  if _IsEncrypt then  begin    if extvReport.LeafCheckedCount > 0 then      ExportAllSelectedPDFReports    else      PreviewComXML.PrintPDF(PrintStartPage, PrintEndPage);  end  else    TipMessage(GetHintStr);end;procedure TReportsForm.ExportAllSelectedPDFReports;var  iIndex: Integer;  Node: TExTreeNode;  vTemplateNode: TTemplateNode;begin  for iIndex := 0 to extvReport.Items.Count - 1 do  begin    Node := extvReport.Items[iIndex];    if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;    vTemplateNode := TTemplateNode(Node.Data);    if FileExists(vTemplateNode.FileName) then      PrintReport(vTemplateNode, True, False,'','');  end;  extvReport.ClearChecked;end;procedure TReportsForm.xlbToExcelClick(Sender: TObject);begin  if _IsEncrypt then  begin    if extvReport.LeafCheckedCount > 0 then      ExportAllSelectedXlsReports    else      ExportCurXlsReport;  end  else    TipMessage(GetHintStr);end;procedure TReportsForm.ExportAllSelectedXlsReports;var  iIndex: Integer;  Node: TExTreeNode;  vTemplateNode: TTemplateNode;  sPath, sOutputFileName: String;begin  if BrowseFolder(sPath, '请选择导出报表路径', Handle) then  begin    for iIndex := 0 to extvReport.Items.Count - 1 do    begin      Node := extvReport.Items[iIndex];      if Node.HasChildren or (Node.Checked <> csChecked) or (Node.Data = nil) then Continue;      vTemplateNode := TTemplateNode(Node.Data);      sOutputFileName := sPath + ExtractSimpleFileName(vTemplateNode.FileName) + '.xls';      if FileExists(vTemplateNode.FileName) then        PrintReport(vTemplateNode, False, True, sOutputFileName, GetTemplateXlsFileName);    end;    extvReport.ClearChecked;  end;end;procedure TReportsForm.ExportCurXlsReport;var  sFileName: string;begin  sFileName := extvReport.Selected.Text;  if (PrintStartPage <= PrintEndPage) and SaveFile(sFileName, '.xls') then    ExportXlsReport(PrintStartPage, PrintEndPage, sFileName);end;procedure TReportsForm.AfterExport;begin  // ToDo - 关闭进度条  // ToDo - 取消设置Update进度条事件  // PreviewComXML.OnProgress := nil;  Screen.Cursor := crDefault;end;procedure TReportsForm.BeforeExport;begin  Screen.Cursor := crHourGlass;  // ToDo - 设置Update进度条事件  // PreviewComXML.OnProgress := PreviewComXMLProgress;  // ToDo - 打开进度条end;function TReportsForm.GetExcelMode: TOutputExcelMode;begin  if chkExcelMode.Checked then    Result := oemOneSheet  else    Result := oemNormal;end;procedure TReportsForm.extvReportClick(Sender: TObject);begin  LoadTempletAndDisplay;end;procedure TReportsForm.xlbCloseClick(Sender: TObject);begin  Close;end;procedure TReportsForm.AddReportTemplate(ANode: TTemplateNode);var  vClassNode, vNode: TExTreeNode;begin  vClassNode := GetClassNode(ANode);  if ANode.SubClassNum <> '' then    vClassNode := GetSubClassNode(vClassNode, ANode);  vNode := extvReport.Items.AddChildObject(vClassNode, ANode.TemplateName, Pointer(ANode));  vNode.ImageIndex := 2;  vNode.SelectedIndex := 3;  vNode.Checked := csUnchecked;  if (vClassNode <> nil) and not vClassNode.Expanded then    vClassNode.Expanded := True;end;function TReportsForm.GetClassNode(ANode: TTemplateNode): TExTreeNode;  function FindClassNode(const AName: string): TExTreeNode;  var    I: Integer;    vNode: TExTreeNode;  begin    Result := nil;    for I := 0 to extvReport.Items.Count - 1 do    begin      vNode := extvReport.Items.Item[I];      if SameText(vNode.Text, AName) then      begin        Result := vNode;        Break;      end;    end;  end;begin  Result := FindClassNode(ANode.ClassNum + '.' + ANode.ClassName);  if not Assigned(Result) then    Result := AddClassNode(nil, ANode.ClassNum + '.' + ANode.ClassName);end;procedure TReportsForm.tbImportSrtClick(Sender: TObject);var  sFileName, sNewFileName: string;  vTemplateNode: TTemplateNode;begin  if SelectFile(sFileName, '.srt') then  begin    sNewFileName := GetReportTemplatePath + ExtractFileName(sFileName);    if not FileExists(sNewFileName) then    begin      CopyFile(PChar(sFileName), PChar(sNewFileName), True);      vTemplateNode := ReportTemplateManager.AddReportTemplate(sNewFileName);      AddReportTemplate(vTemplateNode);    end    else      if QuestMessage('已存在报表模板' + ExtractFileName(sFileName) + ',是否覆盖原模板?') then        CopyFile(PChar(sFileName), PChar(sNewFileName), False)      else        Exit;  end;end;procedure TReportsForm.tbDeleteSrtClick(Sender: TObject);var  vTemplateNode: TTemplateNode;begin  if not Assigned(extvReport.Selected) then Exit;  vTemplateNode := TTemplateNode(extvReport.Selected.Data);  if not Assigned(vTemplateNode) then Exit;  extvReport.Items.Delete(extvReport.Selected);  DeleteFile(vTemplateNode.FileName);  ReportTemplateManager.DeleteReportTemplate(vTemplateNode);  LoadTempletAndDisplay;end;procedure TReportsForm.tbExportSrtClick(Sender: TObject);var  vTemplateNode: TTemplateNode;  sFileName: string;begin  if not Assigned(extvReport.Selected) then Exit;  vTemplateNode := TTemplateNode(extvReport.Selected.Data);  if not Assigned(vTemplateNode) then Exit;  sFileName := vTemplateNode.TemplateName;  if SaveFile(sFileName, '.srt') then  begin    if not FileExists(sFileName) or QuestMessage('存在同名文件,是否覆盖?') then      CopyFile(PChar(vTemplateNode.FileName), PChar(sFileName), False);  end;end;procedure TReportsForm.PreviewComXMLContentDisplay(  var contentFontRec: TFontRec; dataType: Integer; isReading: Boolean;  DrawType: Integer; isPrinting: Boolean);begin  if ReportConfig.ContentIsNarrow then  begin    if (isReading) then    begin      begin        contentFontRec.FontName := 'Arial Narrow';        contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;      end;    end else    begin      if (DrawType = 3) or (DrawType = 5) then      begin        contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3);      end else if (isPrinting) then      begin        contentFontRec.FontName := 'Arial Narrow';        contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 7 div 6;      end else      begin        contentFontRec.FontHeight := Round(ReportConfig.ContentFont.Size*4/3) * 4 div 3;      end;    end;  end;end;procedure TReportsForm.xlbSetupClick(Sender: TObject);begin  if AdjustReport then    LoadTempletAndDisplay;end;procedure TReportsForm.InitReportSettings;begin  PreviewComXML.FillZero := chkFillZero.Checked;  InitPageSettings;  InitPaperSettings;end;procedure TReportsForm.InitPageSettings;begin  // 设置页面大小  PreviewComXML.setPageSize(ReportConfig.PageSize);  // 设置边距  PreviewComXML.setEdge(0, '', ReportConfig.LeftEdge/10);  PreviewComXML.setEdge(1, '', ReportConfig.RightEdge/10);  PreviewComXML.setEdge(2, '', ReportConfig.UpEdge/10);  PreviewComXML.setEdge(3, '', ReportConfig.DownEdge/10);end;procedure TReportsForm.InitPaperSettings;  procedure InitRepBorderLine;  var    i: Integer;    ObjList : TList;    ShapeRec : PPicRec;  begin    ObjList := TList.Create;    try      PreviewComXML.getAllShapeObjs(1, ObjList);      for i := 0 to ObjList.Count - 1 do      begin        ShapeRec := ObjList[i];        // 设置报表边框线粗        ShapeRec.PenWidth := ReportConfig.BorderLine;        // 设置是否绘制报表边框横线        if (ShapeRec.ExArea.ExLeft <> ShapeRec.ExArea.ExRight) then        begin          if not ReportConfig.RepBorderUnderLine then            ShapeRec.PenStyle := integer(psClear)          else            ShapeRec.PenStyle := integer(psSolid);        end;        // 设置是否绘制报表边框竖线        if (ShapeRec.ExArea.ExTop <> ShapeRec.ExArea.ExBottom) and           ((ShapeRec.ExArea.ExLeft = 0) or (ShapeRec.ExArea.ExLeft = 100)) then        begin //这里的判断条件是约定好的          if not ReportConfig.RepBorderVerLine then             ShapeRec.PenStyle := integer(psClear)          else             ShapeRec.PenStyle := integer(psSolid)        end;        PreviewComXML.setShapeObj(ShapeRec);      end;    finally      ObjList.Free;    end;  end;  procedure InitRepCellLine;  var    i: Integer;    ObjList : TList;    ColumnRec : PColumnRec;    FlowContentRec : PContentRec;    CrossContentRec : PCrossContentRec;  begin    ObjList := TList.Create;    try      PreviewComXML.getAllFlowShowContentObjs(ObjList);      // 设置报表表格横线      for i := 0 to ObjList.Count - 1 do      begin        FlowContentRec := ObjList[i];        FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;        FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;        PreviewComXML.setFlowContentObj(FlowContentRec);      end;      PreviewComXML.getAllCrossContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        CrossContentRec := ObjList[i];        CrossContentRec.CrossContent.LineInfo.TopThick := ReportConfig.CellHorLineWidth;        CrossContentRec.CrossContent.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;        PreviewComXML.setCrossContentObj(CrossContentRec);      end;      // 设置报表表格竖线      PreviewComXML.getAllFlowShowContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        FlowContentRec := ObjList[i];        FlowContentRec.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;        FlowContentRec.LineInfo.RightThick := ReportConfig.CellVerLineWidth;        // 如果设置无表格边框线,则两端的表格竖线线粗为0        if (not ReportConfig.RepBorderVerLine) then          if (i = 0) then            FlowContentRec.LineInfo.LeftThick := 0          else if (i = ObjList.Count - 1) then            FlowContentRec.LineInfo.RightThick := 0;        PreviewComXML.setFlowContentObj(FlowContentRec);      end;      PreviewComXML.getAllCrossContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        CrossContentRec := ObjList[i];        CrossContentRec.CrossContent.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;        CrossContentRec.CrossContent.LineInfo.RightThick := ReportConfig.CellVerLineWidth;        ColumnRec := CrossContentRec.CrossContent.Column;        //这里还要判断如果没有边框竖线的情况下,表格竖线边缘的线粗也为0        //前提是所属表栏最右位置位于边缘        if (not ReportConfig.RepBorderVerLine) and (ColumnRec<>nil) and            ((ColumnRec.ExArea.ExRight = 100.0) or (ColumnRec.ExArea.ExLeft = 0.0)) then        begin          case CrossContentRec.CrossType of            0 : //交叉行            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;            end;            1 : //交叉列            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;              //(*              if (CrossContentRec.CrossContent.isSpecialBorder) then              begin                if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                    CrossContentRec.CrossContent.SpecialLineInfo.RightThick := 0;              end;              //*)            end;            2 : //显示数据            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;            end;            3 : //固定LABEL            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;            end;            4 : //序号            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;            end;            5 : //横向统计            begin              if (CrossContentRec.CrossContent.ExArea.ExLeft = ColumnRec.ExArea.ExLeft ) then                  CrossContentRec.CrossContent.LineInfo.LeftThick := 0;              if (CrossContentRec.CrossContent.ExArea.ExRight = ColumnRec.ExArea.ExRight ) then                  CrossContentRec.CrossContent.LineInfo.RightThick := 0;            end;          end;        end;        PreviewComXML.setCrossContentObj(CrossContentRec);      end;    finally      ObjList.Free;    end;  end;  procedure InitOtherArea;    procedure SetPTRBorder(PTR : PTextRec);      procedure SetLeftRightBorder;      begin        if PTR.ExArea.ExLeft = 0.0 then        begin          if BorderWidth = 0.0 then            PTR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth;        end;        if PTR.ExArea.ExRight = 100.0 then        begin          if BorderWidth = 0.0 then            PTR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth        end;      end;      procedure SetHorLine;      begin        if (PTR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then          PTR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;        if (PTR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then          PTR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;      end;    begin      SetLeftRightBorder;      SetHorLine;    end;    procedure SetPCRBorder(PCR : PColumnRec);      procedure SetLeftRightBorder;      begin        if PCR.ExArea.ExLeft = 0.0 then        begin          if BorderWidth = 0.0 then            PCR.LineInfo.LeftThick := ReportConfig.BorderUnderLineWidth        end;        if PCR.ExArea.ExRight = 100.0 then        begin          if BorderWidth = 0.0 then            PCR.LineInfo.RightThick := ReportConfig.BorderUnderLineWidth;        end;      end;      procedure SetVerLine;      begin        if PCR.ExArea.ExLeft = 0.0 then           PCR.LineInfo.LeftThick := ReportConfig.CellVerLineWidth;        if PCR.ExArea.ExRight = 100.0 then           PCR.LineInfo.RightThick := ReportConfig.CellVerLineWidth;      end;      procedure SetHorLine;      begin        if (PCR.LineInfo.TopThick >= 0.2) and (BorderWidth <= 0.2) then          PCR.LineInfo.TopThick := ReportConfig.CellHorLineWidth;        if (PCR.LineInfo.BottomThick >= 0.2) and (BorderWidth <= 0.2) then          PCR.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;      end;    begin      SetLeftRightBorder;      SetVerLine;      SetHorLine;    end;  var i,k : integer;      ObjList : TList;      ActAreaRec : PActiveAreaRec;      PSR : PShowElementRec;  begin    ObjList := TList.Create;    try      ActAreaRec := nil;      PreviewComXML.getAllActAreaObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        ActAreaRec := ObjList[i];        if (ActAreaRec.ShowType < 0) or (ActAreaRec.ShowType > 2) then Continue;        if not Assigned(ActAreaRec.ElementList) then Continue;        for k := 0 to ActAreaRec.ElementList.Count - 1 do        begin          PSR := PShowElementRec(ActAreaRec.ElementList[k]);          case PSR.ElementType of            0..2 : SetPTRBorder(PSR.Data); //文本,参数,字段,表栏            7 : SetPCRBorder(PSR.Data) //Column          end;          PreviewComXML.setActShowElementObj(PSR);        end;      end;    finally      ObjList.Free;    end;  end;begin  InitFont;           // 各类字体  InitRepBorderLine;  // 报表边框  InitRepCellLine;    // 报表表格  InitOtherArea;      // 活动区域end;procedure TReportsForm.PreviewComXMLCrossTabLabelShow(valIDX: Integer;  var ExLeft, ExRight: Double; var isShow: Boolean;  CrsTabShowType: Integer);var field : PFieldRec;begin  if (CrsTabShowType = -1) then exit;  field := PreviewComXML.getFieldByID(6);  if (field <> nil) then  begin    if (field.DataLen > valIDX) and (valIDX >= 0) then    begin      if (field.Value[valIDX] = 1.5) then      begin        case CrsTabShowType of          1 : begin                isShow := false;              end;          2 : begin                ExLeft := 0;                ExRight := 100;              end;          3 : begin                //              end          else              begin                //              end;        end;      end;    end;  end;end;procedure TReportsForm.rdbtnA4Click(Sender: TObject);begin  ReportConfig.PageSize := TRadioButton(Sender).Caption;  SetPrinterPageSize(ReportConfig.PageSize);  LoadTempletAndDisplay;end;procedure TReportsForm.chkFillZeroClick(Sender: TObject);begin  PreviewComXML.FillZero := chkFillZero.Checked;  PreviewReportCurPage;end;procedure TReportsForm.InitFont;  procedure AssignFontRec(AFontRec: TFontRec; AFont: TFont);  begin    AFontRec.FontName := AFont.Name;    AFontRec.FontHeight := Round(AFont.Size*4/3) ;    AFontRec.FontBold := 400 + Integer(fsBold in AFont.Style)*200;    AFontRec.FontItalic := Integer(fsItalic in AFont.Style);    AFontRec.FontUnderLine := Integer(fsUnderLine in AFont.Style);  end;  procedure InitTitleFont;  var    TitleRec : PTitleRec;  begin    TitleRec := PreviewComXML.getTitleByID(1);    if TitleRec <> nil then    begin      AssignFontRec(TitleRec.FontRec, ReportConfig.TitleFont);      PreviewComXML.setTitleObj(TitleRec);    end;  end;  procedure InitColumnFont;    procedure InitColumnThick(AColumnRec: PColumnRec);    begin      if (ReportConfig.ReportCellLine > 0.2) then      begin        if (AColumnRec.LineInfo.LeftThick > 0.2) then            AColumnRec.LineInfo.LeftThick := ReportConfig.ReportCellLine;        if (AColumnRec.LineInfo.RightThick > 0.2) then            AColumnRec.LineInfo.RightThick := ReportConfig.ReportCellLine;        if (AColumnRec.LineInfo.TopThick > 0.2) then            AColumnRec.LineInfo.TopThick := ReportConfig.ReportCellLine;        if (AColumnRec.LineInfo.BottomThick > 0.2) then            AColumnRec.LineInfo.BottomThick := ReportConfig.ReportCellLine;      end;    end;  var    i, j: Integer;    ObjList: TList;    ColumnRec : PColumnRec;    AAR : PActiveAreaRec;    SER : PShowElementRec;  begin    ObjList := TList.Create;    try      PreviewComXML.getAllColumnHeadObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        ColumnRec := ObjList[i];        AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);        InitColumnThick(ColumnRec);        PreviewComXML.setColumnHeadTailObj(0, ColumnRec);      end;      PreviewComXML.getAllColumnTailObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        ColumnRec := ObjList[i];        AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);        InitColumnThick(ColumnRec);        PreviewComXML.setColumnHeadTailObj(1,ColumnRec);      end;      PreviewComXML.getAllActAreaObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        AAR := ObjList[i];        for j := 0 to AAR.ElementList.Count - 1 do        begin          SER := AAR.ElementList[j];          if (SER.ElementType = 7) then          begin            ColumnRec := SER.Data;            AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);            InitColumnThick(ColumnRec);            PreviewComXML.setActShowElementObj(SER);          end;        end;      end;    finally      ObjList.Free;    end;  end;  procedure InitContentAndGatherFont;  var    i, j: Integer;    ObjList: TList;    FlowContentRec : PContentRec;    CrossContentRec : PCrossContentRec;    SumRec : PSumRec;  begin    ObjList := TList.Create;    try      // 设置表正文      PreviewComXML.getAllFlowShowContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        FlowContentRec := ObjList[i];        if not (FlowContentRec.Fixed) then        begin          AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);          PreviewComXML.setFlowContentObj(FlowContentRec);        end;      end;      PreviewComXML.getAllBillShowContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        FlowContentRec := ObjList[i];        if not(FlowContentRec.Fixed) then        begin          AssignFontRec(FlowContentRec.FontRec, ReportConfig.ContentFont);          PreviewComXML.setBillContentObj(FlowContentRec);        end;      end;      PreviewComXML.getAllCrossContentObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        CrossContentRec := ObjList[i];        if not(CrossContentRec.CrossContent.Fixed) then        begin          AssignFontRec(CrossContentRec.CrossContent.FontRec, ReportConfig.ContentFont);          PreviewComXML.setCrossContentObj(CrossContentRec);        end;      end;      // 设置表合计      for i := 0 to 2 do      begin        PreviewComXML.getAllSumObjs(i,ObjList);        for j := 0 to ObjList.Count - 1 do        begin          SumRec := ObjList[j];          AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);          PreviewComXML.setSumObj(SumRec);        end;      end;    finally      ObjList.Free;    end;  end;  procedure InitGridHeaderFont;  var    i: Integer;    ObjList: TList;    HeadTailRec : PHeadRec;  begin    ObjList := TList.Create;    try      PreviewComXML.getAllHeadObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        HeadTailRec := ObjList[i];        AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);        PreviewComXML.setHeadTailObj(0, HeadTailRec);      end;      PreviewComXML.getAllTailObjs(ObjList);      for i := 0 to ObjList.Count - 1 do      begin        HeadTailRec := ObjList[i];        AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);        PreviewComXML.setHeadTailObj(1, HeadTailRec);      end;    finally      ObjList.Free;    end;  end;begin  InitTitleFont;  InitColumnFont;  InitContentAndGatherFont;  InitGridHeaderFont;end;procedure TReportsForm.PreviewComXMLGetDatasetEvent(  DatasetInfo: PDatasetInfoRec; var ADataset: TDataSet);begin  if DatasetInfo.ID = 0 then    ADataSet := MemoryReportManager.GetSqlResultDataSet(ReportTemplateManager.Current.InteractInfo.Sql, FProjectData)  else    ADataset := MemoryReportManager.GetMemoryDataSet(DatasetInfo.ID, FProjectData);end;function TReportsForm.GetIsExcel2010: Boolean;begin  Result := chkExcel2010.Checked;end;procedure TReportsForm.InitFormView;begin  rdbtnA3.Checked := SameText(rdbtnA3.Caption, ReportConfig.PageSize);  rdbtnA4.Checked := SameText(rdbtnA4.Caption, ReportConfig.PageSize);  SetPrinterPageSize(ReportConfig.PageSize);end;procedure TReportsForm.LoadExcelBorder(var Border: TColumnLineRec);begin  Border.LeftThick := 0.5;  Border.TopThick := 0.5;  Border.RightThick := 0.5;  Border.BottomThick := 0.5;  if not ReportConfig.RepBorderVerLine then  begin    Border.LeftThick := 0;    Border.RightThick := 0;  end;end;procedure TReportsForm.PrintReport(ATemplateNode: TTemplateNode;  isPDF, isExcel: boolean; ExcelOutputName, TemplateFileName: string);  procedure PrintTemplet;  begin    if isPDF then      PreviewComXML.PrintPDFAll    else if not isExcel then      PreviewComXML.PrintAll(1)    else      ExportXlsReport(1, PreviewComXML.TotalPages, ExcelOutputName);  end;var  strRptName : string;begin  if not FileExists(ATemplateNode.FileName) then Exit;  ClearReportOprList;  ClearReportFuncList;  Screen.Cursor := crHourGlass;  try    if ATemplateNode.IsMulti then      LoadTemplet(ATemplateNode.MultiFileNames[FProjectData.PhaseIndex])    else      LoadTemplet(ATemplateNode.FileName);    if PreviewComXML.TotalPages > 0 then      PrintTemplet    {else if strRptName <> '' then    begin      LoadTemplet(RptArchiverObj, strRptName);      PrintEmptyTemplet;    end;}  finally    Screen.Cursor := crDefault;  end;end;procedure TReportsForm.ExportXlsReport(AStartPage, AEndPage: Integer;  const AFileName: string);  procedure ExportPagesXlsReport(AStartPage, AEndPage: Integer; const AFileName: string);  var    Border : TColumnLineRec;  begin    LoadExcelBorder(Border);    if IsExcel2010 then      // 康博士代码中写批量打印是,用Printer.Canvas,打印当前时,用PreviewBox.Canvas。不懂为什么      PreViewComXML.OutputToExcelRangeXMLEx(PreviewBox.Canvas, AStartPage,          AEndPage, GetTemplateXlsFileName, AFileName, Border, ExcelMode)    else      PreViewComXML.OutputToExcelFile(PreviewBox.Canvas, AStartPage,          AEndPage, GetTemplateXlsFileName, AFileName, ExcelMode, Border);  end;var  iStartPage, iEndPage, iCount: Integer;  sFileName: string;begin  BeforeExport;  try    if (ExcelMode = oemNormal) and (PrintEndPage - PrintStartPage > 30) then    begin      iStartPage := PrintStartPage;      iEndPage := iStartPage + 19;      iCount := 1;      repeat      begin        sFileName := Format('%s[%d].xls', [ExtractSimpleFileName(AFileName), iCount]);        ExportPagesXlsReport(iStartPage, iEndPage, sFileName);        iStartPage := iStartPage + 20;        iEndPage := Min(iEndPage + 20, PrintEndPage);        Inc(iCount);      end      until iStartPage > iEndPage;    end    else      ExportPagesXlsReport(PrintStartPage, PrintEndPage, AFileName);  finally    AfterExport;  end;end;procedure TReportsForm.LoadTemplet(const ATempletName: string);var  RptArchiverObj: TReportArchiver;  Mem: TMemoryStream;begin  RptArchiverObj := TReportArchiver.Create;  RptArchiverObj.FileName := ATempletName;  Mem := RptArchiverObj.Extract;  try    // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式    // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效    // 读取报表模板    if not PreviewComXML.ReadReportStream(Mem) then Exit;    // 将报表设置中的数据覆盖掉原模板的数据    InitReportSettings;    // 保存    PreviewComXML.SaveToStream(Mem);    // 再次读取,使报表设置中的设置生效    PreviewComXML.ReadReportStream(Mem);    // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次    PreviewComXML.FillZero := chkFillZero.Checked;    PreviewComXML.ReadDBData;    PreviewComXML.AnalyseData;  finally    if Mem <> nil then      Mem.Free;    RptArchiverObj.Free;  end;end;function TReportsForm.GetHintStr: string;begin  Result := #13#10 +            '对不起,学习版不提供报表打印、导出功能。'#13#10 +            #13#10 +            '以下为收费服务项目,请在必要时联系纵横:'#13#10 +            #13#10 +            '企业QQ:800003850   客服热线:(0756)3850888';end;function TReportsForm.GetSubClassNode(AClassNode: TExTreeNode;  ANode: TTemplateNode): TExTreeNode;  function FindNode(AParent: TExTreeNode; const AName: string): TExTreeNode;  var    I: Integer;    vNode: TExTreeNode;  begin    Result := nil;    if Assigned(AParent) then      vNode := AParent.getFirstChild    else      vNode := extvReport.Items.GetFirstNode;    while not Assigned(Result) and Assigned(vNode) do    begin      if SameText(vNode.Text, AName) then        Result := vNode;      vNode := vNode.getNextSibling;    end;  end;begin  Result := FindNode(AClassNode, ANode.SubClassNum + '.' + ANode.SubClassName);  if not Assigned(Result) then    Result := AddClassNode(AClassNode, ANode.SubClassNum + '.' + ANode.SubClassName);end;function TReportsForm.AddClassNode(AParent: TExTreeNode;  const AName: string): TExTreeNode;begin  Result := extvReport.Items.AddChildObject(AParent, AName, Pointer(nil));  Result.ImageIndex := 0;  Result.SelectedIndex := 1;  Result.Checked := csUnchecked;  Result.Expanded := True;end;procedure TReportsForm.SaveReportInteractData(ATemplate: TTemplateNode);begin  case ATemplate.InteractFlag of    1: SaveAuditOpinion(ATemplate);  end;end;procedure TReportsForm.SaveAuditOpinion(ATemplate: TTemplateNode);var  SelectForm: TAuditSelctForm;begin  SelectForm := TAuditSelctForm.Create(FProjectData, ATemplate);  try    if SelectForm.ShowModal = mrOk then      SelectForm.SaveAuditData;  finally    SelectForm.Free;  end;end;end.
 |