⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preview.pas

📁 Delphi报表设计器源代码
💻 PAS
字号:
UNIT Preview;

INTERFACE

USES
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ReportControl, ExtCtrls, Buttons, StdCtrls, Spin, ComCtrls, Menus;

TYPE
  TPreviewForm = CLASS(TForm)
    StatusBar1: TStatusBar;
    ScrollBox1: TScrollBox;
    Panel1: TPanel;
    SpeedButton2: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    Bevel1: TBevel;
    SpeedButton1: TSpeedButton;
    SpeedButton3: TSpeedButton;
    EditEptk: TSpeedButton;
    Panel2: TPanel;
    Panel3: TPanel;
    PrintBtn: TSpeedButton;
    filename: TLabel;
    PrevPageBtn: TSpeedButton;
    NextPageBtn: TSpeedButton;
    But1: TSpeedButton;
    But2: TSpeedButton;
    Bevel2: TBevel;
    PopupMenu1: TPopupMenu;
    clBtnFace1: TMenuItem;
    Bevel5: TBevel;
    btnClose: TSpeedButton;
    Bevel3: TBevel;
    fh: TSpeedButton;
    Bevel4: TBevel;
    ReportControl1: TReportControl;
    PROCEDURE ScrollBox1Resize(Sender: TObject);
    PROCEDURE NextPageBtnClick(Sender: TObject);
    PROCEDURE PrevPageBtnClick(Sender: TObject);
    PROCEDURE But1Click(Sender: TObject);
    PROCEDURE But2Click(Sender: TObject);
    PROCEDURE SpeedButton2Click(Sender: TObject);
    PROCEDURE FormCreate(Sender: TObject);
    PROCEDURE FormResize(Sender: TObject);
    PROCEDURE SpeedButton3Click(Sender: TObject);
    PROCEDURE ReportControl1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    PROCEDURE FormClose(Sender: TObject; VAR Action: TCloseAction);
    PROCEDURE btnCloseClick(Sender: TObject);
    PROCEDURE SpeedButton4Click(Sender: TObject);
    PROCEDURE SpeedButton5Click(Sender: TObject);
    PROCEDURE SpeedButton1Click(Sender: TObject);
    PROCEDURE PrintBtnClick(Sender: TObject);
    PROCEDURE FormActivate(Sender: TObject);
    PROCEDURE EditEptkClick(Sender: TObject);
    PROCEDURE clBtnFace1Click(Sender: TObject);
    PROCEDURE FormCloseQuery(Sender: TObject; VAR CanClose: Boolean);
  PRIVATE
    zoomxxx: integer;                   // add 李泽伦
    FIsStream: Boolean;
    FFiles: TStrings;
    FStreams: ARRAY OF TStream;
  PUBLIC
    { Public declarations }
    CurrentPage: Integer;
    PageCount: Integer;
    DataNameFilst: Tlist;
    ReportEdit: Boolean;
    PROCEDURE UpdatePage;
    PROCEDURE UpdateFiles(Files: TStrings);
    PROCEDURE UpdateStreams(Streams: ARRAY OF TStream);
    PROCEDURE PrintStreams(Streams: ARRAY OF TStream);
    PROCEDURE PreviewStreams(Streams: ARRAY OF TStream);
    PROCEDURE SetPreviewMode(bPreview: Boolean);
    FUNCTION GetStream(Page: Integer): TStream;
    PROPERTY IsStream: Boolean READ FIsStream;
  END;

IMPLEMENTATION

USES Margin, Creport;

{$R *.DFM}

PROCEDURE TPreviewForm.ScrollBox1Resize(Sender: TObject);
BEGIN
  IF ClientRect.Right > ReportControl1.Width + 20 THEN
    ReportControl1.Left := (ClientRect.Right - ReportControl1.Width - 30) DIV 2
  ELSE
    ReportControl1.Left := 18;

  IF ((height - 110 - ReportControl1.Height) DIV 2) + 10 > 10 THEN
    ReportControl1.top := ((height - 110 - ReportControl1.Height) DIV 2) + 10
  ELSE
    ReportControl1.top := 5;
END;

PROCEDURE TPreviewForm.NextPageBtnClick(Sender: TObject);
BEGIN
  IF CurrentPage >= PageCount THEN
    Exit;
  Inc(CurrentPage);
  UpdatePage;

END;

PROCEDURE TPreviewForm.PrevPageBtnClick(Sender: TObject);
BEGIN
  IF CurrentPage <= 1 THEN
    Exit;
  Dec(CurrentPage);
  UpdatePage;
END;

PROCEDURE TPreviewForm.SetPreviewMode(bPreview: Boolean);
BEGIN
  ReportControl1.IsPreview := bPreview;
  ReportControl1.Refresh;
