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.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;
就可以了
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;