如何在QuickRep打印结束后自动关闭预览窗口

陈祥xx 2003-07-21 02:23:08
我要在QuickRep打印结束后用程序来实现自动关闭QuickRep的预览窗口,不知可不可实现
...全文
210 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
huyalin 2003-07-22
  • 打赏
  • 举报
回复
还有
你在写SaveClick方法时,可能有几个过滤器没有
你也可以不写这个方法它可以直接保存报表文件而不作过滤
huyalin 2003-07-22
  • 打赏
  • 举报
回复
继续说:


procedure TFMyPrev.SaveClick(Sender: TObject);
var
aExportFilter: TQRExportFilter;
{$IFNDEF win32}
FileExt: string;
I: integer;
{$ENDIF}
begin
aExportFilter := nil;
with TSaveDialog.Create(Application) do
try
Title := '保存报表';
Filter := QRExportFilterLibrary.SaveDialogFilterString;
DefaultExt := cQRPDefaultExt;
if Execute then
begin
{$IFDEF win32}
if FilterIndex = 1 then
QRPrinter.Save(Filename)
else
begin
try
aExportFilter := TQRExportFilterLibraryEntry(
QRExportFilterLibrary.Filters[FilterIndex - 2]).ExportFilterClass.Create(Filename);
QRPrinter.ExportToFilter(aExportFilter);
finally
aExportFilter.Free
end
end
{$ELSE}
FileExt := ExtractFileExt(Filename);
if copy(FileExt, 1, 1) = '.' then delete(FileExt, 1, 1);
if (FileExt = '') or (FileExt = cQRPDefaultExt) then
QRPrinter.Save(Filename)
else
begin
for I := 0 to QRExportFilterLibrary.Filters.Count - 1 do
begin
if TQRExportFilterLibraryEntry(QRExportFilterLibrary.Filters[I]).Extension = FileExt then
try
aExportFilter := TQRExportFilterLibraryEntry(
QRExportFilterLibrary.Filters[I]).ExportFilterClass.Create(Filename);
QRPrinter.ExportToFilter(aExportFilter);
finally
aExportFilter.Free;
end;
end;
end;
{$ENDIF}
end;
finally
Free;
end;
end;

procedure TFMyPrev.PrintSetupClick(Sender: TObject);
begin
QRPrinter.PrintSetup;
end;

procedure TFMyPrev.LoadClick(Sender: TObject);
begin
with TOpenDialog.Create(Application) do
try
Title := '读取';
Filter := '报表文件' + ' (*.' + cQRPDefaultExt + ')|*.' + cqrpDefaultExt;
if Execute then
if FileExists(FileName) then
begin
QRPrinter.Load(Filename);
QRPreview.PageNumber := 1;
QRPreview.PreviewImage.PageNumber := 1;
UpdateInfo;
PrintSetup.Enabled := False;
Print.Enabled := true;
end
else
ShowMessage('文件不存在!');
finally
free;
end;
end;

procedure TFMyPrev.QRPreviewPageAvailable(Sender: TObject;
PageNum: Integer);
begin
UpdateInfo;
if qrprinter.status = mpFinished then
begin
PrintSetup.Enabled := true;
Print.Enabled := true;
end;
end;

procedure TFMyPrev.QRPreviewProgressUpdate(Sender: TObject;
Progress: Integer);
begin
if Progress >= LastProgress + 5 then
begin
StatusBar.Panels[0].Text := IntToStr(Progress) + '%';
LastProgress := Progress;
end;
// Gauge.Position := Progress;
if (Progress = 0) or (Progress = 100) then StatusBar.Panels[0].Text := '';
end;

procedure TFMyPrev.FormCreate(Sender: TObject);
begin
{$IFDEF win32}
HorzScrollbar.Tracking := true;
VertScrollbar.Tracking := true;
{$ENDIF}
end;

procedure TFMyPrev.TrackBar1Change(Sender: TObject);
begin
// Application.ProcessMessages;
// QRPreview.Zoom:= 100 + 10 * TrackBar1.Position;
end;

procedure TFMyPrev.ToolButton4Click(Sender: TObject);
begin
QRPreview.Zoom := QRPreview.Zoom + 10;
end;

procedure TFMyPrev.ToolButton5Click(Sender: TObject);
begin
QRPreview.Zoom := QRPreview.Zoom - 10;
end;

procedure TFMyPrev.FormShow(Sender: TObject);
begin
try
QRPreview.QRPrinter := QRPrinter;
except
close
end;
end;

end.

在你的工程中的主窗体最好是DataModle,因为是最先建立的,引用MyPreview,然后在声明以下方法:
type
MyPreview = class(TQRPreviewInterface)
public
function Show(AQRPrinter: TQRPrinter): TWinControl; override;
function ShowModal(AQRPrinter: TQRPrinter): TWinControl; override;
end;
implementation
uses MyPreview;
function MyPreview.Show(AQRPrinter: TQRPrinter): TWinControl;
begin
try
Result := TFMyPrev.CreatePreview(Application, AQRPrinter);
TFMyPrev(Result).Show;
finally
Result.Free;
end;
end;

function MyPreview.ShowModal(AQRPrinter: TQRPrinter): TWinControl;
begin
try
Result := TFMyPrev.CreatePreview(Application, AQRPrinter);
TFMyPrev(Result).ShowModal;
finally
try
Result.Free;
except
end;
end;
end;

在DM的OnCreate方法中,加入以下方法
procedure TDM.DataModuleCreate(Sender: TObject);
begin
RegisterPreviewClass(MyPreview);
end;
就可以了

你只要在MyPreview中的打印方法中增加Close就可以了
huyalin 2003-07-22
  • 打赏
  • 举报
回复
可以
要自己写一个打印预览的窗口
如果不会,请参考以下代码:
先写一个MyPreview的窗体,放入QRPreview控件,放一个ToolBar,生成几个按钮,分别为放大,缩小、打印、预览、退出等
MyPreview.Pas如下
unit MyPrev;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
QRExport, ImgList, ComCtrls, QRPrntr, ToolWin, ExtCtrls;

type
TFMyPrev = class(TForm)
StatusBar: TStatusBar;
ToolBar1: TToolBar;
ZoomFit: TToolButton;
Zoom100: TToolButton;
ZoomToWidth: TToolButton;
Separator1: TToolButton;
FirstPage: TToolButton;
PreviousPage: TToolButton;
NextPage: TToolButton;
LastPage: TToolButton;
Separator2: TToolButton;
PrintSetup: TToolButton;
Print: TToolButton;
Separator3: TToolButton;
SaveReport: TToolButton;
LoadReport: TToolButton;
Separator4: TToolButton;
Images: TImageList;
ToolButton1: TToolButton;
ExitButton: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton2: TToolButton;
QRCSVFilter1: TQRCSVFilter;
QRHTMLFilter1: TQRHTMLFilter;
QRTextFilter1: TQRTextFilter;
QRExcelFilter1: TQRExcelFilter;
QRRTFFilter1: TQRRTFFilter;
QRWMFFilter1: TQRWMFFilter;
QRPreview: TQRPreview;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ZoomToFitClick(Sender: TObject);
procedure ZoomTo100Click(Sender: TObject);
procedure ZoomToWidthClick(Sender: TObject);
procedure FirstPageClick(Sender: TObject);
procedure PrevPageClick(Sender: TObject);
procedure NextPageClick(Sender: TObject);
procedure LastPageClick(Sender: TObject);
procedure PrintClick(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure SaveClick(Sender: TObject);
procedure PrintSetupClick(Sender: TObject);
procedure LoadClick(Sender: TObject);
procedure QRPreviewPageAvailable(Sender: TObject; PageNum: Integer);
procedure QRPreviewProgressUpdate(Sender: TObject; Progress: Integer);
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure ToolButton4Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
FQRPrinter: TQRPrinter;
Gauge: TProgressBar;
LastProgress: integer;
public
constructor CreatePreview(AOwner: TComponent; aQRPrinter: TQRPrinter); virtual;
procedure Show;
procedure UpdateInfo;
property QRPrinter: TQRPrinter read FQRPrinter write FQRPrinter;
end;

implementation

uses QuickRpt;

{$R *.DFM}

constructor TFMyPrev.CreatePreview(AOwner: TComponent; aQRPrinter: TQRPrinter);
begin
inherited Create(AOwner);
QRPrinter := aQRPrinter;
WindowState := wsMaximized;
if (QRPrinter <> nil) and (QRPrinter.Title <> '') then Caption := QRPrinter.Title;
Gauge := TProgressBar.Create(Self);
Gauge.Top := 2;
Gauge.Left := 2;
Gauge.Height := 10; //
Gauge.Width := 100;
LastProgress := 0;
ZoomToWidth.Down := true;
if qrprinter.status = mpFinished then
Print.Enabled := true;
end;

procedure TFMyPrev.FormClose(Sender: TObject; var Action: TCloseAction);
begin
QRPrinter.ClosePreview(Self);
Action := caFree;
end;

procedure TFMyPrev.UpdateInfo;
begin
StatusBar.Panels[1].Text := '第 ' + IntToStr(QRPreview.PageNumber) + ' 页/共 ' + IntToStr(QRPreview.QRPrinter.PageCount) + ' 页';
end;

procedure TFMyPrev.ZoomToFitClick(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.ZoomToFit;
end;

procedure TFMyPrev.ZoomTo100Click(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.Zoom := 100;
end;

procedure TFMyPrev.ZoomToWidthClick(Sender: TObject);
begin
Application.ProcessMessages;
QRPreview.ZoomToWidth;
end;

procedure TFMyPrev.FirstPageClick(Sender: TObject);
begin
QRPreview.PageNumber := 1;
UpdateInfo;
end;

procedure TFMyPrev.PrevPageClick(Sender: TObject);
begin
QRPreview.PageNumber := QRPreview.PageNumber - 1;
UpdateInfo;
end;

procedure TFMyPrev.NextPageClick(Sender: TObject);
begin
QRPreview.PageNumber := QRPreview.PageNumber + 1;
UpdateInfo;
end;

procedure TFMyPrev.LastPageClick(Sender: TObject);
begin
QRPreview.PageNumber := QRPrinter.PageCount;
UpdateInfo;
end;

procedure TFMyPrev.PrintClick(Sender: TObject);
begin
if (QRPrinter.Master = nil) or (QRPrinter.Master is TQRCompositeWinControl) then
QRPrinter.Print
else if TCustomQuickRep(QRPrinter.Master).QRPrinter.Status <> mpBusy then QRPrinter.Print;
end;

procedure TFMyPrev.ExitClick(Sender: TObject);
begin
Close;
end;

procedure TFMyPrev.FormResize(Sender: TObject);
begin
QRPreview.UpdateZoom;
end;

procedure TFMyPrev.Show;
begin
{ QRPreview.QRPrinter.ShowingPreview:=true;}
inherited Show;
UpdateInfo;
end;

procedure TFMyPrev.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_Next: if Shift = [ssCtrl] then
LastPageClick(Self)
else
NextPageClick(Self);
VK_Prior: if Shift = [ssCtrl] then
FirstPageClick(Self)
else
PrevPageClick(Self);
VK_Home: FirstPageClick(Self);
VK_End: LastPageClick(Self);
VK_Escape: ExitClick(self)
end;
end;

陈祥xx 2003-07-22
  • 打赏
  • 举报
回复
谢谢huyalin(飞梦)的参与,不过我想知道有没可能不用引用自定义的预览窗体而直接调用QR里的某个方法或函数?

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