END;

PROCEDURE TPreviewForm.But1Click(Sender: TObject);
BEGIN
  CurrentPage := 1;
  UpdatePage;
END;

PROCEDURE TPreviewForm.But2Click(Sender: TObject);
BEGIN
  CurrentPage := PageCount;
  UpdatePage;
END;

PROCEDURE TPreviewForm.SpeedButton2Click(Sender: TObject);
BEGIN
  SpeedButton2.Enabled := NOT TReportRunTime(Owner).CancelPrint;
END;

PROCEDURE TPreviewForm.FormCreate(Sender: TObject);
BEGIN
  PageCount := 1;
  CurrentPage := 1;
  zoomxxx := 100;
  tag := 0;

END;

PROCEDURE TPreviewForm.UpdatePage;
VAR
  nPrevScale: Integer;
BEGIN
  nPrevScale := ReportControl1.ReportScale;
  PageCount := High(FStreams) - Low(FStreams) + 1;

  IF PageCount < CurrentPage THEN
    CurrentPage := PageCount;

  PrevPageBtn.Enabled := CurrentPage > 1;
  but1.Enabled := CurrentPage > 1;
  NextPageBtn.Enabled := CurrentPage < PageCount;
  but2.Enabled := CurrentPage < PageCount;

  StatusBar1.Panels[0].Text := '第' + IntToStr(CurrentPage) + '/' +
    IntToStr(PageCount) + '页';

  LockWindowUpdate(Handle);

  ReportControl1.LoadFromStream(FStreams[Low(FStreams) + CurrentPage - 1]);

  LockWindowUpdate(0);
  ShowWindow(ReportControl1.Handle, SW_HIDE);
  ReportControl1.ReportScale := zoomxxx;
  ShowWindow(ReportControl1.Handle, SW_SHOW);
END;

PROCEDURE TPreviewForm.FormResize(Sender: TObject);
VAR
  z1, z2: integer;
BEGIN
  ////////////////////////////////
  IF (ScrollBox1.Height) < pgh THEN     // lzl
    z1 := trunc(((ScrollBox1.Height - 10) / pgh) * 100)
  ELSE
    z1 := 100;

  IF (ScrollBox1.Width) < pgw THEN      // add
    z2 := trunc(((ScrollBox1.Width - 35) / pgw) * 100)
  ELSE
    z2 := 100;

  IF z1 <= z2 THEN                      // add
    zoomxxx := z1
  ELSE
    zoomxxx := z2;
  ////////////////////////////////////////////////////
  ShowWindow(ReportControl1.Handle, SW_HIDE);
  ReportControl1.ReportScale := zoomxxx;
  ScrollBox1Resize(Self);
  ShowWindow(ReportControl1.Handle, SW_SHOW);
END;

PROCEDURE TPreviewForm.SpeedButton3Click(Sender: TObject); // add
VAR
  z1, z2: integer;
BEGIN
    IF (ScrollBox1.Height) < pgh THEN     // add
    z1 := trunc(((ScrollBox1.Height - 10) / pgh) * 100)
  ELSE
    z1 := 100-1;

  IF (ScrollBox1.Width) < pgw THEN      // add
    z2 := trunc(((ScrollBox1.Width - 35) / pgw) * 100)
  ELSE
    z2 := 100-1;

  IF z1 <= z2 THEN                      // add
    zoomxxx := z1
  ELSE
    zoomxxx := z2;

  ShowWindow(ReportControl1.Handle, SW_HIDE);
  ReportControl1.ReportScale := zoomxxx;
  ScrollBox1Resize(Self);
  ShowWindow(ReportControl1.Handle, SW_SHOW);
END;

PROCEDURE TPreviewForm.PrintStreams(Streams: ARRAY OF TStream);
VAR
  I: Integer;
BEGIN
  FIsStream := True;
  TRY
    FOR I := Low(Streams) TO High(Streams) DO
      BEGIN
        ReportControl1.LoadFromStream(Streams[I]);
        ReportControl1.PrintIt;
      END;
  FINALLY
    FIsStream := False;
  END;
END;

PROCEDURE TPreviewForm.PreviewStreams(Streams: ARRAY OF TStream);
BEGIN
  FIsStream := True;
  TRY
    IF Length(Streams) < 1 THEN
      Exit;
    UpdateStreams(Streams);
    UpdatePage;
    ShowModal;
  FINALLY
    FIsStream := False;
  END;
END;

FUNCTION TPreviewForm.GetStream(Page: Integer): TStream;
BEGIN
  IF IsStream THEN
    Result := FStreams[Low(FStreams) + Page - 1]
  ELSE
    Result := NIL;
END;

PROCEDURE TPreviewForm.UpdateFiles(Files: TStrings);
BEGIN
  FFiles := Files;
