定义一个预览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.
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.
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.
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.
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.
然后在调用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,如需要我发给你