123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059 |
- unit SignOnlineReportsFrm;
- interface
- uses
- ProjectData, ReportManager, ReportConnection, ReportPrepare,
- PrintComTypeDefUnit, ADODB, DB,
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, sdIDTree, sdDB, ComCtrls, ExtCtrls, VirtualTrees, PrintCom,
- PrintComXML, MScrollBox, StdCtrls, Buttons, PNGButton;
- const
- crNext = -25;
- crPrevious = -26;
- offset = 150;
- type
- TSignOnlineReportsForm = class(TForm)
- tvReports: TTreeView;
- pnlBottom: TPanel;
- PreviewComXML: TPrintComXML;
- previewBox: TImage;
- msbReportsPreview: TMScrollBox;
- lblAlreadyUpload: TLabel;
- cbFillZero: TCheckBox;
- pnlPageControl: TPanel;
- btnPre: TButton;
- btnNext: TButton;
- lblPages: TLabel;
- pbGenerate: TPNGButton;
- procedure FormShow(Sender: TObject);
- procedure tvReportsClick(Sender: TObject);
- procedure PreviewComXMLContentDisplay(var contentFontRec: TFontRec;
- dataType: Integer; isReading: Boolean; DrawType: Integer;
- isPrinting: Boolean);
- procedure PreviewComXMLCrossTabLabelShow(valIDX: Integer; var ExLeft,
- ExRight: Double; var isShow: Boolean; CrsTabShowType: Integer);
- procedure PreviewComXMLGetDataConnection(var ADOCon: TADOConnection);
- procedure PreviewComXMLGetDatasetEvent(DatasetInfo: PDatasetInfoRec;
- var ADataset: TDataSet);
- procedure msbReportsPreviewMouseWheelDown(Sender: TObject;
- Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
- procedure msbReportsPreviewMouseWheelUp(Sender: TObject;
- Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
- procedure ScrollBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- procedure ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
- MousePos: TPoint; var Handled: Boolean);
- procedure btnPreClick(Sender: TObject);
- procedure btnNextClick(Sender: TObject);
- procedure pbGenerateClick(Sender: TObject);
- private
- FProjectData: TProjectData;
- // 数据库管理
- FReportCon: TReportConnection;
- // 报表数据准备
- FReportDataPrepare: TReportPrepare;
- FPreviewList: TList;
- FCurPage: Integer;
- procedure OnViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- procedure OnViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- procedure ExportReports(const AFileName: string);
- procedure LoadReportTemplates;
- procedure PreviewPage(AImage: TImage; APageIndex: Integer);
- procedure InitPageSettings(APrintCom: TPrintComXML);
- procedure InitFont(APrintCom: TPrintComXML);
- procedure InitPaperSettings(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
- procedure InitReportSettings(APrintCom: TPrintComXML; ATemplate: TTemplateNode = nil);
- procedure SaveAuditOpinion(ATemplate: TTemplateNode);
- procedure SaveReportInteractData(ATemplate: TTemplateNode);
- procedure LoadTemplet(ATemplate: TTemplateNode; APrintCom: TPrintComXML);
- procedure LoadTemplateAndDisplay(ATemplate: TTemplateNode);
- procedure SetCurPage(const Value: Integer);
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
- property ProjectData: TProjectData read FProjectData;
- property CurPage: Integer read FCurPage write SetCurPage;
- end;
- procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
- implementation
- uses
- UtilMethods, TemplateManagerHelper, Globals, AuditSelectFrm,
- ScFileArchiver, ZhAPI;
- {$R *.dfm}
- procedure SignOnline(AProjectNode: TsdIDTreeNode; ASignPhase: Integer);
- var
- vSignForm: TSignOnlineReportsForm;
- begin
- vSignForm := TSignOnlineReportsForm.Create(nil);
- try
- vSignForm.Init(AProjectNode, ASignPhase);
- vSignForm.ShowModal;
- finally
- vSignForm.Free;
- end;
- end;
- { TSignOnlineReportsForm }
- destructor TSignOnlineReportsForm.Destroy;
- begin
- ClearObjects(FPreviewList);
- FPreviewList.Free;
- FReportCon.Free;
- FReportDataPrepare.Free;
- if Assigned(FProjectData) then
- FProjectData.Free;
- inherited;
- end;
- procedure TSignOnlineReportsForm.Init(AProjNode: TsdIDTreeNode; ASignPhase: Integer);
- function getTopParent(ANode: TsdIDTreeNode): TsdIDTreeNode;
- begin
- if Assigned(ANode.Parent) then
- Result := getTopParent(ANode.Parent)
- else
- Result := ANode;
- end;
- function getName(ANode: TsdIDTreeNode): string;
- begin
- Result := ANode.Rec.ValueByName('Name').AsString;
- end;
- begin
- FProjectData := TProjectData.Create;
- FProjectData.OpenForSignOnline(GetMyProjectsFilePath + AProjNode.Rec.ValueByName('FileName').AsString, ASignPhase);
- FReportDataPrepare := TReportPrepare.Create(FProjectData);
- FReportCon := TReportConnection.Create(FProjectData);
- //Caption := Format('生成签署报表 %s-%s-第 %d 期', [getName(getTopParent(AProjectNode)), getName(AProjectNode), ASignPhase]);
- Caption := Format('生成签署报表 %s-第 %d 期', [getName(AProjNode), ASignPhase]);
- LoadReportTemplates;
- end;
- procedure TSignOnlineReportsForm.LoadReportTemplates;
- var
- vHelper: TTemplateManagerHelper;
- begin
- vHelper := TTemplateManagerHelper.Create;
- try
- vHelper.ExportToTreeView(tvReports, ReportTemplateManager);
- finally
- vHelper.Free;
- end;
- end;
- procedure TSignOnlineReportsForm.FormShow(Sender: TObject);
- var
- vNode: TTreeNode;
- begin
- vNode := tvReports.Items.GetFirstNode;
- while Assigned(vNode) do
- begin
- vNode.Expand(True);
- vNode := vNode.getNextSibling;
- end;
- tvReports.Selected := tvReports.Items[0];
- end;
- procedure TSignOnlineReportsForm.tvReportsClick(Sender: TObject);
- var
- vTemplate: TTemplateNode;
- begin
- if Assigned(tvReports.Selected) then
- begin
- vTemplate := TTemplateNode(tvReports.Selected.Data);
- if Assigned(vTemplate) then
- begin
- ReportTemplateManager.Current := vTemplate;
- LoadTemplateAndDisplay(vTemplate);
- end;
- end;
- end;
- procedure TSignOnlineReportsForm.LoadTemplateAndDisplay(ATemplate: TTemplateNode);
- procedure WaringAndEmptyPreview(AStr: string);
- var
- OldBrushColor, OldPenColor: TColor;
- begin
- TipMessage(AStr, Handle);
- ClearObjects(FPreviewList);
- pnlPageControl.Visible := False;
- end;
- procedure ShowAllPages;
- const
- Indent = 5;
- var
- iPage: Integer;
- vPreviewImage: TImage;
- begin
- ClearObjects(FPreviewList);
- msbReportsPreview.HorzScrollBar.Range := 0;
- msbReportsPreview.HorzScrollBar.Position := 0;
- msbReportsPreview.VertScrollBar.Range := 0;
- msbReportsPreview.VertScrollBar.Position := 0;
- for iPage := 1 to PreviewComXML.TotalPages do
- begin
- vPreviewImage := TImage.Create(msbReportsPreview);
- vPreviewImage.Parent := msbReportsPreview;
- vPreviewImage.Top := (PreviewComXML.PrintHeight + Indent) * (iPage - 1);
- vPreviewImage.Left := 0;
- PreviewPage(vPreviewImage, iPage);
- FPreviewList.Add(vPreviewImage);
- end;
- msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
- msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight * PreviewComXML.TotalPages + 10 * (PreviewComXML.TotalPages - 1);
- end;
- procedure ShowCurPages;
- var
- vPreviewImage: TImage;
- begin
- ClearObjects(FPreviewList);
- msbReportsPreview.HorzScrollBar.Position := 0;
- msbReportsPreview.VertScrollBar.Position := 0;
- vPreviewImage := TImage.Create(msbReportsPreview);
- vPreviewImage.Parent := msbReportsPreview;
- vPreviewImage.Top := 0;
- vPreviewImage.Left := 0;
- FPreviewList.Add(vPreviewImage);
- msbReportsPreview.HorzScrollBar.Range := PreviewComXML.PrintWidth;
- msbReportsPreview.VertScrollBar.Range := PreviewComXML.PrintHeight;
- vPreviewImage.OnMouseMove := OnViewMouseMove;
- vPreviewImage.OnMouseDown := OnViewMouseDown;
- CurPage := 1;
- end;
- procedure PreviewTemplet(AIsShowAllPages: Boolean);
- begin
- try
- if AIsShowAllPages then
- ShowAllPages
- else
- ShowCurPages;
- pnlPageControl.Visible := not AIsShowAllPages;
- msbReportsPreview.SetFocus;
- except
- WaringAndEmptyPreview('当前报表显示可能存在问题,请与纵横客服中心联系:(0756)3850888。');
- end;
- end;
- procedure LoadEmptyTempletAndDisplay;
- begin
- WaringAndEmptyPreview('报表无数据,请选择其他报表。');
- end;
- begin
- // 交互表
- if ATemplate.InteractFlag <> 0 then
- SaveReportInteractData(ATemplate);
- // 准备额外数据
- if ATemplate.DataPrepareFlag <> 0 then
- FReportDataPrepare.PrepareData(ATemplate.DataPrepareFlag);
- FReportCon.RefreshConnection(ATemplate);
- Screen.Cursor := crHourGlass;
- try
- LoadTemplet(ATemplate, PreviewComXML);
- if PreviewComXML.TotalPages > 0 then
- PreviewTemplet(False)
- else
- LoadEmptyTempletAndDisplay;
- finally
- Screen.Cursor := crDefault;
- end;
- end;
- procedure TSignOnlineReportsForm.LoadTemplet(ATemplate: TTemplateNode;
- APrintCom: TPrintComXML);
- var
- RptArchiverObj: TReportArchiver;
- Mem: TMemoryStream;
- begin
- RptArchiverObj := TReportArchiver.Create;
- if ATemplate.IsMulti then
- RptArchiverObj.FileName := ATemplate.MultiFileNames[FProjectData.PhaseIndex]
- else
- RptArchiverObj.FileName := ATemplate.FileName;
- Mem := RptArchiverObj.Extract;
- try
- // 以下代码有顺序限制,不可修改,主要保证在不修改报表模板文件的基础上可以用户定制报表格式
- // 私以为,原因在于这些设置修改后,并不能生效,需要保存再读取方可生效
- // 读取报表模板
- if not APrintCom.ReadReportStream(Mem) then Exit;
- // 将报表设置中的数据覆盖掉原模板的数据
- InitReportSettings(APrintCom, ATemplate);
- // 保存
- APrintCom.SaveToStream(Mem);
- // 再次读取,使报表设置中的设置生效
- APrintCom.ReadReportStream(Mem);
- // ReadReportStream之后会将PreviewComXML的FillZero值赋为True,故再赋值一次
- // To Do
- APrintCom.FillZero := cbFillZero.Checked;
- InitPageSettings(APrintCom);
- APrintCom.ReadDBData;
- APrintCom.AnalyseData(PreviewBox.Canvas);
- finally
- if Mem <> nil then
- Mem.Free;
- RptArchiverObj.Free;
- end;
- end;
- procedure TSignOnlineReportsForm.InitFont(APrintCom: TPrintComXML);
- 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);
- APrintCom.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
- APrintCom.getAllColumnHeadObjs(ObjList);
- for i := 0 to ObjList.Count - 1 do
- begin
- ColumnRec := ObjList[i];
- AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
- InitColumnThick(ColumnRec);
- APrintCom.setColumnHeadTailObj(0, ColumnRec);
- end;
- APrintCom.getAllColumnTailObjs(ObjList);
- for i := 0 to ObjList.Count - 1 do
- begin
- ColumnRec := ObjList[i];
- AssignFontRec(ColumnRec.FontRec, ReportConfig.ColumnFont);
- InitColumnThick(ColumnRec);
- APrintCom.setColumnHeadTailObj(1,ColumnRec);
- end;
- APrintCom.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);
- APrintCom.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
- // 设置表正文
- APrintCom.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);
- APrintCom.setFlowContentObj(FlowContentRec);
- end;
- end;
- APrintCom.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);
- APrintCom.setBillContentObj(FlowContentRec);
- end;
- end;
- APrintCom.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);
- APrintCom.setCrossContentObj(CrossContentRec);
- end;
- end;
- // 设置表合计
- for i := 0 to 2 do
- begin
- APrintCom.getAllSumObjs(i,ObjList);
- for j := 0 to ObjList.Count - 1 do
- begin
- SumRec := ObjList[j];
- AssignFontRec(SumRec.FontRec, ReportConfig.GatherFont);
- APrintCom.setSumObj(SumRec);
- end;
- end;
- finally
- ObjList.Free;
- end;
- end;
- procedure InitGridHeaderFont;
- var
- i: Integer;
- ObjList: TList;
- HeadTailRec : PHeadRec;
- begin
- ObjList := TList.Create;
- try
- APrintCom.getAllHeadObjs(ObjList);
- for i := 0 to ObjList.Count - 1 do
- begin
- HeadTailRec := ObjList[i];
- AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
- APrintCom.setHeadTailObj(0, HeadTailRec);
- end;
- APrintCom.getAllTailObjs(ObjList);
- for i := 0 to ObjList.Count - 1 do
- begin
- HeadTailRec := ObjList[i];
- AssignFontRec(HeadTailRec.FontRec, ReportConfig.GridHeaderFont);
- APrintCom.setHeadTailObj(1, HeadTailRec);
- end;
- finally
- ObjList.Free;
- end;
- end;
- begin
- InitTitleFont;
- InitColumnFont;
- InitContentAndGatherFont;
- InitGridHeaderFont;
- end;
- procedure TSignOnlineReportsForm.InitPageSettings(APrintCom: TPrintComXML);
- begin
- // 设置页面大小
- APrintCom.setPageSize(ReportConfig.PageSize);
- // 统一纸张大小
- APrintCom.PrintPageSizeIdx := DMPAPER_A4;
- {
- if ReportConfig.PageSize = 'A3' then
- APrintCom.PrintPageSizeIdx := DMPAPER_A3
- else if ReportConfig.PageSize = 'A4' then
- APrintCom.PrintPageSizeIdx := DMPAPER_A4;
- }
- // 设置边距
- APrintCom.setEdge(0, '', ReportConfig.LeftEdge/10);
- APrintCom.setEdge(1, '', ReportConfig.RightEdge/10);
- APrintCom.setEdge(2, '', ReportConfig.UpEdge/10);
- APrintCom.setEdge(3, '', ReportConfig.DownEdge/10);
- end;
- procedure TSignOnlineReportsForm.InitPaperSettings(
- ATemplate: TTemplateNode; APrintCom: TPrintComXML);
- procedure InitRepBorderLine;
- var
- i: Integer;
- ObjList : TList;
- ShapeRec : PPicRec;
- begin
- ObjList := TList.Create;
- try
- APrintCom.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;
- APrintCom.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
- APrintCom.getAllFlowShowContentObjs(ObjList);
- // 设置报表表格横线
- for i := 0 to ObjList.Count - 1 do
- begin
- FlowContentRec := ObjList[i];
- FlowContentRec.LineInfo.TopThick := ReportConfig.CellHorLineWidth;
- FlowContentRec.LineInfo.BottomThick := ReportConfig.CellHorLineWidth;
- APrintCom.setFlowContentObj(FlowContentRec);
- end;
- APrintCom.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;
- APrintCom.setCrossContentObj(CrossContentRec);
- end;
- // 设置报表表格竖线
- APrintCom.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;
- APrintCom.setFlowContentObj(FlowContentRec);
- end;
- APrintCom.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;
- APrintCom.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;
- APrintCom.setActShowElementObj(PSR);
- end;
- end;
- finally
- ObjList.Free;
- end;
- end;
- begin
- if not Assigned(ATemplate) or (ATemplate.SelfFormat = 0) then
- begin
- InitFont(APrintCom); // 各类字体
- InitRepBorderLine; // 报表边框
- InitRepCellLine; // 报表表格
- InitOtherArea; // 活动区域
- end;
- end;
- procedure TSignOnlineReportsForm.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;
- procedure TSignOnlineReportsForm.SaveReportInteractData(
- ATemplate: TTemplateNode);
- begin
- case ATemplate.InteractFlag of
- 1: SaveAuditOpinion(ATemplate);
- end;
- end;
- procedure TSignOnlineReportsForm.InitReportSettings(
- APrintCom: TPrintComXML; ATemplate: TTemplateNode);
- begin
- InitPageSettings(APrintCom);
- InitPaperSettings(ATemplate, APrintCom);
- APrintCom.ShowBackgroundMark := FProjectData.ProjProperties.ShowReportShading;
- APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShading;
- if FProjectData.ProjProperties.ReportShowState then
- begin
- if FProjectData.ProjProperties.ReportShowStateWithoutReply and (FProjectData.ProjProperties.AuditStatus = -1) then
- APrintCom.ShowBackgroundMark := False
- else
- APrintCom.ShowBackgroundMark := True;
- end
- else
- APrintCom.ShowBackgroundMark := False;
- APrintCom.BackgroundMarkStr := FProjectData.ProjProperties.ReportShowStateText;
- end;
- procedure TSignOnlineReportsForm.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 TSignOnlineReportsForm.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 TSignOnlineReportsForm.PreviewComXMLGetDataConnection(
- var ADOCon: TADOConnection);
- begin
- ADOCon := FReportCon.Connection;
- end;
- procedure TSignOnlineReportsForm.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;
- procedure TSignOnlineReportsForm.PreviewPage(AImage: TImage;
- APageIndex: Integer);
- begin
- if Assigned(AImage) then
- begin
- AImage.Height := PreviewComXML.PrintHeight ;
- AImage.Picture.Bitmap.Height := PreviewComXML.PrintHeight;
- AImage.Width := PreviewComXML.PrintWidth;
- AImage.Picture.Bitmap.Width := PreviewComXML.PrintWidth;
- PreviewComXML.PrintPreviewCanvas(APageIndex, 0, AImage.Canvas, False);
- end;
- end;
- constructor TSignOnlineReportsForm.Create(AOwner: TComponent);
- procedure LoadCursor(AIndex: Integer; const AFileName: string);
- var
- rst: Integer;
- begin
- rst := LoadCursorFromFile(PChar(AFileName));
- if rst <> 0 then
- Screen.Cursors[AIndex] := rst;
- end;
- begin
- inherited;
- FPreviewList := TList.Create;
- LoadCursor(crPrevious, GetAppFilePath + 'PreviousPage.cur');
- LoadCursor(crNext, GetAppFilePath + 'NextPage.cur');
- end;
- procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelDown(
- Sender: TObject; Shift: TShiftState; MousePos: TPoint;
- var Handled: Boolean);
- begin
- SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
- end;
- procedure TSignOnlineReportsForm.msbReportsPreviewMouseWheelUp(
- Sender: TObject; Shift: TShiftState; MousePos: TPoint;
- var Handled: Boolean);
- begin
- SendMessage(TMScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
- end;
- procedure TSignOnlineReportsForm.ScrollBox1MouseWheelDown(Sender: TObject;
- Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
- begin
- SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEDOWN, 0);
- end;
- procedure TSignOnlineReportsForm.ScrollBox1MouseWheelUp(Sender: TObject;
- Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
- begin
- SendMessage(TScrollBox(Sender).Handle, WM_VSCROLL, SB_LINEUP, 0);
- end;
- procedure TSignOnlineReportsForm.ExportReports(const AFileName: string);
- procedure ExportReportPage(APage: Integer; const APageFileName: string);
- var
- img: TImage;
- begin
- img := TImage.Create(nil);
- try
- img.Height := PreviewComXML.PrintHeight;
- img.Width := PreviewComXML.PrintWidth;
- PreviewComXML.PrintPreviewCanvas(APage, 0, img.Canvas, False);
- img.Picture.SaveToFile(APageFileName);
- finally
- img.Free;
- end;
- end;
- var
- ATempFolder: String;
- i: Integer;
- begin
- ATempFolder := GenerateTempFolder(GetTempFilePath);
- for i := 1 to PreviewComXML.TotalPages do
- begin
- ExportReportPage(i, Format('%s\%d.jpg', [ATempFolder, i]));
- end;
- ZipFolder(ATempFolder, AFileName);
- end;
- procedure TSignOnlineReportsForm.btnPreClick(Sender: TObject);
- begin
- if CurPage > 1 then
- CurPage := CurPage - 1
- else
- WarningMessage('已经是最前了');
- end;
- procedure TSignOnlineReportsForm.btnNextClick(Sender: TObject);
- begin
- if CurPage < PreviewComXML.TotalPages then
- CurPage := CurPage + 1
- else
- WarningMessage('已经是最后了');
- end;
- procedure TSignOnlineReportsForm.SetCurPage(const Value: Integer);
- begin
- FCurPage := Value;
- PreviewPage(TImage(FPreviewList.Items[0]), FCurPage);
- lblPages.Caption := Format('%d/%d', [FCurPage, PreviewComXML.TotalPages]);
- end;
- procedure TSignOnlineReportsForm.pbGenerateClick(Sender: TObject);
- var
- sFileName: string;
- begin
- if SaveFile(sFileName, '.zip') then
- begin
- ExportReports(sFileName);
- end;
- end;
- procedure TSignOnlineReportsForm.OnViewMouseMove(Sender: TObject;
- Shift: TShiftState; X, Y: Integer);
- begin
- if (X < offset) and (CurPage > 1) then
- begin
- TControl(Sender).Cursor := crPrevious;
- end
- else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
- begin
- TControl(Sender).Cursor := crNext;
- end
- else
- begin
- TControl(Sender).Cursor := crDefault;
- end;
- end;
- procedure TSignOnlineReportsForm.OnViewMouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- if (X < offset) and (CurPage > 1) then
- begin
- CurPage := CurPage - 1;
- end
- else if (X > TControl(Sender).Width - 150) and (CurPage < PreviewComXML.TotalPages) then
- begin
- CurPage := CurPage + 1;
- end;
- end;
- end.
|