END;

PROCEDURE TPreviewForm.UpdateStreams(Streams: ARRAY OF TStream);
VAR
  FL, L, I: Integer;
BEGIN
  SetLength(FStreams, Length(Streams));
  FL := Low(FStreams);
  L := Low(Streams);
  FOR I := FL TO High(FStreams) DO
    BEGIN
      FStreams[I] := Streams[L + I - FL];
    END;
END;

PROCEDURE TPreviewForm.ReportControl1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
VAR
  pt, ptOrg: TPoint;
BEGIN
END;

PROCEDURE TPreviewForm.FormClose(Sender: TObject;
  VAR Action: TCloseAction);
BEGIN
  TReportRunTime(owner).DeleteTempStreams;
END;

PROCEDURE TPreviewForm.btnCloseClick(Sender: TObject);
BEGIN
  Close;
END;

PROCEDURE TPreviewForm.SpeedButton4Click(Sender: TObject);
BEGIN
  zoomxxx := zoomxxx + 10;
  ShowWindow(ReportControl1.Handle, SW_HIDE);
  ReportControl1.ReportScale := zoomxxx;
  ScrollBox1Resize(Self);
  ShowWindow(ReportControl1.Handle, SW_SHOW);
END;

PROCEDURE TPreviewForm.SpeedButton5Click(Sender: TObject);
BEGIN
  zoomxxx := zoomxxx - 10;
  ShowWindow(ReportControl1.Handle, SW_HIDE);
  ReportControl1.ReportScale := zoomxxx;
  ScrollBox1Resize(Self);
  ShowWindow(ReportControl1.Handle, SW_SHOW);

END;

PROCEDURE TPreviewForm.SpeedButton1Click(Sender: TObject);
BEGIN
  ReportControl1.Visible := false;
  ReportControl1.LoadFromFile(filename.caption); //装入模版以做修改页面或纸张
  IF TMarginForm.EditReportControl(Self, ReportControl1) = mrOK THEN
    BEGIN
      pgw := 0;
      ReportControl1.CalcWndSize;
      ReportControl1.SaveToFile(filename.caption);
      TReportRunTime(owner).UpdatePage;
    END;
  But1.OnClick(Sender);                 //预览第一页
  SpeedButton3Click(Sender);            //保证纸张变化后,显示适中
  ReportControl1.Visible := true;
END;

PROCEDURE TPreviewForm.PrintBtnClick(Sender: TObject);
BEGIN
  SpeedButton2.Enabled := True;
  TReportRunTime(Owner).Print(false);
  SpeedButton2.Enabled := false;

END;

PROCEDURE TPreviewForm.FormActivate(Sender: TObject);
BEGIN
  ReportControl1.CPreviewEdit := true;
  SpeedButton3.OnClick(sender);

END;

PROCEDURE TPreviewForm.EditEptkClick(Sender: TObject);
VAR
  Creportform: TCreportform;
BEGIN
  Creportform := TCreportform.Create(Self);
  TRY
    Creportform.ReportControl1.LoadFromFile(filename.Caption);
    Creportform.FFile := filename.Caption;
   // IF (Self.Owner AS TReportRunTime).CreportButt THEN
     IF PLCreportButt THEN
      Creportform.setbuttonClose;       //在模版程序中只能修改字体等
    Creportform.Caption := filename.Caption;
    Creportform.ShowModal;
    IF Creportform.Tag = 1 THEN         //=1说明修改过
      BEGIN
        IF Self.Owner IS TReportRunTime THEN
          (Self.Owner AS TReportRunTime).UpdatePage;
        But1.OnClick(Sender);           //预览第一页
      END;
  FINALLY
    Creportform.Free;
  END;
  SpeedButton3.OnClick(sender);

END;

PROCEDURE TPreviewForm.clBtnFace1Click(Sender: TObject);
var zomk:integer;
BEGIN
  zomk:=zoomxxx;
  ReportControl1.Visible := false;
  ReportControl1.SetFileCellWidth(filename.Caption, Tag);
  TReportRunTime(owner).UpdatePage;

  But1.OnClick(Sender);                 //预览第一页

  clBtnFace1.Enabled := false;
  fh.Enabled := false;

  ShowWindow(ReportControl1.Handle, SW_HIDE);
  zoomxxx:=zomk;
  ReportControl1.ReportScale := zoomxxx;
  ScrollBox1Resize(Self);
  ShowWindow(ReportControl1.Handle, SW_SHOW);
  ReportControl1.Visible := true;

END;

PROCEDURE TPreviewForm.FormCloseQuery(Sender: TObject;
  VAR CanClose: Boolean);
BEGIN
  ReportControl1.CPreviewEdit := false;
END;

END.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -