MaiXinRong пре 8 година
родитељ
комит
4e3a81731b
2 измењених фајлова са 223 додато и 0 уклоњено
  1. 82 0
      Units/ReportPdfHelper.pas
  2. 141 0
      Units/SignReports.pas

+ 82 - 0
Units/ReportPdfHelper.pas

@@ -0,0 +1,82 @@
+unit ReportPdfHelper;
+
+interface
+
+uses
+  classes, PrintCom, PDF;
+
+type
+  TReportPdfHelper = class
+  private
+  public
+    procedure ExportPages(APrintCom: TPrintCom; const AFileName: string; ABeginPage, AEndPage: Integer);
+    procedure ExportAllPages(APrintCom: TPrintCom; const AFileName: string);
+  end;
+
+function PdfHelper: TReportPdfHelper;
+
+implementation
+
+uses
+  Windows, SysUtils, Forms, Controls;
+
+var _ReportPdfHelper: TReportPdfHelper;
+
+function PdfHelper: TReportPdfHelper;
+begin
+  if not Assigned(_ReportPdfHelper) then
+    _ReportPdfHelper := TReportPdfHelper.Create;
+  Result := _ReportPdfHelper;
+end;
+
+{ TReportPdfHelper }
+
+procedure TReportPdfHelper.ExportAllPages(APrintCom: TPrintCom;
+  const AFileName: string);
+begin
+  ExportPages(APrintCom, AFileName, 1, APrintCom.TotalPages);
+end;
+
+procedure TReportPdfHelper.ExportPages(APrintCom: TPrintCom;
+  const AFileName: string; ABeginPage, AEndPage: Integer);
+var
+  sPdf: TPDFDocument;
+  iPage, iImage, I: Integer;
+begin
+  Screen.Cursor := crHourGlass;
+  sPdf := TPDFDocument.Create(nil);
+  try
+    I := GetDeviceCaps(sPdf.UsedDC, LOGPIXELSX);
+
+    sPdf.AutoLaunch := False;
+    sPdf.DocumentInfo.CreationDate := Now;
+    sPdf.FileName := AFileName;
+    sPdf.PageLayout := plSinglePage;
+    sPdf.BeginDoc;
+    for iPage := 0 to AEndPage - ABeginPage do
+    begin
+      if sPdf.PageCount <= iPage then
+        sPdf.NewPage
+      else
+        sPdf.SetCurrentPage(iPage);
+
+      if sPdf.PageHeight <> APrintCom.PrintHeight then
+        sPdf.CurrentPage.Height := MulDiv(APrintCom.PrintHeight, 72, I);
+      if sPdf.PageWidth <> APrintCom.PrintWidth then
+        sPdf.CurrentPage.Width := MulDiv(APrintCom.PrintWidth, 72, I);
+
+      APrintCom.PrintPreviewCanvas(ABeginPage + iPage, 0, sPdf.Canvas, false);
+    end;
+    sPdf.EndDoc;
+  finally
+    sPdf.Free;
+    Screen.Cursor := crDefault;
+  end;
+end;
+
+initialization
+
+finalization
+  _ReportPdfHelper.Free;
+
+end.

+ 141 - 0
Units/SignReports.pas

@@ -0,0 +1,141 @@
+unit SignReports;
+
+interface
+
+uses
+  Classes, CslJson;
+
+type
+  TSignReport = class
+  private
+    FPhaseNo: Integer;
+    FName: string;
+    FOwnerID: Integer;
+  public
+    constructor Create(APhaseNo: Integer; const AName: string; AOwnerID: Integer);
+
+    property PhaseNo: Integer read FPhaseNo;
+    property Name: string read FName;
+    property OwnerID: Integer read FOwnerID;
+  end;
+
+  TSignReports = class
+  private
+    FList: TList;
+
+    procedure LoadSignReport(AStr: string);
+    procedure LoadSignReports(AInfos: TStrings);
+  public
+    constructor Create;
+    destructor Destroy; override;
+
+    function AddSignReport(APhaseNo: Integer; const AName: string; AOwnerID: Integer): TSignReport;
+    function LoadAllSignReports(const AUrl: string; AProjWebID, APhaseNo: string): Boolean;
+
+    function FindSignReport(APhaseNo: Integer; const AName: string): TSignReport;
+  end;
+
+implementation
+
+uses
+  PHPWebDm, UtilMethods, ZhAPI, SysUtils;
+
+{ TSignReports }
+
+function TSignReports.AddSignReport(APhaseNo: Integer; const AName: string;
+  AOwnerID: Integer): TSignReport;
+var
+  vSignReport: TSignReport;
+begin
+  vSignReport := TSignReport.Create(APhaseNo, AName, AOwnerID);
+  FList.Add(vSignReport);
+end;
+
+constructor TSignReports.Create;
+begin
+  FList := TList.Create;
+end;
+
+destructor TSignReports.Destroy;
+begin
+  FList.Free;
+  inherited;
+end;
+
+function TSignReports.FindSignReport(APhaseNo: Integer;
+  const AName: string): TSignReport;
+var
+  i: Integer;
+  vSignReport: TSignReport;
+begin
+  Result := nil;
+  for i := 0 to FList.Count - 1 do
+  begin
+    vSignReport := TSignReport(FList.Items[i]);
+    if (vSignReport.PhaseNo = APhaseNo) and (vSignReport.Name = AName) then
+    begin
+      Result := vSignReport;
+      Break;
+    end;
+  end;
+end;
+
+function TSignReports.LoadAllSignReports(const AUrl: string; AProjWebID,
+  APhaseNo: string): Boolean;
+var
+  iResult: Integer;
+  sgsUrlResult: TStrings;
+begin
+  sgsUrlResult := TStringList.Create;
+  try
+    iResult := PHPWeb.UrlGet(AUrl, nil, sgsUrlResult);
+    case iResult of
+      1: LoadSignReports(sgsUrlResult);
+      0: WarningMessage('网络错误:' + sgsUrlResult[0]);
+      -1: WarningMessage('网络错误:无法连接到云端');
+    end;
+    Result := iResult = 1;
+  finally
+    sgsUrlResult.Free;
+  end;
+end;
+
+procedure TSignReports.LoadSignReport(AStr: string);
+var
+  vJ: TCslJson;
+  sPhaseNo, sName, sOwnerID: string;
+  iPhaseNo, iOwnerID: Integer;
+begin
+  vJ := TCslJson.Create;
+  try
+    vJ.Text := AStr;
+    sPhaseNo := vJ.Value['phaseno'];
+    sName := vJ.Value['name'];
+    sOwnerID := vJ.Value['ownuid'];
+    if (sPhaseNo <> '') and TryStrToInt(sPhaseNo, iPhaseNo) and (sName <> '') and (sOwnerID <> '') and TryStrToInt(sOwnerID, iOwnerID) then
+      AddSignReport(iPhaseNo, sName, iOwnerID);
+  finally
+    vJ.Free;
+  end;
+end;
+
+procedure TSignReports.LoadSignReports(AInfos: TStrings);
+var
+  i: Integer;
+begin
+  ClearObjects(FList);
+  for i := 0 to AInfos.Count - 1 do
+    LoadSignReport(AInfos[i]);
+end;
+
+{ TSignReport }
+
+constructor TSignReport.Create(APhaseNo: Integer; const AName: string;
+  AOwnerID: Integer);
+begin
+  FPhaseNo := APhaseNo;
+  FName := AName;
+  FOwnerID := AOwnerID;
+end;
+
+end.