📄 fr_view.pas
字号:
with Preview, Pages[i].PrnInfo do
begin
r1.Left := Round(Ofx * per);
r1.Top := Round(Ofy * per);
r1.Right := r1.Left + Round(Pw * per);
r1.Bottom := r1.Top + Round(Ph * per);
Inc(r1.Left, r.Left); Inc(r1.Right, r.Left);
Inc(r1.Top, r.Top); Inc(r1.Bottom, r.Top);
end;
Pages.Draw(i, Canvas, r1);
end;
end
else
Pages.Draw(i, Canvas, Rect(0, 0, 0, 0)); // remove it from cache
end;
DeleteObject(h);
end;
procedure TfrPBox.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
pt: TPoint;
begin
if Preview.EMFPages = nil then Exit;
if DFlag then
begin
DFlag := False;
Exit;
end;
with Preview do
if Button = mbLeft then
begin
LastClick := CurPage;
pt := Point(x - ofx, y - ofy);
Down := True;
LastX := X; LastY := Y;
CurPage := LastClick;
ShowPageNum;
end
else if Button = mbRight then
begin
pt := Self.ClientToScreen(Point(X, Y));
if frDesigner <> nil then
begin
N4.Visible := True;
N5.Visible := True;
N6.Visible := True;
N7.Visible := True;
end;
if THackControl(Preview.PreviewPanel.Parent).PopupMenu = nil then
ProcMenu.Popup(pt.x, pt.y) else
THackControl(Preview.PreviewPanel.Parent).PopupMenu.Popup(pt.x, pt.y);
end;
end;
procedure TfrPBox.DblClick;
begin
if Preview.EMFPages = nil then Exit;
DFlag := True;
with Preview do
if N5.Visible then EditBtnClick(nil);
end;
{----------------------------------------------------------------------------}
procedure TfrPreviewForm.FormCreate(Sender: TObject);
begin
PBox := TfrPBox.Create(Self);
with PBox do
begin
Parent := ScrollBox1;
Align := alClient;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clGray;
Preview := Self;
Tag := 207;
end;
N1.Caption := LoadStr(frRes + 020);
N2.Caption := LoadStr(frRes + 021);
N3.Caption := LoadStr(frRes + 022);
N5.Caption := LoadStr(frRes + 029);
N6.Caption := LoadStr(frRes + 030);
N7.Caption := LoadStr(frRes + 031);
ZoomBtn.Hint := LoadStr(frRes + 024);
LoadBtn.Hint := LoadStr(frRes + 025);
SaveBtn.Hint := LoadStr(frRes + 026);
PrintBtn.Hint := LoadStr(frRes + 027);
FindBtn.Hint := LoadStr(frRes + 028);
HelpBtn.Hint := LoadStr(frRes + 032);
ExitBtn.Hint := LoadStr(frRes + 023);
ScrollBox1.OnMouseWheelUp := FormMouseWheelUp;
ScrollBox1.OnMouseWheelDown := FormMouseWheelDown;
KWheel := 1;
end;
procedure TfrPreviewForm.FormDestroy(Sender: TObject);
begin
if EMFPages <> nil then
TfrEMFPages(EMFPages).Free;
PBox.Free;
end;
procedure TfrPreviewForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrPreviewForm.FormActivate(Sender: TObject);
begin
Application.HelpFile := 'FRuser.hlp';
end;
procedure TfrPreviewForm.FormDeactivate(Sender: TObject);
begin
Application.HelpFile := HF;
end;
procedure TfrPreviewForm.Show_Modal(ADoc: Pointer);
var
Ini: TRegIniFile;
GrayedButtons: Boolean;
begin
Connect(ADoc);
if not (csDesigning in TfrReport(Doc).ComponentState) then
begin
ZoomBtn.Visible := pbZoom in TfrReport(Doc).PreviewButtons;
LoadBtn.Visible := pbLoad in TfrReport(Doc).PreviewButtons;
SaveBtn.Visible := pbSave in TfrReport(Doc).PreviewButtons;
PrintBtn.Visible := pbPrint in TfrReport(Doc).PreviewButtons;
FindBtn.Visible := pbFind in TfrReport(Doc).PreviewButtons;
HelpBtn.Visible := pbHelp in TfrReport(Doc).PreviewButtons;
ExitBtn.Visible := pbExit in TfrReport(Doc).PreviewButtons;
if not ZoomBtn.Visible then
frTBSeparator1.Hide;
frTBSeparator3.Visible := FindBtn.Visible or HelpBtn.Visible;
end;
PrintBtn.Enabled := Printer.Printers.Count > 0;
if frDesigner = nil then
begin
N4.Visible := False;
N5.Visible := False;
N6.Visible := False;
N7.Visible := False;
end;
case TfrReport(Doc).InitialZoom of
pzPageWidth: LastScaleMode := mdPageWidth;
pzOnePage: LastScaleMode := mdOnePage;
pzTwoPages: LastScaleMode := mdTwoPages;
end;
RedrawAll;
HScrollBar.Position := 0;
VScrollBar.Position := 0;
GrayedButtons := TfrReport(Doc).GrayedButtons;
if frDesigner <> nil then
begin
Ini := TRegIniFile.Create('Software\FastReport\' + Application.Title);
GrayedButtons := Ini.ReadBool('Form\' + frDesigner.Name, 'GrayButtons', False);
Ini.Free;
end;
SetGrayedButtons(GrayedButtons);
HF := Application.HelpFile;
if TfrReport(Doc).ModalPreview then
ShowModal else
Show;
end;
procedure TfrPreviewForm.Connect(ADoc: Pointer);
begin
Doc := ADoc;
if EMFPages <> nil then
TfrEMFPages(EMFPages).Free;
EMFPages := TfrReport(Doc).EMFPages;
TfrReport(Doc).EMFPages := TfrEMFPages.Create(Doc);
end;
procedure TfrPreviewForm.ConnectBack;
begin
TfrReport(Doc).EMFPages.Free;
TfrReport(Doc).EMFPages := TfrEMFPages(EMFPages);
EMFPages := nil;
end;
procedure TfrPreviewForm.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
with Msg.MinMaxInfo^ do
begin
ptMaxSize.x := Screen.Width;
ptMaxSize.y := Screen.Height;
ptMaxPosition.x := 0;
ptMaxPosition.y := 0;
end;
end;
procedure TfrPreviewForm.SetGrayedButtons(Value: Boolean);
var
i: Integer;
c: TControl;
begin
for i := 0 to TPanel.ControlCount - 1 do
begin
c := TPanel.Controls[i];
if c is TfrSpeedButton then
TfrSpeedButton(c).GrayedInactive := Value;
end;
end;
procedure TfrPreviewForm.RedrawAll;
var
i: Integer;
begin
if EMFPages = nil then Exit;
per := LastScale;
mode := LastScaleMode;
if mode = mdPageWidth then
N1.Checked := True
else if mode = mdOnePage then
N2.Checked := True
else if mode = mdTwoPages then
N3.Checked := True
else
for i := 0 to ProcMenu.Items.Count - 1 do
if ProcMenu.Items[i].Tag = per * 100 then
ProcMenu.Items[i].Checked := True;
CurPage := 1;
ShowPageNum;
ofx := 0; ofy := 0; OldH := 0; OldV := 0;
HScrollBar.Position := 0;
VScrollBar.Position := 0;
FormResize(nil);
for i := 0 to TfrEMFPages(EMFPages).Count - 1 do
begin
TfrEMFPages(EMFPages)[i].Visible := False;
TfrEMFPages(EMFPages).Draw(i, Canvas, Rect(0, 0, 0, 0));
end;
PBox.Repaint;
end;
procedure TfrPreviewForm.FormResize(Sender: TObject);
var
i, j, y, d, nx, dwx, dwy, maxx, maxy, maxdy, curx: Integer;
Pages: TfrEMFPages;
begin
if EMFPages = nil then Exit;
Pages := TfrEMFPages(EMFPages);
PaintAllowed := False;
with Pages[CurPage - 1].PrnInfo do
begin
dwx := Pgw; dwy := Pgh;
end;
case mode of
mdNone:;
mdPageWidth: per := (PBox.Width - 20) / dwx;
mdOnePage: per := (PBox.Height - 20) / dwy;
mdTwoPages: per := (PBox.Width - 30) / (2 * dwx);
end;
ZoomBtn.Caption := IntToStr(Round(per * 100)) + '%';
nx := 0; maxx := 10; j := 0;
for i := 0 to Pages.Count - 1 do
begin
d := maxx + 10 + Round(Pages[i].PrnInfo.Pgw * per);
if d > PBox.Width then
begin
if nx < j then nx := j;
j := 0;
maxx := 10;
end
else
begin
maxx := d;
Inc(j);
if i = Pages.Count - 1 then
if nx < j then nx := j;
end;
end;
if nx = 0 then nx := 1;
if mode = mdOnePage then nx := 1;
if mode = mdTwoPages then nx := 2;
y := 10;
i := 0;
maxx := 0; maxy := 0;
while i < Pages.Count do
begin
j := 0; maxdy := 0; curx := 10;
while (j < nx) and (i + j < Pages.Count) do
begin
dwx := Round(Pages[i + j].PrnInfo.Pgw * per);
dwy := Round(Pages[i + j].PrnInfo.Pgh * per);
if (nx = 1) and (dwx < PBox.Width) then
begin
d := (PBox.Width - dwx) div 2;
Pages[i + j].r := Rect(d, y, d + dwx, y + dwy);
end
else
Pages[i + j].r := Rect(curx, y, curx + dwx, y + dwy);
if maxx < Pages[i + j].r.Right then
maxx := Pages[i + j].r.Right;
if maxy < Pages[i + j].r.Bottom then
maxy := Pages[i + j].r.Bottom;
Inc(j);
if maxdy < dwy then maxdy := dwy;
Inc(curx, dwx + 10);
end;
Inc(y, maxdy + 10);
Inc(i, nx);
end;
PgDown.Top := RPanel.Height - 16;
PgUp.Top := PgDown.Top - 16;
VScrollBar.Height := PgUp.Top - 1;
if RPanel.Visible then
HScrollBar.Width := BPanel.Width - HScrollBar.Left - VScrollBar.Width else
HScrollBar.Width := BPanel.Width - HScrollBar.Left;
maxx := maxx - PBox.Width;
maxy := maxy - PBox.Height;
if maxx < 0 then maxx := 0 else Inc(maxx, 10);
if maxy < 0 then maxy := 0 else Inc(maxy, 10);
HScrollBar.Max := maxx; VScrollBar.Max := maxy;
HScrollBar.Enabled := maxx <> 0;
VScrollBar.Enabled := maxy <> 0;
SetToCurPage;
PaintAllowed := True;
end;
procedure TfrPreviewForm.SetToCurPage;
begin
if EMFPages = nil then Exit;
if ofy <> TfrEMFPages(EMFPages)[CurPage - 1].r.Top - 10 then
VScrollBar.Position := TfrEMFPages(EMFPages)[CurPage - 1].r.Top - 10;
end;
procedure TfrPreviewForm.ShowPageNum;
begin
if EMFPages = nil then Exit;
Label1.Caption := LoadStr(SPg) + ' ' + IntToStr(CurPage) + '/' +
IntToStr(TfrEMFPages(EMFPages).Count);
end;
procedure TfrPreviewForm.VScrollBarChange(Sender: TObject);
var
i, p, pp: Integer;
r: TRect;
Pages: TfrEMFPages;
begin
if EMFPages = nil then Exit;
Pages := TfrEMFPages(EMFPages);
p := VScrollBar.Position;
pp := OldV - p;
OldV := p;
ofy := -p;
r := Rect(0, 0, PBox.Width, PBox.Height);
ScrollWindow(PBox.Handle, 0, pp, @r, @r);
for i := 0 to Pages.Count-1 do
if (Pages[i].r.Top < -ofy + 11) and
(Pages[i].r.Bottom > -ofy + 11) then
begin
CurPage := i + 1;
ShowPageNum;
break;
end;
end;
procedure TfrPreviewForm.HScrollBarChange(Sender: TObject);
var
p, pp: Integer;
r: TRect;
begin
if EMFPages = nil then Exit;
p := HScrollBar.Position;
pp := OldH - p;
OldH := p;
ofx := -p;
r := Rect(0, 0, PBox.Width, PBox.Height);
ScrollWindow(PBox.Handle, pp, 0, @r, @r);
end;
procedure TfrPreviewForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if EMFPages = nil then Exit;
if Key in [vk_Up, vk_Down, vk_Prior, vk_Next] then
if VScrollBar.Enabled then VScrollBar.SetFocus;
if Key in [vk_Left, vk_Right] then
if HScrollBar.Enabled then HScrollBar.SetFocus;
if Key = vk_Up then
VScrollBar.Position := VScrollBar.Position - VScrollBar.SmallChange
else if Key = vk_Down then
VScrollBar.Position := VScrollBar.Position + VScrollBar.SmallChange
else if Key = vk_Left then
HScrollBar.Position := HScrollBar.Position - HScrollBar.SmallChange
else if Key = vk_Right then
HScrollBar.Position := HScrollBar.Position + HScrollBar.SmallChange
else if Key = vk_Prior then
if ssCtrl in Shift then
PgUpClick(nil) else
VScrollBar.Position := VScrollBar.Position - VScrollBar.LargeChange
else if Key = vk_Next then
if ssCtrl in Shift then
PgDownClick(nil) else
VScrollBar.Position := VScrollBar.Position + VScrollBar.LargeChange
else if Key = vk_Space then
ZoomBtnClick(nil)
else if Key = vk_Escape then
ExitBtnClick(nil)
else if Key = vk_Home then
if ssCtrl in Shift then
VScrollBar.Position := 0 else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -