定义一个预览PrevForm然后在调用form中如下
var    PrevForm    : TPrevForm;
procedure TForm1.FormCreate(Sender: TObject);
begin
  PrevForm := TPrevForm.CreateForm( nil, QuickReport );
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  PrevForm.Free;
end;procedure TForm1.QuickReportPreview(Sender: TObject);
begin
  PrevForm.QRPreview.QRPrinter := TQRPrinter(Sender);
  PrevForm.Show;
end;我的PrevForm:
{*************************************************}
{*  QuickReport for Delphi                       *}
{*  Created By He Kai, ZIQ                       *}
{*                                               *}
{* used for chinese environment                  *}
{*************************************************}unit prevwin;interfaceuses
  SysUtils, Windows, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls, Gauges, StdCtrls, Spin, Buttons,
  ComCtrls, Rzlabel, quickrpt, Qrctrls, qrprntr;type
  TPrevForm = class(TForm)
    Panel1: TPanel;
    QRPreview: TQRPreview;
    Panel2: TPanel;
    button3: TSpeedButton;
    button2: TSpeedButton;
    SpinEdit2: TSpinEdit;
    Button1: TSpeedButton;
    Panel3: TPanel;
    SpeedButton1: TSpeedButton;
    sbLoad: TSpeedButton;
    sbSave: TSpeedButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Panel4: TPanel;
    Label1: TLabel;
    sbFirst: TSpeedButton;
    sbPrev: TSpeedButton;
    Label2: TLabel;
    sbLast: TSpeedButton;
    sbNext: TSpeedButton;
    SpinEdit1: TSpinEdit;
    Panel5: TPanel;
    Panel6: TPanel;
    lbMessage: TRzLabel;
    lbPages: TRzLabel;
    PrintDialog1: TPrintDialog;
    sbPrint: TSpeedButton;
    ProgressBar1: TProgressBar;
    ComboBox1: TComboBox;
    procedure SpinEdit1Change(Sender: TObject);
    procedure SpinEdit2Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure button3Click(Sender: TObject);
    procedure CommMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure SpeedButton1Click(Sender: TObject);
    procedure sbFirstClick(Sender: TObject);
    procedure sbPrevClick(Sender: TObject);
    procedure sbNextClick(Sender: TObject);
    procedure sbLastClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure sbPrintClick(Sender: TObject);
    procedure sbLoadClick(Sender: TObject);
    procedure sbSaveClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
    procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
    procedure FormActivate(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox1Enter(Sender: TObject);
  private
    { Private declarations }
    fComboChanged  : Boolean;
    fBtnClick      : Boolean;
    OldExceptEvent : TExceptionEvent;
    QuickReport    : TQuickRep;
    Procedure ExceptEvent( Sender : TObject; E : Exception );
  Private
    Procedure ResetFormFace;
  Protected
    Constructor Create( AOwner : TComponent ); Override;  public
    { Public declarations }    Constructor CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
  end;implementation{$R *.DFM}Uses Printers, Db, Common;Constructor TPrevForm.Create( AOwner : TComponent );
Begin
  Inherited Create( AOwner );
End;Constructor TPrevForm.CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
Begin
  If AQuickReport = nil Then Raise Exception.Create( '没有可用的报表!' );
  Create( AOwner );
  QuickReport := AQuickReport;
End;procedure TPrevForm.FormCreate(Sender: TObject);
begin
  fComboChanged := false;
end;procedure TPrevForm.FormDestroy(Sender: TObject);
begin
//  QRPrinter.Cleanup;
end;procedure TPrevForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  QRPreview.QRPrinter.Cleanup;
  QRPreview.QRPrinter := nil;
  Action := caHide;
end;procedure TPrevForm.FormActivate(Sender: TObject);
begin
  OldExceptEvent := Application.OnException;
  Application.OnException := ExceptEvent;
end;procedure TPrevForm.FormDeactivate(Sender: TObject);
begin
  Application.OnException := OldExceptEvent;
end;Procedure TPrevForm.ExceptEvent( Sender : TObject; E : Exception );
Begin
  MessageBeep( $FFFFFFFF );
  lbMessage.Caption := E.Message;
End;procedure TPrevForm.SpinEdit1Change(Sender: TObject);
  Var i    : Integer;
      Code : Integer;
      S    : String;
begin
   If SpinEdit1.Text = '' Then Exit;
   S := SpinEdit1.Text;
   Val( S, i, Code );
   If Code > 0 Then
     Delete( S, Length(S), 1 )
   Else If i > SpinEdit1.MaxValue Then
     Begin
      If i <= 9 Then Str( SpinEdit1.MaxValue, S )
      Else  Delete( S, Length(S), 1 );
     End;
   If S <> SpinEdit1.Text Then SpinEdit1.Text := S;   QRPreview.PageNumber:=Spinedit1.Value;   If (SpinEdit1.MaxValue<=1) Then Exit;   sbFirst.Enabled := Not ( Spinedit1.Value = 1 );
   sbPrev.Enabled := Not ( Spinedit1.Value = 1 );
   sbLast.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
   sbNext.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
end;procedure TPrevForm.sbFirstClick(Sender: TObject);
begin
  SpinEdit1.Value := 1;
end;procedure TPrevForm.sbPrevClick(Sender: TObject);
begin
  If SpinEdit1.Value > 1 Then
    SpinEdit1.Value := SpinEdit1.Value - 1;
end;procedure TPrevForm.sbNextClick(Sender: TObject);
begin
  If SpinEdit1.Value < SpinEdit1.MaxValue Then
    SpinEdit1.Value := SpinEdit1.Value + 1;
end;procedure TPrevForm.sbLastClick(Sender: TObject);
begin
  SpinEdit1.Value := SpinEdit1.MaxValue;
end;procedure TPrevForm.SpinEdit2Change(Sender: TObject);
begin
   If SpinEdit2.Text = '' Then Exit;   If ( QRPreview.Zoom <> SpinEdit2.Value ) Then
     QRPreview.Zoom := SpinEdit2.Value;
   If fBtnClick Then
     Begin
       fBtnClick := false;
       Exit;
     End;
   Button1.Down := false;
   Button2.Down := false;
   Button3.Down := false;
end;procedure TPrevForm.Button1Click(Sender: TObject);
begin
  Button1.Down := true;
  QRPreview.ZoomToFit;
  If SpinEdit2.Value=QRPreview.Zoom Then Exit;
  fBtnClick := true;
  SpinEdit2.Value:=QRPreview.Zoom;
end;procedure TPrevForm.Button2Click(Sender: TObject);
begin
  Button2.Down := true;
  QRPreview.ZoomToWidth;
  If SpinEdit2.Value=QRPreview.Zoom Then Exit;
  fBtnClick := true;
  SpinEdit2.Value:=QRPreview.Zoom;
end;procedure TPrevForm.button3Click(Sender: TObject);
begin
  Button3.Down := true;
  QRPreview.Zoom := 100;
  If SpinEdit2.Value=QRPreview.Zoom Then Exit;
  fBtnClick := true;
  SpinEdit2.Value := 100;
end;procedure TPrevForm.CommMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  If ( (Sender As TControl).Hint <> '' )  Then
    lbMessage.Caption := GetLongHint((Sender As TControl).Hint)
  Else
    lbMessage.Caption := '';
end;procedure TPrevForm.sbPrintClick(Sender: TObject);
begin
  If QuickReport <> nil Then
    Begin
      PrintDialog1.MaxPage := QRPreview.QRPrinter.PageCount;
      PrintDialog1.MinPage := 1;
      PrintDialog1.ToPage := QRPreview.QRPrinter.PageCount;
      PrintDialog1.FromPage := 1;
      If Not PrintDialog1.Execute Then Exit;
      With QuickReport.PrinterSettings Do
        Begin
          Copies := PrintDialog1.Copies;
          Duplex := PrintDialog1.Collate;
          Case PrintDialog1.PrintRange Of
            prAllPages  : Begin FirstPage := 0; LastPage := 0; End;
            prSelection : Begin FirstPage := QRPreview.PageNumber;
                                LastPage  := QRPreview.PageNumber;
                          End;
            prPageNums  : Begin FirstPage := PrintDialog1.FromPage;
                                LastPage := PrintDialog1.ToPage;
                          End;
          End;
          ApplySettings( QRPrinter );
          ApplySettings( QRPreview.QRPrinter );
        End;
    End;
  QRPreview.QRPrinter.Print;
end;procedure TPrevForm.sbLoadClick(Sender: TObject);
begin
  If Not OpenDialog1.Execute Then Exit;
  If ( QuickReport <> nil ) Then
    Case cn_MessageDlg( '是否保存当前的报表内容?', mtConfirmation,
           mbYesNoCancel, 0 ) Of
      mrCancel : Exit;
      mrYes     : Begin
                   If Not SaveDialog1.Execute Then Exit;
                   Hourglass( false, true );
                   Try
                     QRPreview.QRPrinter.Save( SaveDialog1.FileName );
                   Except
                     Hourglass( false, false );
                     cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                         mtError, [mbOK], 0 );
                   End;
                   Hourglass( false, false );
                 End;
    End;
  Hourglass( false, true );
  Try
    QRPreview.QRPrinter.Cleanup;
    QRPreview.QRPrinter := nil;
    QuickReport.QRPrinter.Load( OpenDialog1.FileName );
    QRPreview.QRPrinter := QuickReport.QRPrinter;
  Except
    Hourglass( false, false );
    cn_MessageDlg( '该文件不是合法的QuickReport文件,或已被破坏!' ,
                    mtError, [mbOK], 0 );
  End;
  Hourglass( false, false );
//  QRPreview.Refresh;
end;procedure TPrevForm.sbSaveClick(Sender: TObject);
begin
  If Not SaveDialog1.Execute Then Exit;
  Hourglass( false, true );
  Try
    QRPreview.QRPrinter.Save( SaveDialog1.FileName );
  Except
    Hourglass( false, false );
    cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                    mtError, [mbOK], 0 );
  End;
  Hourglass( false, false );
end;procedure TPrevForm.SpeedButton1Click(Sender: TObject);
begin
  Close;
end;procedure TPrevForm.QRPreviewProgressUpdate(Sender: TObject;
  Progress: Integer);
begin
  If ( Progress <= 0 ) Then
    Begin
      ProgressBar1.Visible := false;
//      If Not QRPreview.Visible Then  QRPreview.Visible := True;
      Exit;
    End;
  If ( Progress >= 100 ) Then
    Begin
      ProgressBar1.Visible := false;
//      If Not QRPreview.Visible Then  QRPreview.Visible := True;
    End
  Else
    Begin
//      If QRPreview.Visible Then  QRPreview.Visible := false;
      If Not ProgressBar1.Visible Then ProgressBar1.Visible := true;
      ProgressBar1.Position := Progress;
    End;
end;procedure TPrevForm.QRPreviewPageAvailable(Sender: TObject;
  PageNum: Integer);
begin
  If fComboChanged Then Exit;
  If PageNum < QRPreview.QRPrinter.PageCount Then Exit;
  ResetFormFace;
end;Procedure TPrevForm.ResetFormFace;
Begin
   sbPrint.Enabled := QRPreview.QRPrinter.PrinterOK;
   SpinEdit1.MinValue:=1;
   SpinEdit1.MaxValue:=QRPreview.QRPrinter.PageCount;
   lbPages.Caption := '总共有'
     +FormatFloat( '###,###,##0',SpinEdit1.MaxValue)+'页';
   SpinEdit1.Value:=1;
   Button2.Down := true;
   fBtnClick := true;
   QRPreview.ZoomToWidth;
   SpinEdit2.Value := QRPreview.Zoom;   sbFirst.Enabled := false;
   sbPrev.Enabled := false;   SpinEdit1.Enabled := Not (SpinEdit1.MaxValue<=1);
   sbNext.Enabled := SpinEdit1.Enabled;
   sbLast.Enabled := SpinEdit1.Enabled;{   ComboBox1.Visible := (QuickReport <> nil);
   If ComboBox1.Visible Then
     If QuickReport.Page.Orientation = poPortrait Then
        ComboBox1.ItemIndex := 0
      Else
        ComboBox1.ItemIndex := 1;
}
End;procedure TPrevForm.ComboBox1Change(Sender: TObject);
begin
  If QuickReport = nil Then Exit;  If ( ComboBox1.ItemIndex = 0 ) And ( QuickReport.Page.Orientation = poPortrait ) Then Exit;
  If ( ComboBox1.ItemIndex = 1 ) And ( QuickReport.Page.Orientation = poLandScape ) Then Exit;  If ComboBox1.ItemIndex = 0 Then
    QuickReport.Page.Orientation := poPortrait
  Else
    QuickReport.Page.Orientation := poLandScape;
  Hourglass( false, true );
  fComboChanged := true;
  Try
    QRPreview.Visible := false;
    ComboBox1.Enabled := false;
//    QRPreview.QRPrinter := nil;
    Try
//      QuickReport.QRPrinter.Free;
//      QuickReport.QRPrinter := nil;
//      While Not QuickReport.Available Do Application.HandleMessage;
//      QuickReport.PrinterSettings.Orientation := QuickReport.Page.Orientation;
//      QuickReport.PrinterSettings.ApplySettings( QRPreview.QRPrinter );
      QuickReport.Prepare;
      QRPreview.QRPrinter := nil;
      QRPreview.QRPrinter := QuickReport.QRPrinter;
      ResetFormFace;
    Finally
      ComboBox1.Enabled := true;
      QRPreview.Visible := true;
    End;
  Finally
    fComboChanged := false;
    Hourglass( false, false );
  End;
end;procedure TPrevForm.ComboBox1Enter(Sender: TObject);
begin
  CommMouseMove( Sender, [], 0, 0 );
end;end.

解决方案 »

  1.   

    定义一个预览PrevForm然后在调用form中如下
    var    PrevForm    : TPrevForm;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PrevForm := TPrevForm.CreateForm( nil, QuickReport );
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      PrevForm.Free;
    end;procedure TForm1.QuickReportPreview(Sender: TObject);
    begin
      PrevForm.QRPreview.QRPrinter := TQRPrinter(Sender);
      PrevForm.Show;
    end;我的PrevForm:
    {*************************************************}
    {*  QuickReport for Delphi                       *}
    {*  Created By He Kai, ZIQ                       *}
    {*                                               *}
    {* used for chinese environment                  *}
    {*************************************************}unit prevwin;interfaceuses
      SysUtils, Windows, Classes, Graphics, Controls,
      Forms, Dialogs, ExtCtrls, Gauges, StdCtrls, Spin, Buttons,
      ComCtrls, Rzlabel, quickrpt, Qrctrls, qrprntr;type
      TPrevForm = class(TForm)
        Panel1: TPanel;
        QRPreview: TQRPreview;
        Panel2: TPanel;
        button3: TSpeedButton;
        button2: TSpeedButton;
        SpinEdit2: TSpinEdit;
        Button1: TSpeedButton;
        Panel3: TPanel;
        SpeedButton1: TSpeedButton;
        sbLoad: TSpeedButton;
        sbSave: TSpeedButton;
        SaveDialog1: TSaveDialog;
        OpenDialog1: TOpenDialog;
        Panel4: TPanel;
        Label1: TLabel;
        sbFirst: TSpeedButton;
        sbPrev: TSpeedButton;
        Label2: TLabel;
        sbLast: TSpeedButton;
        sbNext: TSpeedButton;
        SpinEdit1: TSpinEdit;
        Panel5: TPanel;
        Panel6: TPanel;
        lbMessage: TRzLabel;
        lbPages: TRzLabel;
        PrintDialog1: TPrintDialog;
        sbPrint: TSpeedButton;
        ProgressBar1: TProgressBar;
        ComboBox1: TComboBox;
        procedure SpinEdit1Change(Sender: TObject);
        procedure SpinEdit2Change(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure button3Click(Sender: TObject);
        procedure CommMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure SpeedButton1Click(Sender: TObject);
        procedure sbFirstClick(Sender: TObject);
        procedure sbPrevClick(Sender: TObject);
        procedure sbNextClick(Sender: TObject);
        procedure sbLastClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure sbPrintClick(Sender: TObject);
        procedure sbLoadClick(Sender: TObject);
        procedure sbSaveClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
        procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
        procedure FormActivate(Sender: TObject);
        procedure FormDeactivate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        procedure ComboBox1Enter(Sender: TObject);
      private
        { Private declarations }
        fComboChanged  : Boolean;
        fBtnClick      : Boolean;
        OldExceptEvent : TExceptionEvent;
        QuickReport    : TQuickRep;
        Procedure ExceptEvent( Sender : TObject; E : Exception );
      Private
        Procedure ResetFormFace;
      Protected
        Constructor Create( AOwner : TComponent ); Override;  public
        { Public declarations }    Constructor CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
      end;implementation{$R *.DFM}Uses Printers, Db, Common;Constructor TPrevForm.Create( AOwner : TComponent );
    Begin
      Inherited Create( AOwner );
    End;Constructor TPrevForm.CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
    Begin
      If AQuickReport = nil Then Raise Exception.Create( '没有可用的报表!' );
      Create( AOwner );
      QuickReport := AQuickReport;
    End;procedure TPrevForm.FormCreate(Sender: TObject);
    begin
      fComboChanged := false;
    end;procedure TPrevForm.FormDestroy(Sender: TObject);
    begin
    //  QRPrinter.Cleanup;
    end;procedure TPrevForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      QRPreview.QRPrinter.Cleanup;
      QRPreview.QRPrinter := nil;
      Action := caHide;
    end;procedure TPrevForm.FormActivate(Sender: TObject);
    begin
      OldExceptEvent := Application.OnException;
      Application.OnException := ExceptEvent;
    end;procedure TPrevForm.FormDeactivate(Sender: TObject);
    begin
      Application.OnException := OldExceptEvent;
    end;Procedure TPrevForm.ExceptEvent( Sender : TObject; E : Exception );
    Begin
      MessageBeep( $FFFFFFFF );
      lbMessage.Caption := E.Message;
    End;procedure TPrevForm.SpinEdit1Change(Sender: TObject);
      Var i    : Integer;
          Code : Integer;
          S    : String;
    begin
       If SpinEdit1.Text = '' Then Exit;
       S := SpinEdit1.Text;
       Val( S, i, Code );
       If Code > 0 Then
         Delete( S, Length(S), 1 )
       Else If i > SpinEdit1.MaxValue Then
         Begin
          If i <= 9 Then Str( SpinEdit1.MaxValue, S )
          Else  Delete( S, Length(S), 1 );
         End;
       If S <> SpinEdit1.Text Then SpinEdit1.Text := S;   QRPreview.PageNumber:=Spinedit1.Value;   If (SpinEdit1.MaxValue<=1) Then Exit;   sbFirst.Enabled := Not ( Spinedit1.Value = 1 );
       sbPrev.Enabled := Not ( Spinedit1.Value = 1 );
       sbLast.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
       sbNext.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
    end;procedure TPrevForm.sbFirstClick(Sender: TObject);
    begin
      SpinEdit1.Value := 1;
    end;procedure TPrevForm.sbPrevClick(Sender: TObject);
    begin
      If SpinEdit1.Value > 1 Then
        SpinEdit1.Value := SpinEdit1.Value - 1;
    end;procedure TPrevForm.sbNextClick(Sender: TObject);
    begin
      If SpinEdit1.Value < SpinEdit1.MaxValue Then
        SpinEdit1.Value := SpinEdit1.Value + 1;
    end;procedure TPrevForm.sbLastClick(Sender: TObject);
    begin
      SpinEdit1.Value := SpinEdit1.MaxValue;
    end;procedure TPrevForm.SpinEdit2Change(Sender: TObject);
    begin
       If SpinEdit2.Text = '' Then Exit;   If ( QRPreview.Zoom <> SpinEdit2.Value ) Then
         QRPreview.Zoom := SpinEdit2.Value;
       If fBtnClick Then
         Begin
           fBtnClick := false;
           Exit;
         End;
       Button1.Down := false;
       Button2.Down := false;
       Button3.Down := false;
    end;procedure TPrevForm.Button1Click(Sender: TObject);
    begin
      Button1.Down := true;
      QRPreview.ZoomToFit;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.Button2Click(Sender: TObject);
    begin
      Button2.Down := true;
      QRPreview.ZoomToWidth;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.button3Click(Sender: TObject);
    begin
      Button3.Down := true;
      QRPreview.Zoom := 100;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value := 100;
    end;procedure TPrevForm.CommMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      If ( (Sender As TControl).Hint <> '' )  Then
        lbMessage.Caption := GetLongHint((Sender As TControl).Hint)
      Else
        lbMessage.Caption := '';
    end;procedure TPrevForm.sbPrintClick(Sender: TObject);
    begin
      If QuickReport <> nil Then
        Begin
          PrintDialog1.MaxPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.MinPage := 1;
          PrintDialog1.ToPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.FromPage := 1;
          If Not PrintDialog1.Execute Then Exit;
          With QuickReport.PrinterSettings Do
            Begin
              Copies := PrintDialog1.Copies;
              Duplex := PrintDialog1.Collate;
              Case PrintDialog1.PrintRange Of
                prAllPages  : Begin FirstPage := 0; LastPage := 0; End;
                prSelection : Begin FirstPage := QRPreview.PageNumber;
                                    LastPage  := QRPreview.PageNumber;
                              End;
                prPageNums  : Begin FirstPage := PrintDialog1.FromPage;
                                    LastPage := PrintDialog1.ToPage;
                              End;
              End;
              ApplySettings( QRPrinter );
              ApplySettings( QRPreview.QRPrinter );
            End;
        End;
      QRPreview.QRPrinter.Print;
    end;procedure TPrevForm.sbLoadClick(Sender: TObject);
    begin
      If Not OpenDialog1.Execute Then Exit;
      If ( QuickReport <> nil ) Then
        Case cn_MessageDlg( '是否保存当前的报表内容?', mtConfirmation,
               mbYesNoCancel, 0 ) Of
          mrCancel : Exit;
          mrYes     : Begin
                       If Not SaveDialog1.Execute Then Exit;
                       Hourglass( false, true );
                       Try
                         QRPreview.QRPrinter.Save( SaveDialog1.FileName );
                       Except
                         Hourglass( false, false );
                         cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                             mtError, [mbOK], 0 );
                       End;
                       Hourglass( false, false );
                     End;
        End;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Cleanup;
        QRPreview.QRPrinter := nil;
        QuickReport.QRPrinter.Load( OpenDialog1.FileName );
        QRPreview.QRPrinter := QuickReport.QRPrinter;
      Except
        Hourglass( false, false );
        cn_MessageDlg( '该文件不是合法的QuickReport文件,或已被破坏!' ,
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    //  QRPreview.Refresh;
    end;procedure TPrevForm.sbSaveClick(Sender: TObject);
    begin
      If Not SaveDialog1.Execute Then Exit;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Save( SaveDialog1.FileName );
      Except
        Hourglass( false, false );
        cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    end;procedure TPrevForm.SpeedButton1Click(Sender: TObject);
    begin
      Close;
    end;procedure TPrevForm.QRPreviewProgressUpdate(Sender: TObject;
      Progress: Integer);
    begin
      If ( Progress <= 0 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
          Exit;
        End;
      If ( Progress >= 100 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
        End
      Else
        Begin
    //      If QRPreview.Visible Then  QRPreview.Visible := false;
          If Not ProgressBar1.Visible Then ProgressBar1.Visible := true;
          ProgressBar1.Position := Progress;
        End;
    end;procedure TPrevForm.QRPreviewPageAvailable(Sender: TObject;
      PageNum: Integer);
    begin
      If fComboChanged Then Exit;
      If PageNum < QRPreview.QRPrinter.PageCount Then Exit;
      ResetFormFace;
    end;Procedure TPrevForm.ResetFormFace;
    Begin
       sbPrint.Enabled := QRPreview.QRPrinter.PrinterOK;
       SpinEdit1.MinValue:=1;
       SpinEdit1.MaxValue:=QRPreview.QRPrinter.PageCount;
       lbPages.Caption := '总共有'
         +FormatFloat( '###,###,##0',SpinEdit1.MaxValue)+'页';
       SpinEdit1.Value:=1;
       Button2.Down := true;
       fBtnClick := true;
       QRPreview.ZoomToWidth;
       SpinEdit2.Value := QRPreview.Zoom;   sbFirst.Enabled := false;
       sbPrev.Enabled := false;   SpinEdit1.Enabled := Not (SpinEdit1.MaxValue<=1);
       sbNext.Enabled := SpinEdit1.Enabled;
       sbLast.Enabled := SpinEdit1.Enabled;{   ComboBox1.Visible := (QuickReport <> nil);
       If ComboBox1.Visible Then
         If QuickReport.Page.Orientation = poPortrait Then
            ComboBox1.ItemIndex := 0
          Else
            ComboBox1.ItemIndex := 1;
    }
    End;procedure TPrevForm.ComboBox1Change(Sender: TObject);
    begin
      If QuickReport = nil Then Exit;  If ( ComboBox1.ItemIndex = 0 ) And ( QuickReport.Page.Orientation = poPortrait ) Then Exit;
      If ( ComboBox1.ItemIndex = 1 ) And ( QuickReport.Page.Orientation = poLandScape ) Then Exit;  If ComboBox1.ItemIndex = 0 Then
        QuickReport.Page.Orientation := poPortrait
      Else
        QuickReport.Page.Orientation := poLandScape;
      Hourglass( false, true );
      fComboChanged := true;
      Try
        QRPreview.Visible := false;
        ComboBox1.Enabled := false;
    //    QRPreview.QRPrinter := nil;
        Try
    //      QuickReport.QRPrinter.Free;
    //      QuickReport.QRPrinter := nil;
    //      While Not QuickReport.Available Do Application.HandleMessage;
    //      QuickReport.PrinterSettings.Orientation := QuickReport.Page.Orientation;
    //      QuickReport.PrinterSettings.ApplySettings( QRPreview.QRPrinter );
          QuickReport.Prepare;
          QRPreview.QRPrinter := nil;
          QRPreview.QRPrinter := QuickReport.QRPrinter;
          ResetFormFace;
        Finally
          ComboBox1.Enabled := true;
          QRPreview.Visible := true;
        End;
      Finally
        fComboChanged := false;
        Hourglass( false, false );
      End;
    end;procedure TPrevForm.ComboBox1Enter(Sender: TObject);
    begin
      CommMouseMove( Sender, [], 0, 0 );
    end;end.
      

  2.   

    定义一个预览PrevForm然后在调用form中如下
    var    PrevForm    : TPrevForm;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PrevForm := TPrevForm.CreateForm( nil, QuickReport );
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      PrevForm.Free;
    end;procedure TForm1.QuickReportPreview(Sender: TObject);
    begin
      PrevForm.QRPreview.QRPrinter := TQRPrinter(Sender);
      PrevForm.Show;
    end;我的PrevForm:
    {*************************************************}
    {*  QuickReport for Delphi                       *}
    {*  Created By He Kai, ZIQ                       *}
    {*                                               *}
    {* used for chinese environment                  *}
    {*************************************************}unit prevwin;interfaceuses
      SysUtils, Windows, Classes, Graphics, Controls,
      Forms, Dialogs, ExtCtrls, Gauges, StdCtrls, Spin, Buttons,
      ComCtrls, Rzlabel, quickrpt, Qrctrls, qrprntr;type
      TPrevForm = class(TForm)
        Panel1: TPanel;
        QRPreview: TQRPreview;
        Panel2: TPanel;
        button3: TSpeedButton;
        button2: TSpeedButton;
        SpinEdit2: TSpinEdit;
        Button1: TSpeedButton;
        Panel3: TPanel;
        SpeedButton1: TSpeedButton;
        sbLoad: TSpeedButton;
        sbSave: TSpeedButton;
        SaveDialog1: TSaveDialog;
        OpenDialog1: TOpenDialog;
        Panel4: TPanel;
        Label1: TLabel;
        sbFirst: TSpeedButton;
        sbPrev: TSpeedButton;
        Label2: TLabel;
        sbLast: TSpeedButton;
        sbNext: TSpeedButton;
        SpinEdit1: TSpinEdit;
        Panel5: TPanel;
        Panel6: TPanel;
        lbMessage: TRzLabel;
        lbPages: TRzLabel;
        PrintDialog1: TPrintDialog;
        sbPrint: TSpeedButton;
        ProgressBar1: TProgressBar;
        ComboBox1: TComboBox;
        procedure SpinEdit1Change(Sender: TObject);
        procedure SpinEdit2Change(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure button3Click(Sender: TObject);
        procedure CommMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure SpeedButton1Click(Sender: TObject);
        procedure sbFirstClick(Sender: TObject);
        procedure sbPrevClick(Sender: TObject);
        procedure sbNextClick(Sender: TObject);
        procedure sbLastClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure sbPrintClick(Sender: TObject);
        procedure sbLoadClick(Sender: TObject);
        procedure sbSaveClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
        procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
        procedure FormActivate(Sender: TObject);
        procedure FormDeactivate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        procedure ComboBox1Enter(Sender: TObject);
      private
        { Private declarations }
        fComboChanged  : Boolean;
        fBtnClick      : Boolean;
        OldExceptEvent : TExceptionEvent;
        QuickReport    : TQuickRep;
        Procedure ExceptEvent( Sender : TObject; E : Exception );
      Private
        Procedure ResetFormFace;
      Protected
        Constructor Create( AOwner : TComponent ); Override;  public
        { Public declarations }    Constructor CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
      end;implementation{$R *.DFM}Uses Printers, Db, Common;Constructor TPrevForm.Create( AOwner : TComponent );
    Begin
      Inherited Create( AOwner );
    End;Constructor TPrevForm.CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
    Begin
      If AQuickReport = nil Then Raise Exception.Create( '没有可用的报表!' );
      Create( AOwner );
      QuickReport := AQuickReport;
    End;procedure TPrevForm.FormCreate(Sender: TObject);
    begin
      fComboChanged := false;
    end;procedure TPrevForm.FormDestroy(Sender: TObject);
    begin
    //  QRPrinter.Cleanup;
    end;procedure TPrevForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      QRPreview.QRPrinter.Cleanup;
      QRPreview.QRPrinter := nil;
      Action := caHide;
    end;procedure TPrevForm.FormActivate(Sender: TObject);
    begin
      OldExceptEvent := Application.OnException;
      Application.OnException := ExceptEvent;
    end;procedure TPrevForm.FormDeactivate(Sender: TObject);
    begin
      Application.OnException := OldExceptEvent;
    end;Procedure TPrevForm.ExceptEvent( Sender : TObject; E : Exception );
    Begin
      MessageBeep( $FFFFFFFF );
      lbMessage.Caption := E.Message;
    End;procedure TPrevForm.SpinEdit1Change(Sender: TObject);
      Var i    : Integer;
          Code : Integer;
          S    : String;
    begin
       If SpinEdit1.Text = '' Then Exit;
       S := SpinEdit1.Text;
       Val( S, i, Code );
       If Code > 0 Then
         Delete( S, Length(S), 1 )
       Else If i > SpinEdit1.MaxValue Then
         Begin
          If i <= 9 Then Str( SpinEdit1.MaxValue, S )
          Else  Delete( S, Length(S), 1 );
         End;
       If S <> SpinEdit1.Text Then SpinEdit1.Text := S;   QRPreview.PageNumber:=Spinedit1.Value;   If (SpinEdit1.MaxValue<=1) Then Exit;   sbFirst.Enabled := Not ( Spinedit1.Value = 1 );
       sbPrev.Enabled := Not ( Spinedit1.Value = 1 );
       sbLast.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
       sbNext.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
    end;procedure TPrevForm.sbFirstClick(Sender: TObject);
    begin
      SpinEdit1.Value := 1;
    end;procedure TPrevForm.sbPrevClick(Sender: TObject);
    begin
      If SpinEdit1.Value > 1 Then
        SpinEdit1.Value := SpinEdit1.Value - 1;
    end;procedure TPrevForm.sbNextClick(Sender: TObject);
    begin
      If SpinEdit1.Value < SpinEdit1.MaxValue Then
        SpinEdit1.Value := SpinEdit1.Value + 1;
    end;procedure TPrevForm.sbLastClick(Sender: TObject);
    begin
      SpinEdit1.Value := SpinEdit1.MaxValue;
    end;procedure TPrevForm.SpinEdit2Change(Sender: TObject);
    begin
       If SpinEdit2.Text = '' Then Exit;   If ( QRPreview.Zoom <> SpinEdit2.Value ) Then
         QRPreview.Zoom := SpinEdit2.Value;
       If fBtnClick Then
         Begin
           fBtnClick := false;
           Exit;
         End;
       Button1.Down := false;
       Button2.Down := false;
       Button3.Down := false;
    end;procedure TPrevForm.Button1Click(Sender: TObject);
    begin
      Button1.Down := true;
      QRPreview.ZoomToFit;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.Button2Click(Sender: TObject);
    begin
      Button2.Down := true;
      QRPreview.ZoomToWidth;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.button3Click(Sender: TObject);
    begin
      Button3.Down := true;
      QRPreview.Zoom := 100;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value := 100;
    end;procedure TPrevForm.CommMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      If ( (Sender As TControl).Hint <> '' )  Then
        lbMessage.Caption := GetLongHint((Sender As TControl).Hint)
      Else
        lbMessage.Caption := '';
    end;procedure TPrevForm.sbPrintClick(Sender: TObject);
    begin
      If QuickReport <> nil Then
        Begin
          PrintDialog1.MaxPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.MinPage := 1;
          PrintDialog1.ToPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.FromPage := 1;
          If Not PrintDialog1.Execute Then Exit;
          With QuickReport.PrinterSettings Do
            Begin
              Copies := PrintDialog1.Copies;
              Duplex := PrintDialog1.Collate;
              Case PrintDialog1.PrintRange Of
                prAllPages  : Begin FirstPage := 0; LastPage := 0; End;
                prSelection : Begin FirstPage := QRPreview.PageNumber;
                                    LastPage  := QRPreview.PageNumber;
                              End;
                prPageNums  : Begin FirstPage := PrintDialog1.FromPage;
                                    LastPage := PrintDialog1.ToPage;
                              End;
              End;
              ApplySettings( QRPrinter );
              ApplySettings( QRPreview.QRPrinter );
            End;
        End;
      QRPreview.QRPrinter.Print;
    end;procedure TPrevForm.sbLoadClick(Sender: TObject);
    begin
      If Not OpenDialog1.Execute Then Exit;
      If ( QuickReport <> nil ) Then
        Case cn_MessageDlg( '是否保存当前的报表内容?', mtConfirmation,
               mbYesNoCancel, 0 ) Of
          mrCancel : Exit;
          mrYes     : Begin
                       If Not SaveDialog1.Execute Then Exit;
                       Hourglass( false, true );
                       Try
                         QRPreview.QRPrinter.Save( SaveDialog1.FileName );
                       Except
                         Hourglass( false, false );
                         cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                             mtError, [mbOK], 0 );
                       End;
                       Hourglass( false, false );
                     End;
        End;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Cleanup;
        QRPreview.QRPrinter := nil;
        QuickReport.QRPrinter.Load( OpenDialog1.FileName );
        QRPreview.QRPrinter := QuickReport.QRPrinter;
      Except
        Hourglass( false, false );
        cn_MessageDlg( '该文件不是合法的QuickReport文件,或已被破坏!' ,
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    //  QRPreview.Refresh;
    end;procedure TPrevForm.sbSaveClick(Sender: TObject);
    begin
      If Not SaveDialog1.Execute Then Exit;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Save( SaveDialog1.FileName );
      Except
        Hourglass( false, false );
        cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    end;procedure TPrevForm.SpeedButton1Click(Sender: TObject);
    begin
      Close;
    end;procedure TPrevForm.QRPreviewProgressUpdate(Sender: TObject;
      Progress: Integer);
    begin
      If ( Progress <= 0 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
          Exit;
        End;
      If ( Progress >= 100 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
        End
      Else
        Begin
    //      If QRPreview.Visible Then  QRPreview.Visible := false;
          If Not ProgressBar1.Visible Then ProgressBar1.Visible := true;
          ProgressBar1.Position := Progress;
        End;
    end;procedure TPrevForm.QRPreviewPageAvailable(Sender: TObject;
      PageNum: Integer);
    begin
      If fComboChanged Then Exit;
      If PageNum < QRPreview.QRPrinter.PageCount Then Exit;
      ResetFormFace;
    end;Procedure TPrevForm.ResetFormFace;
    Begin
       sbPrint.Enabled := QRPreview.QRPrinter.PrinterOK;
       SpinEdit1.MinValue:=1;
       SpinEdit1.MaxValue:=QRPreview.QRPrinter.PageCount;
       lbPages.Caption := '总共有'
         +FormatFloat( '###,###,##0',SpinEdit1.MaxValue)+'页';
       SpinEdit1.Value:=1;
       Button2.Down := true;
       fBtnClick := true;
       QRPreview.ZoomToWidth;
       SpinEdit2.Value := QRPreview.Zoom;   sbFirst.Enabled := false;
       sbPrev.Enabled := false;   SpinEdit1.Enabled := Not (SpinEdit1.MaxValue<=1);
       sbNext.Enabled := SpinEdit1.Enabled;
       sbLast.Enabled := SpinEdit1.Enabled;{   ComboBox1.Visible := (QuickReport <> nil);
       If ComboBox1.Visible Then
         If QuickReport.Page.Orientation = poPortrait Then
            ComboBox1.ItemIndex := 0
          Else
            ComboBox1.ItemIndex := 1;
    }
    End;procedure TPrevForm.ComboBox1Change(Sender: TObject);
    begin
      If QuickReport = nil Then Exit;  If ( ComboBox1.ItemIndex = 0 ) And ( QuickReport.Page.Orientation = poPortrait ) Then Exit;
      If ( ComboBox1.ItemIndex = 1 ) And ( QuickReport.Page.Orientation = poLandScape ) Then Exit;  If ComboBox1.ItemIndex = 0 Then
        QuickReport.Page.Orientation := poPortrait
      Else
        QuickReport.Page.Orientation := poLandScape;
      Hourglass( false, true );
      fComboChanged := true;
      Try
        QRPreview.Visible := false;
        ComboBox1.Enabled := false;
    //    QRPreview.QRPrinter := nil;
        Try
    //      QuickReport.QRPrinter.Free;
    //      QuickReport.QRPrinter := nil;
    //      While Not QuickReport.Available Do Application.HandleMessage;
    //      QuickReport.PrinterSettings.Orientation := QuickReport.Page.Orientation;
    //      QuickReport.PrinterSettings.ApplySettings( QRPreview.QRPrinter );
          QuickReport.Prepare;
          QRPreview.QRPrinter := nil;
          QRPreview.QRPrinter := QuickReport.QRPrinter;
          ResetFormFace;
        Finally
          ComboBox1.Enabled := true;
          QRPreview.Visible := true;
        End;
      Finally
        fComboChanged := false;
        Hourglass( false, false );
      End;
    end;procedure TPrevForm.ComboBox1Enter(Sender: TObject);
    begin
      CommMouseMove( Sender, [], 0, 0 );
    end;end.
      

  3.   

    定义一个预览PrevForm然后在调用form中如下
    var    PrevForm    : TPrevForm;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PrevForm := TPrevForm.CreateForm( nil, QuickReport );
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      PrevForm.Free;
    end;procedure TForm1.QuickReportPreview(Sender: TObject);
    begin
      PrevForm.QRPreview.QRPrinter := TQRPrinter(Sender);
      PrevForm.Show;
    end;我的PrevForm:
    {*************************************************}
    {*  QuickReport for Delphi                       *}
    {*  Created By He Kai, ZIQ                       *}
    {*                                               *}
    {* used for chinese environment                  *}
    {*************************************************}unit prevwin;interfaceuses
      SysUtils, Windows, Classes, Graphics, Controls,
      Forms, Dialogs, ExtCtrls, Gauges, StdCtrls, Spin, Buttons,
      ComCtrls, Rzlabel, quickrpt, Qrctrls, qrprntr;type
      TPrevForm = class(TForm)
        Panel1: TPanel;
        QRPreview: TQRPreview;
        Panel2: TPanel;
        button3: TSpeedButton;
        button2: TSpeedButton;
        SpinEdit2: TSpinEdit;
        Button1: TSpeedButton;
        Panel3: TPanel;
        SpeedButton1: TSpeedButton;
        sbLoad: TSpeedButton;
        sbSave: TSpeedButton;
        SaveDialog1: TSaveDialog;
        OpenDialog1: TOpenDialog;
        Panel4: TPanel;
        Label1: TLabel;
        sbFirst: TSpeedButton;
        sbPrev: TSpeedButton;
        Label2: TLabel;
        sbLast: TSpeedButton;
        sbNext: TSpeedButton;
        SpinEdit1: TSpinEdit;
        Panel5: TPanel;
        Panel6: TPanel;
        lbMessage: TRzLabel;
        lbPages: TRzLabel;
        PrintDialog1: TPrintDialog;
        sbPrint: TSpeedButton;
        ProgressBar1: TProgressBar;
        ComboBox1: TComboBox;
        procedure SpinEdit1Change(Sender: TObject);
        procedure SpinEdit2Change(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure button3Click(Sender: TObject);
        procedure CommMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure SpeedButton1Click(Sender: TObject);
        procedure sbFirstClick(Sender: TObject);
        procedure sbPrevClick(Sender: TObject);
        procedure sbNextClick(Sender: TObject);
        procedure sbLastClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure sbPrintClick(Sender: TObject);
        procedure sbLoadClick(Sender: TObject);
        procedure sbSaveClick(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
        procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
        procedure FormActivate(Sender: TObject);
        procedure FormDeactivate(Sender: TObject);
        procedure ComboBox1Change(Sender: TObject);
        procedure ComboBox1Enter(Sender: TObject);
      private
        { Private declarations }
        fComboChanged  : Boolean;
        fBtnClick      : Boolean;
        OldExceptEvent : TExceptionEvent;
        QuickReport    : TQuickRep;
        Procedure ExceptEvent( Sender : TObject; E : Exception );
      Private
        Procedure ResetFormFace;
      Protected
        Constructor Create( AOwner : TComponent ); Override;  public
        { Public declarations }    Constructor CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
      end;implementation{$R *.DFM}Uses Printers, Db, Common;Constructor TPrevForm.Create( AOwner : TComponent );
    Begin
      Inherited Create( AOwner );
    End;Constructor TPrevForm.CreateForm( AOwner : TComponent; AQuickReport : TQuickRep );
    Begin
      If AQuickReport = nil Then Raise Exception.Create( '没有可用的报表!' );
      Create( AOwner );
      QuickReport := AQuickReport;
    End;procedure TPrevForm.FormCreate(Sender: TObject);
    begin
      fComboChanged := false;
    end;procedure TPrevForm.FormDestroy(Sender: TObject);
    begin
    //  QRPrinter.Cleanup;
    end;procedure TPrevForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      QRPreview.QRPrinter.Cleanup;
      QRPreview.QRPrinter := nil;
      Action := caHide;
    end;procedure TPrevForm.FormActivate(Sender: TObject);
    begin
      OldExceptEvent := Application.OnException;
      Application.OnException := ExceptEvent;
    end;procedure TPrevForm.FormDeactivate(Sender: TObject);
    begin
      Application.OnException := OldExceptEvent;
    end;Procedure TPrevForm.ExceptEvent( Sender : TObject; E : Exception );
    Begin
      MessageBeep( $FFFFFFFF );
      lbMessage.Caption := E.Message;
    End;procedure TPrevForm.SpinEdit1Change(Sender: TObject);
      Var i    : Integer;
          Code : Integer;
          S    : String;
    begin
       If SpinEdit1.Text = '' Then Exit;
       S := SpinEdit1.Text;
       Val( S, i, Code );
       If Code > 0 Then
         Delete( S, Length(S), 1 )
       Else If i > SpinEdit1.MaxValue Then
         Begin
          If i <= 9 Then Str( SpinEdit1.MaxValue, S )
          Else  Delete( S, Length(S), 1 );
         End;
       If S <> SpinEdit1.Text Then SpinEdit1.Text := S;   QRPreview.PageNumber:=Spinedit1.Value;   If (SpinEdit1.MaxValue<=1) Then Exit;   sbFirst.Enabled := Not ( Spinedit1.Value = 1 );
       sbPrev.Enabled := Not ( Spinedit1.Value = 1 );
       sbLast.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
       sbNext.Enabled := Not ( Spinedit1.Value = SpinEdit1.MaxValue );
    end;procedure TPrevForm.sbFirstClick(Sender: TObject);
    begin
      SpinEdit1.Value := 1;
    end;procedure TPrevForm.sbPrevClick(Sender: TObject);
    begin
      If SpinEdit1.Value > 1 Then
        SpinEdit1.Value := SpinEdit1.Value - 1;
    end;procedure TPrevForm.sbNextClick(Sender: TObject);
    begin
      If SpinEdit1.Value < SpinEdit1.MaxValue Then
        SpinEdit1.Value := SpinEdit1.Value + 1;
    end;procedure TPrevForm.sbLastClick(Sender: TObject);
    begin
      SpinEdit1.Value := SpinEdit1.MaxValue;
    end;procedure TPrevForm.SpinEdit2Change(Sender: TObject);
    begin
       If SpinEdit2.Text = '' Then Exit;   If ( QRPreview.Zoom <> SpinEdit2.Value ) Then
         QRPreview.Zoom := SpinEdit2.Value;
       If fBtnClick Then
         Begin
           fBtnClick := false;
           Exit;
         End;
       Button1.Down := false;
       Button2.Down := false;
       Button3.Down := false;
    end;procedure TPrevForm.Button1Click(Sender: TObject);
    begin
      Button1.Down := true;
      QRPreview.ZoomToFit;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.Button2Click(Sender: TObject);
    begin
      Button2.Down := true;
      QRPreview.ZoomToWidth;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value:=QRPreview.Zoom;
    end;procedure TPrevForm.button3Click(Sender: TObject);
    begin
      Button3.Down := true;
      QRPreview.Zoom := 100;
      If SpinEdit2.Value=QRPreview.Zoom Then Exit;
      fBtnClick := true;
      SpinEdit2.Value := 100;
    end;procedure TPrevForm.CommMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      If ( (Sender As TControl).Hint <> '' )  Then
        lbMessage.Caption := GetLongHint((Sender As TControl).Hint)
      Else
        lbMessage.Caption := '';
    end;procedure TPrevForm.sbPrintClick(Sender: TObject);
    begin
      If QuickReport <> nil Then
        Begin
          PrintDialog1.MaxPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.MinPage := 1;
          PrintDialog1.ToPage := QRPreview.QRPrinter.PageCount;
          PrintDialog1.FromPage := 1;
          If Not PrintDialog1.Execute Then Exit;
          With QuickReport.PrinterSettings Do
            Begin
              Copies := PrintDialog1.Copies;
              Duplex := PrintDialog1.Collate;
              Case PrintDialog1.PrintRange Of
                prAllPages  : Begin FirstPage := 0; LastPage := 0; End;
                prSelection : Begin FirstPage := QRPreview.PageNumber;
                                    LastPage  := QRPreview.PageNumber;
                              End;
                prPageNums  : Begin FirstPage := PrintDialog1.FromPage;
                                    LastPage := PrintDialog1.ToPage;
                              End;
              End;
              ApplySettings( QRPrinter );
              ApplySettings( QRPreview.QRPrinter );
            End;
        End;
      QRPreview.QRPrinter.Print;
    end;procedure TPrevForm.sbLoadClick(Sender: TObject);
    begin
      If Not OpenDialog1.Execute Then Exit;
      If ( QuickReport <> nil ) Then
        Case cn_MessageDlg( '是否保存当前的报表内容?', mtConfirmation,
               mbYesNoCancel, 0 ) Of
          mrCancel : Exit;
          mrYes     : Begin
                       If Not SaveDialog1.Execute Then Exit;
                       Hourglass( false, true );
                       Try
                         QRPreview.QRPrinter.Save( SaveDialog1.FileName );
                       Except
                         Hourglass( false, false );
                         cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                             mtError, [mbOK], 0 );
                       End;
                       Hourglass( false, false );
                     End;
        End;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Cleanup;
        QRPreview.QRPrinter := nil;
        QuickReport.QRPrinter.Load( OpenDialog1.FileName );
        QRPreview.QRPrinter := QuickReport.QRPrinter;
      Except
        Hourglass( false, false );
        cn_MessageDlg( '该文件不是合法的QuickReport文件,或已被破坏!' ,
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    //  QRPreview.Refresh;
    end;procedure TPrevForm.sbSaveClick(Sender: TObject);
    begin
      If Not SaveDialog1.Execute Then Exit;
      Hourglass( false, true );
      Try
        QRPreview.QRPrinter.Save( SaveDialog1.FileName );
      Except
        Hourglass( false, false );
        cn_MessageDlg( '保存失败,可能磁盘写保护或已满!',
                        mtError, [mbOK], 0 );
      End;
      Hourglass( false, false );
    end;procedure TPrevForm.SpeedButton1Click(Sender: TObject);
    begin
      Close;
    end;procedure TPrevForm.QRPreviewProgressUpdate(Sender: TObject;
      Progress: Integer);
    begin
      If ( Progress <= 0 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
          Exit;
        End;
      If ( Progress >= 100 ) Then
        Begin
          ProgressBar1.Visible := false;
    //      If Not QRPreview.Visible Then  QRPreview.Visible := True;
        End
      Else
        Begin
    //      If QRPreview.Visible Then  QRPreview.Visible := false;
          If Not ProgressBar1.Visible Then ProgressBar1.Visible := true;
          ProgressBar1.Position := Progress;
        End;
    end;procedure TPrevForm.QRPreviewPageAvailable(Sender: TObject;
      PageNum: Integer);
    begin
      If fComboChanged Then Exit;
      If PageNum < QRPreview.QRPrinter.PageCount Then Exit;
      ResetFormFace;
    end;Procedure TPrevForm.ResetFormFace;
    Begin
       sbPrint.Enabled := QRPreview.QRPrinter.PrinterOK;
       SpinEdit1.MinValue:=1;
       SpinEdit1.MaxValue:=QRPreview.QRPrinter.PageCount;
       lbPages.Caption := '总共有'
         +FormatFloat( '###,###,##0',SpinEdit1.MaxValue)+'页';
       SpinEdit1.Value:=1;
       Button2.Down := true;
       fBtnClick := true;
       QRPreview.ZoomToWidth;
       SpinEdit2.Value := QRPreview.Zoom;   sbFirst.Enabled := false;
       sbPrev.Enabled := false;   SpinEdit1.Enabled := Not (SpinEdit1.MaxValue<=1);
       sbNext.Enabled := SpinEdit1.Enabled;
       sbLast.Enabled := SpinEdit1.Enabled;{   ComboBox1.Visible := (QuickReport <> nil);
       If ComboBox1.Visible Then
         If QuickReport.Page.Orientation = poPortrait Then
            ComboBox1.ItemIndex := 0
          Else
            ComboBox1.ItemIndex := 1;
    }
    End;procedure TPrevForm.ComboBox1Change(Sender: TObject);
    begin
      If QuickReport = nil Then Exit;  If ( ComboBox1.ItemIndex = 0 ) And ( QuickReport.Page.Orientation = poPortrait ) Then Exit;
      If ( ComboBox1.ItemIndex = 1 ) And ( QuickReport.Page.Orientation = poLandScape ) Then Exit;  If ComboBox1.ItemIndex = 0 Then
        QuickReport.Page.Orientation := poPortrait
      Else
        QuickReport.Page.Orientation := poLandScape;
      Hourglass( false, true );
      fComboChanged := true;
      Try
        QRPreview.Visible := false;
        ComboBox1.Enabled := false;
    //    QRPreview.QRPrinter := nil;
        Try
    //      QuickReport.QRPrinter.Free;
    //      QuickReport.QRPrinter := nil;
    //      While Not QuickReport.Available Do Application.HandleMessage;
    //      QuickReport.PrinterSettings.Orientation := QuickReport.Page.Orientation;
    //      QuickReport.PrinterSettings.ApplySettings( QRPreview.QRPrinter );
          QuickReport.Prepare;
          QRPreview.QRPrinter := nil;
          QRPreview.QRPrinter := QuickReport.QRPrinter;
          ResetFormFace;
        Finally
          ComboBox1.Enabled := true;
          QRPreview.Visible := true;
        End;
      Finally
        fComboChanged := false;
        Hourglass( false, false );
      End;
    end;procedure TPrevForm.ComboBox1Enter(Sender: TObject);
    begin
      CommMouseMove( Sender, [], 0, 0 );
    end;end.
      

  4.   

    你是否是指自定义QuickReport的报表预览,如是,则定义一个PrevWin,
    然后在调用form如下调用:
    var    PrevForm    : TPrevForm;
       ..........procedure THGDForm.FormCreate(Sender: TObject);
    begin
      PrevForm := TPrevForm.CreateForm( nil, QuickReport );
    end;procedure THGDForm.FormDestroy(Sender: TObject);
    begin
      PrevForm.Free;
    end;procedure THGDForm.QuickReportPreview(Sender: TObject);
    begin
      PrevForm.QRPreview.QRPrinter := TQRPrinter(Sender);
      PrevForm.Show;
    end;
    我自己开发了一个prevform,如需要我发给你
      

  5.   

    请pipai(我是屁派) 发给我原程序,谢谢![email protected]