📄 frxpreview.pas
字号:
{ clear find settings }
FAllowF3:= False;
FWorkspace.FEMFImagePage:=-1;
FWorkspace.FPageList.Clear;
if PreviewPages = nil then Exit;
if FZoomMode = zmManyPages then
FWorkspace.FPageList.ColumnCount:= 2 else
FWorkspace.FPageList.ColumnCount:= 1;
for i:= 0 to PageCount-1 do
begin
PageSize:= PreviewPages.PageSize[i];
FWorkspace.FPageList.AddPage(PageSize.X, PageSize.Y);
end;
end;
procedure TfrxPreview.TreeClick(Sender:TObject);
var
Node:TTreeNode;
PageN, Top:Integer;
begin
Node:= FOutline.Selected;
if Node = nil then Exit;
PageN:= Integer(Node.Data) mod $100000;
Top:= Integer(Node.Data) div $100000 * 2;
SetPosition(PageN, Top);
SetFocus;
end;
procedure TfrxPreview.InternalOnProgressStart(Sender:TfrxReport;
ProgressType:TfrxProgressType; Progress:Integer);
begin
Clear;
FRunning:= True;
if Owner is TfrxPreviewForm then
TfrxPreviewForm(Owner).UpdateControls;
end;
procedure TfrxPreview.InternalOnProgress(Sender:TfrxReport;
ProgressType:TfrxProgressType; Progress:Integer);
var
PageSize:TPoint;
begin
if Report.Engine.FinalPass then
begin
PageSize:= Report.PreviewPages.PageSize[Progress];
FWorkspace.FPageList.AddPage(PageSize.X, PageSize.Y);
end;
if Progress = 0 then
begin
FOutline.Items.Clear;
PageNo:= 1;
UpdateZoom;
if Owner is TfrxPreviewForm then
TfrxPreviewForm(Owner).CancelB.Caption:= frxResources.Get('clCancel');
FTick:= GetTickCount;
end
else if Progress = 1 then
begin
FTick:= GetTickCount-FTick;
if FTick < 5 then
FTick:= 50
else if FTick < 10 then
FTick:= 20
else
FTick:= 5;
PageNo:= 1;
UpdateZoom;
end
else if Progress mod Integer(FTick) = 0 then
begin
UpdatePageNumbers;
FWorkspace.UpdateScrollBars;
end;
Application.ProcessMessages;
end;
procedure TfrxPreview.InternalOnProgressStop(Sender:TfrxReport;
ProgressType:TfrxProgressType; Progress:Integer);
begin
FRunning:= False;
UpdatePageNumbers;
FWorkspace.UpdateScrollBars;
UpdateZoom;
UpdateOutline;
if Owner is TfrxPreviewForm then
begin
TfrxPreviewForm(Owner).CancelB.Caption:= frxResources.Get('clClose');
TfrxPreviewForm(Owner).StatusBar.Panels[1].Text:= '';
TfrxPreviewForm(Owner).UpdateControls;
end;
end;
procedure TfrxPreview.OnCancel(Sender:TObject);
begin
Report.Terminated:= True;
end;
procedure TfrxPreview.Cancel;
begin
if FRunning then
OnCancel(Self);
end;
procedure TfrxPreview.MouseWheelScroll(Delta:Integer; Horz:Boolean = False;
Zoom:Boolean = False);
begin
if Delta<>0 then
if Zoom then
begin
FZoom:= FZoom+Round(Delta / Abs(Delta)) / 10;
if FZoom < 0.3 then
FZoom:= 0.3;
SetZoom(FZoom);
end
else
begin
with FWorkspace do
begin
if Horz then
HorzPosition:= HorzPosition+Round(-Delta / Abs(Delta)) * 20
else
VertPosition:= VertPosition+Round(-Delta / Abs(Delta)) * 20;
end;
end;
end;
{ TfrxPreviewForm }
procedure TfrxPreviewForm.FormCreate(Sender:TObject);
begin
frxResources.LocalizeForm(Self);
ZoomCB.Items.Clear;
ZoomCB.Items.Add('25%');
ZoomCB.Items.Add('50%');
ZoomCB.Items.Add('75%');
ZoomCB.Items.Add('100%');
ZoomCB.Items.Add('150%');
ZoomCB.Items.Add('200%');
ZoomCB.Items.Add(frxResources.Get('zmPageWidth'));
ZoomCB.Items.Add(frxResources.Get('zmWholePage'));
frxAssignImages(Image1.Picture.Bitmap, 16, 16, MainImages);
Image1.Free;
FPreview:= TfrxPreview.Create(Self);
FPreview.Parent:= Self;
FPreview.Align:= alClient;
FPreview.OnPageChanged:= OnPageChanged;
ActiveControl:= FPreview;
end;
procedure TfrxPreviewForm.Init;
var
i:Integer;
m:TMenuItem;
begin
with Report.PreviewOptions do
begin
if Maximized then
WindowState:= wsMaximized;
if MDIChild and not (csDesigning in Report.ComponentState) then
FormStyle:= fsMDIChild;
FPreview.OutlineVisible:= OutlineVisible;
FPreview.FOutline.Width:= OutlineWidth;
FPreview.Zoom:= Zoom;
FPreview.ZoomMode:= ZoomMode;
NewPageB.Enabled:= AllowEdit;
DelPageB.Enabled:= AllowEdit;
DesignerB.Enabled:= AllowEdit;
PrintB.Visible:= pbPrint in Buttons;
OpenB.Visible:= pbLoad in Buttons;
SaveB.Visible:= pbSave in Buttons;
ExportB.Visible:= pbExport in Buttons;
FindB.Visible:= pbFind in Buttons;
ZoomWholePageB.Visible:= pbZoom in Buttons;
ZoomPageWidthB.Visible:= pbZoom in Buttons;
Zoom100B.Visible:= pbZoom in Buttons;
Zoom50B.Visible:= pbZoom in Buttons;
Sep3.Visible:= pbZoom in Buttons;
if not (pbZoom in Buttons) then
Sep1.Free;
OutlineB.Visible:= pbOutline in Buttons;
OutlineB.Down:= OutlineVisible;
PageSettingsB.Visible:= pbPageSetup in Buttons;
if not (OutlineB.Visible or PageSettingsB.Visible) then
Sep2.Free;
HandToolB.Visible:= pbTools in Buttons;
ZoomToolB.Visible:= pbTools in Buttons;
if not (pbTools in Buttons) then
Sep5.Free;
NewPageB.Visible:= pbEdit in Buttons;
DelPageB.Visible:= pbEdit in Buttons;
DesignerB.Visible:= pbEdit in Buttons;
if not (pbEdit in Buttons) then
Sep7.Free;
FirstB.Visible:= pbNavigator in Buttons;
PriorB.Visible:= pbNavigator in Buttons;
NextB.Visible:= pbNavigator in Buttons;
LastB.Visible:= pbNavigator in Buttons;
Sep4.Visible:= pbNavigator in Buttons;
if not (pbNavigator in Buttons) then
Sep6.Free;
Toolbar.ShowCaptions:= ShowCaptions;
end;
for i:= 0 to frxExportFilters.Count-1 do
begin
if frxExportFilters[i].Filter = frxDotMatrixExport then
continue;
m:= TMenuItem.Create(ExportPopup);
ExportPopup.Items.Add(m);
m.Caption:= TfrxCustomExportFilter(frxExportFilters[i].Filter).GetDescription+'...';
m.Tag:= i;
m.OnClick:= ExportMIClick;
end;
if Report.ReportOptions.Name<>'' then
Caption:= Report.ReportOptions.Name;
FPreview.Init;
end;
procedure TfrxPreviewForm.UpdateControls;
procedure EnableControls(cAr:array of TControl; Enabled:Boolean);
var
i:Integer;
begin
for i:= 0 to High(cAr) do
begin
cAr[i].Enabled:= Enabled;
if (cAr[i] is TToolButton) and not Enabled then
TToolButton(cAr[i]).Down:= False;
end;
end;
begin
EnableControls([PrintB, OpenB, SaveB, ExportB, FindB, PageSettingsB],
(not FPreview.FRunning) and (FPreview.PageCount > 0));
EnableControls([NewPageB, DelPageB, DesignerB],
not FPreview.FRunning and Report.PreviewOptions.AllowEdit);
end;
procedure TfrxPreviewForm.PrintBClick(Sender:TObject);
begin
if not frxPrinters.HasPhysicalPrinters then
frxErrorMsg(frxResources.Get('clNoPrinters')) else
FPreview.Print;
Enabled:= True;
end;
procedure TfrxPreviewForm.OpenBClick(Sender:TObject);
begin
FPreview.LoadFromFile;
end;
procedure TfrxPreviewForm.SaveBClick(Sender:TObject);
begin
FPreview.SaveToFile;
end;
procedure TfrxPreviewForm.FindBClick(Sender:TObject);
begin
FPreview.Find;
end;
procedure TfrxPreviewForm.ZoomWholePageBClick(Sender:TObject);
begin
FPreview.ZoomMode:= zmWholePage;
UpdateZoom;
end;
procedure TfrxPreviewForm.ZoomPageWidthBClick(Sender:TObject);
begin
FPreview.ZoomMode:= zmPageWidth;
UpdateZoom;
end;
procedure TfrxPreviewForm.Zoom100BClick(Sender:TObject);
begin
FPreview.Zoom:= 1;
UpdateZoom;
end;
procedure TfrxPreviewForm.Zoom50BClick(Sender:TObject);
begin
FPreview.ZoomMode:= zmManyPages;
UpdateZoom;
end;
function TfrxPreviewForm.GetReport:TfrxReport;
begin
Result:= Preview.Report;
end;
procedure TfrxPreviewForm.UpdateZoom;
begin
ZoomCB.Text:= IntToStr(Round(FPreview.Zoom * 100))+'%';
end;
procedure TfrxPreviewForm.ZoomCBClick(Sender:TObject);
var
s:String;
begin
FPreview.SetFocus;
if ZoomCB.ItemIndex = 6 then
ZoomPageWidthBClick(nil)
else if ZoomCB.ItemIndex = 7 then
ZoomWholePageBClick(nil)
else
begin
s:= ZoomCB.Text;
if Pos('%', s)<>0 then
s[Pos('%', s)]:= ' ';
while Pos(' ', s)<>0 do
Delete(s, Pos(' ', s), 1);
if s<>'' then
FPreview.Zoom:= frxStrToFloat(s) / 100;
end;
PostMessage(Handle, WM_UPDATEZOOM, 0, 0);
end;
procedure TfrxPreviewForm.FormKeyDown(Sender:TObject; var Key:Word;
Shift:TShiftState);
begin
if Key = VK_ESCAPE then
CancelBClick(Self);
end;
procedure TfrxPreviewForm.FormKeyPress(Sender:TObject; var Key:Char);
begin
if Key = #13 then
begin
if ActiveControl = ZoomCB then
ZoomCBClick(nil);
if ActiveControl = PageE then
PageEClick(nil);
end;
end;
procedure TfrxPreviewForm.WMUpdateZoom(var Message:TMessage);
begin
UpdateZoom;
end;
procedure TfrxPreviewForm.OutlineBClick(Sender:TObject);
begin
FPreview.OutlineVisible:= OutlineB.Down;
FPreview.UpdateZoom;
end;
procedure TfrxPreviewForm.PageSettingsBClick(Sender:TObject);
begin
FPreview.PageSetupDlg;
end;
procedure TfrxPreviewForm.SelectToolBClick(Sender:TObject);
begin
if HandToolB.Down then
FPreview.Tool:= ptHand
else if ZoomToolB.Down then
FPreview.Tool:= ptZoom
end;
procedure TfrxPreviewForm.OnPageChanged(Sender:TfrxPreview; PageNo:Integer);
var
FirstPass:Boolean;
begin
FirstPass:= False;
if FPreview.PreviewPages<>nil then
FirstPass:= not FPreview.PreviewPages.Engine.FinalPass;
if FirstPass then
StatusBar.Panels[0].Text:= frxResources.Get('clFirstPass')+
IntToStr(FPreview.PageCount)
else
StatusBar.Panels[0].Text:= Format(frxResources.Get('clPageOf'),
[PageNo, FPreview.PageCount]);
PageE.Text:= IntToStr(PageNo);
end;
procedure TfrxPreviewForm.PageEClick(Sender:TObject);
begin
FPreview.PageNo:= StrToInt(PageE.Text);
FPreview.SetFocus;
end;
procedure TfrxPreviewForm.FirstBClick(Sender:TObject);
begin
FPreview.First;
end;
procedure TfrxPreviewForm.PriorBClick(Sender:TObject);
begin
FPreview.Prior;
end;
procedure TfrxPreviewForm.NextBClick(Sender:TObject);
begin
FPreview.Next;
end;
procedure TfrxPreviewForm.LastBClick(Sender:TObject);
begin
FPreview.Last;
end;
procedure TfrxPreviewForm.FormMouseWheel(Sender:TObject;
Shift:TShiftState; WheelDelta:Integer; MousePos:TPoint;
var Handled:Boolean);
begin
FPreview.MouseWheelScroll(WheelDelta, False, ssCtrl in Shift);
end;
procedure TfrxPreviewForm.DesignerBClick(Sender:TObject);
begin
FPreview.Edit;
end;
procedure TfrxPreviewForm.FormCloseQuery(Sender:TObject;
var CanClose:Boolean);
begin
CanClose:= not FPreview.FRunning;
end;
procedure TfrxPreviewForm.FormClose(Sender:TObject; var Action:TCloseAction);
begin
if FFreeOnClose then
Action:= caFree;
end;
procedure TfrxPreviewForm.NewPageBClick(Sender:TObject);
begin
FPreview.AddPage;
end;
procedure TfrxPreviewForm.DelPageBClick(Sender:TObject);
begin
FPreview.DeletePage;
end;
procedure TfrxPreviewForm.CancelBClick(Sender:TObject);
begin
if FPreview.FRunning then
FPreview.Cancel else
Close;
end;
procedure TfrxPreviewForm.ExportMIClick(Sender:TObject);
begin
FPreview.Export(TfrxCustomExportFilter(frxExportFilters[TMenuItem(Sender).Tag].Filter));
Enabled:= True;
end;
procedure TfrxPreviewForm.DesignerBMouseUp(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X, Y:Integer);
var
pt:TPoint;
begin
pt:= DesignerB.ClientToScreen(Point(0, 0));
if Button = mbRight then
HiddenMenu.Popup(pt.X, pt.Y);
end;
procedure TfrxPreviewForm.Showtemplate1Click(Sender:TObject);
begin
FPreview.EditTemplate;
end;
procedure TfrxPreviewForm.SetMessageText(const Value:String);
begin
StatusBar.Panels[1].Text:= Value;
Application.ProcessMessages;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -