如题

解决方案 »

  1.   

    小弟以前曾做过,帖一给你了,是从QuickReport自带的预览窗体改写过来的,如需使用只要在QuickRep控件的OnPreview事件中增加如下调用即可:
    procedure TMainForm.QuickRep1Preview(Sender: TObject);
    begin
      uPreview.CustomPreview(QuickRep1.QRPrinter);
    end;窗体文件 uPreview.dfm:
    object fmPreview: TfmPreview
      Left = 114
      Top = 52
      AutoScroll = False
      BorderIcons = [biSystemMenu, biMaximize]
      Caption = '打印预览'
      ClientHeight = 468
      ClientWidth = 651
      Color = clBtnFace
      ParentFont = True
      KeyPreview = True
      OldCreateOrder = True
      Position = poScreenCenter
      ShowHint = True
      OnClose = FormClose
      OnDestroy = FormDestroy
      OnKeyDown = FormKeyDown
      OnResize = FormResize
      OnShow = FormShow
      PixelsPerInch = 96
      TextHeight = 13
      object StatusBar: TStatusBar
        Left = 0
        Top = 449
        Width = 651
        Height = 19
        Panels = <
          item
            Alignment = taRightJustify
            Text = '0%'
            Width = 40
          end
          item
            Text = 'Page'
            Width = 50
          end>
      end
      object QRPreview: TQRPreview
        Left = 0
        Top = 25
        Width = 651
        Height = 424
        HorzScrollBar.Tracking = True
        VertScrollBar.Tracking = True
        Align = alClient
        TabOrder = 1
        OnPageAvailable = QRPreviewPageAvailable
        OnProgressUpdate = QRPreviewProgressUpdate
        PageNumber = 1
        Zoom = 100
      end
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 651
        Height = 25
        Align = alTop
        BevelOuter = bvNone
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -12
        Font.Name = '宋体'
        Font.Style = []
        ParentFont = False
        TabOrder = 0
        object PrintButton: TBitBtn
          Left = 0
          Top = 1
          Width = 60
          Height = 22
          Caption = '打印(&P)'
          TabOrder = 0
          OnClick = PrintButtonClick
        end
        object FirstPage: TBitBtn
          Tag = 1
          Left = 72
          Top = 1
          Width = 60
          Height = 22
          Caption = '首页 |<'
          TabOrder = 1
          OnClick = FirstPageClick
        end
        object PreviousPage: TBitBtn
          Tag = 2
          Left = 136
          Top = 1
          Width = 60
          Height = 22
          Caption = '上页 <<'
          TabOrder = 2
          OnClick = FirstPageClick
        end
        object NextPage: TBitBtn
          Tag = 3
          Left = 200
          Top = 1
          Width = 60
          Height = 22
          Caption = '下页 >>'
          TabOrder = 3
          OnClick = FirstPageClick
        end
        object LastPage: TBitBtn
          Tag = 4
          Left = 264
          Top = 1
          Width = 60
          Height = 22
          Caption = '末页 >|'
          TabOrder = 4
          OnClick = FirstPageClick
        end
        object ExitButton: TBitBtn
          Left = 352
          Top = 1
          Width = 60
          Height = 22
          Caption = '关闭(&C)'
          TabOrder = 5
          OnClick = ExitClick
        end
      end
    end单元文件 uPreview.pas:
    unit uPreview;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, Buttons, ComCtrls, QRPrntr, QR3const;type
      TfmPreview = class(TForm)
        StatusBar: TStatusBar;
        QRPreview: TQRPreview;
        Panel1: TPanel;
        PrintButton: TBitBtn;
        FirstPage: TBitBtn;
        PreviousPage: TBitBtn;
        NextPage: TBitBtn;
        LastPage: TBitBtn;
        ExitButton: TBitBtn;    procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);    procedure FirstPageClick(Sender: TObject);
        procedure PrintButtonClick(Sender: TObject);
        procedure ExitClick(Sender: TObject);    procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
        procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
      private
        FQRPrinter : TQRPrinter;
        Gauge : TProgressBar;
        LastProgress : integer;
        WindowList: Pointer;
        ActiveWindow: HWnd;
      public
        constructor CreatePreview(AOwner : TComponent; aQRPrinter : TQRPrinter); virtual;
        procedure Show;
        procedure UpdateInfo;
        property QRPrinter : TQRPrinter read FQRPrinter write FQRPrinter;
      end;procedure CustomPreview(AQRPrinter: TQRPrinter);implementationuses QuickRpt;{$R *.DFM}procedure CustomPreview(AQRPrinter: TQRPrinter);
    begin
      with TfmPreview.CreatePreview(Application, AQRPrinter) do
      begin
        Show;
      end;
    end;constructor TfmPreview.CreatePreview(AOwner : TComponent; aQRPrinter : TQRPrinter);
    begin
      inherited Create(AOwner);
      QRPrinter := aQRPrinter;
      WindowState := wsMaximized;
      QRPreview.QRPrinter := aQRPrinter;
      if (QRPrinter <> nil) and (QRPrinter.Title <> '') then Caption := QRPrinter.Title;
      Gauge := TProgressBar.Create(Self);
      // Gauge.Parent := self;//
      Gauge.Top := 2;
      Gauge.Left := 2;
      Gauge.Height := 10;//
      Gauge.Width := 100;
      LastProgress := 0;
      if QRPrinter.Status = mpFinished then
        PrintButton.Enabled := true;
    end;procedure TfmPreview.FormShow(Sender: TObject);
    begin
      ActiveWindow := GetActiveWindow;
      WindowList := DisableTaskWindows(0);
    end;procedure TfmPreview.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      QRPrinter.ClosePreview(Self);
      Action := caFree;
    end;procedure TfmPreview.FormDestroy(Sender: TObject);
    begin
      if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
      EnableTaskWindows(WindowList);
    end;procedure TfmPreview.UpdateInfo;
    begin
      QRPreview.Zoom := 100;
      //StatusBar.Panels[1].Text := SqrPage + ' ' + IntToStr(QRPreview.PageNumber) + ' ' +
      //  SqrOf + ' ' + IntToStr(QRPreview.QRPrinter.PageCount);
      StatusBar.Panels[1].Text := Format('第 %d 页/共 %d 页', [QRPreview.PageNumber, QRPreview.QRPrinter.PageCount]);
    end;procedure TfmPreview.FormResize(Sender: TObject);
    begin
      QRPreview.UpdateZoom;
    end;procedure TfmPreview.Show;
    begin
      {QRPreview.QRPrinter.ShowingPreview:=true;}
      inherited Show;
      UpdateInfo;
    end;procedure TfmPreview.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      case Key of
        VK_Next : if Shift = [ssCtrl] then
                    LastPage.Click
                  else
                    NextPage.Click;
        VK_Prior : if Shift = [ssCtrl] then
                     FirstPage.Click
                   else
                     PreviousPage.Click;
        VK_Home : FirstPage.Click;
        VK_End : LastPage.Click;
        VK_Escape : ExitButton.Click;
      end;
    end;procedure TfmPreview.FirstPageClick(Sender: TObject);
    begin
      case TComponent(Sender).Tag of
      1: QRPreview.PageNumber := 1;
      2: QRPreview.PageNumber := QRPreview.PageNumber - 1;
      3: QRPreview.PageNumber := QRPreview.PageNumber + 1;
      4: QRPreview.PageNumber := QRPrinter.PageCount;
      else Exit; end;  UpdateInfo;
    end;procedure TfmPreview.PrintButtonClick(Sender: TObject);
    begin
      if QRPrinter.Master = nil then
        QRPrinter.Print
      else if TCustomQuickRep(QRPrinter.Master).QRPrinter.Status = mpFinished then
        QRPrinter.Print;
    end;procedure TfmPreview.ExitClick(Sender: TObject);
    begin
      Close;
    end;procedure TfmPreview.QRPreviewPageAvailable(Sender: TObject;
      PageNum: Integer);
    begin
      UpdateInfo;
      if qrprinter.status = mpFinished then
      begin
        PrintButton.Enabled := true;
      end;
    end;procedure TfmPreview.QRPreviewProgressUpdate(Sender: TObject;
      Progress: Integer);
    begin
      if Progress >= LastProgress + 5 then
      begin
        StatusBar.Panels[0].Text := IntToStr(Progress) + '%';
        LastProgress := Progress;
      end;
      // Gauge.Position := Progress;
      if (Progress = 0) or (Progress = 100) then StatusBar.Panels[0].Text := '';
    end;end.