📄 fr_view.pas
字号:
Exit
else if Key = vk_End then
if ssCtrl in Shift then
begin
CurPage := TfrEMFPages(EMFPages).Count;
SetToCurPage;
end
else Exit
else if ssCtrl in Shift then
begin
if Chr(Key) = 'O' then LoadBtnClick(nil)
else if Chr(Key) = 'S' then SaveBtnClick(nil)
else if (Chr(Key) = 'P') and PrintBtn.Enabled then PrintBtnClick(nil)
else if Chr(Key) = 'F' then FindBtnClick(nil)
else if (Chr(Key) = 'E') and N5.Visible then EditBtnClick(nil)
end
else if Key = vk_F3 then
begin
if FindStr <> '' then
begin
if LastFoundPage <> CurPage - 1 then
begin
LastFoundPage := CurPage - 1;
LastFoundObject := 0;
end;
FindText;
end;
end
else if (Key = vk_Delete) and N5.Visible then
DelPageBtnClick(nil)
else if (Key = vk_Insert) and N5.Visible then
NewPageBtnClick(nil)
else Exit;
Key := 0;
end;
procedure TfrPreviewForm.PgUpClick(Sender: TObject);
begin
if CurPage > 1 then Dec(CurPage);
ShowPageNum;
SetToCurPage;
end;
procedure TfrPreviewForm.PgDownClick(Sender: TObject);
begin
if EMFPages = nil then Exit;
if CurPage < TfrEMFPages(EMFPages).Count then Inc(CurPage);
ShowPageNum;
SetToCurPage;
end;
procedure TfrPreviewForm.ZoomBtnClick(Sender: TObject);
var
pt: TPoint;
begin
pt := ClientToScreen(Point(ZoomBtn.Left, ZoomBtn.Top + ZoomBtn.Height + 2));
N4.Visible := False;
N5.Visible := False;
N6.Visible := False;
N7.Visible := False;
ProcMenu.Popup(pt.x + 4, pt.y + 6);
end;
procedure TfrPreviewForm.N3Click(Sender: TObject);
begin
if EMFPages = nil then Exit;
ofx := 0;
with Sender as TMenuItem do
begin
case Tag of
1: mode := mdPageWidth;
2: mode := mdOnePage;
3: mode := mdTwoPages;
else
begin
mode := mdNone;
per := Tag / 100;
end;
end;
Checked := True;
end;
HScrollBar.Position := 0;
FormResize(nil);
LastScale := per;
LastScaleMode := mode;
PBox.Repaint;
end;
procedure TfrPreviewForm.LoadBtnClick(Sender: TObject);
begin
if EMFPages = nil then Exit;
OpenDialog.Filter := LoadStr(SRepFile) + ' (*.frp)|*.frp';
with OpenDialog do
if Execute then
LoadFromFile(FileName);
end;
procedure TfrPreviewForm.SaveBtnClick(Sender: TObject);
var
i: Integer;
s: String;
begin
if EMFPages = nil then Exit;
s := LoadStr(SRepFile) + ' (*.frp)|*.frp';
for i := 0 to frFiltersCount-1 do
s := s + '|' + frFilters[i].FilterDesc + '|' + frFilters[i].FilterExt;
with SaveDialog do
begin
Filter := s;
FilterIndex := 1;
if Execute then
if FilterIndex = 1 then
SaveToFile(FileName)
else
begin
ConnectBack;
TfrReport(Doc).ExportTo(frFilters[FilterIndex - 2].ClassRef,
ChangeFileExt(FileName, Copy(frFilters[FilterIndex - 2].FilterExt, 2, 255)));
Connect(Doc);
end;
end;
end;
procedure TfrPreviewForm.PrintBtnClick(Sender: TObject);
var
Pages: String;
ind: Integer;
begin
if (EMFPages = nil) or (Printer.Printers.Count = 0) then Exit;
ind := Printer.PrinterIndex;
frPrintForm := TfrPrintForm.Create(nil);
with frPrintForm do
begin
if ShowModal = mrOk then
begin
if Printer.PrinterIndex <> ind then
if TfrReport(Doc).CanRebuild then
if TfrReport(Doc).ChangePrinter(ind, Printer.PrinterIndex) then
begin
TfrEMFPages(EMFPages).Free;
EMFPages := nil;
TfrReport(Doc).PrepareReport;
Connect(Doc);
end
else
Exit;
if RB1.Checked then
Pages := ''
else if RB2.Checked then
Pages := IntToStr(CurPage)
else
Pages := E2.Text;
ConnectBack;
TfrReport(Doc).PrintPreparedReport(Pages, StrToInt(E1.Text));
Connect(Doc);
RedrawAll;
end;
Free;
end;
end;
procedure TfrPreviewForm.ExitBtnClick(Sender: TObject);
begin
if Doc = nil then Exit;
if TfrReport(Doc).ModalPreview then
ModalResult := mrOk else
Close;
end;
procedure TfrPreviewForm.LoadFromFile(name: String);
begin
if Doc = nil then Exit;
TfrEMFPages(EMFPages).Free;
EMFPages := nil;
TfrReport(Doc).LoadPreparedReport(name);
Connect(Doc);
CurPage := 1;
FormResize(nil);
PaintAllowed := False;
ShowPageNum;
SetToCurPage;
PaintAllowed := True;
PBox.Repaint;
end;
procedure TfrPreviewForm.SaveToFile(name:String);
begin
if Doc = nil then Exit;
name := ChangeFileExt(name, '.frp');
ConnectBack;
TfrReport(Doc).SavePreparedReport(name);
Connect(Doc);
end;
function EnumEMFRecordsProc(DC: HDC; HandleTable: PHandleTable;
EMFRecord: PEnhMetaRecord; nObj: Integer; OptData: Pointer): Bool; stdcall;
var
Typ: Byte;
s: String;
t: TEMRExtTextOut;
begin
Result := True;
Typ := EMFRecord^.iType;
if Typ in [83, 84] then
begin
t := PEMRExtTextOut(EMFRecord)^;
s := WideCharLenToString(PWideChar(PChar(EMFRecord) + t.EMRText.offString),
t.EMRText.nChars);
if not CurPreview.CaseSensitive then s := AnsiUpperCase(s);
CurPreview.StrFound := Pos(CurPreview.FindStr, s) <> 0;
if CurPreview.StrFound and (RecordNum >= CurPreview.LastFoundObject) then
begin
CurPreview.StrBounds := t.rclBounds;
Result := False;
end;
end;
Inc(RecordNum);
end;
procedure TfrPreviewForm.FindInEMF(emf: TMetafile);
begin
CurPreview := Self;
RecordNum := 0;
EnumEnhMetafile(0, emf.Handle, @EnumEMFRecordsProc, nil, Rect(0, 0, 0, 0));
end;
procedure TfrPreviewForm.FindText;
var
EMF: TMetafile;
EMFCanvas: TMetafileCanvas;
PageInfo: PfrPageInfo;
begin
PaintAllowed := False;
StrFound := False;
while LastFoundPage < TfrEMFPages(EMFPages).Count do
begin
PageInfo := TfrEMFPages(EMFPages)[LastFoundPage];
EMF := TMetafile.Create;
EMF.Width := PageInfo.PrnInfo.PgW;
EMF.Height := PageInfo.PrnInfo.PgH;
EMFCanvas := TMetafileCanvas.Create(EMF, 0);
PageInfo.Visible := True;
TfrEMFPages(EMFPages).Draw(LastFoundPage, EMFCanvas,
Rect(0, 0, PageInfo.PrnInfo.PgW, PageInfo.PrnInfo.PgH));
EMFCanvas.Free;
FindInEMF(EMF);
EMF.Free;
if StrFound then
begin
CurPage := LastFoundPage + 1;
ShowPageNum;
VScrollBar.Position := PageInfo.r.Top + Round(StrBounds.Top * per) - 10;
HScrollBar.Position := PageInfo.r.Left + Round(StrBounds.Left * per) - 10;
LastFoundObject := RecordNum;
break;
end
else
begin
PageInfo.Visible := False;
TfrEMFPages(EMFPages).Draw(LastFoundPage, EMFCanvas,
Rect(0, 0, PageInfo.PrnInfo.PgW, PageInfo.PrnInfo.PgH));
end;
LastFoundObject := 0;
Inc(LastFoundPage);
end;
PaintAllowed := True;
end;
procedure TfrPreviewForm.FindBtnClick(Sender: TObject);
var
p: TfrPreviewSearchForm;
begin
if Doc = nil then Exit;
p := TfrPreviewSearchForm.Create(nil);
with p do
if ShowModal = mrOk then
begin
FindStr := Edit1.Text;
CaseSensitive := CB1.Checked;
if not CaseSensitive then FindStr := AnsiUpperCase(FindStr);
if RB1.Checked then
begin
LastFoundPage := 0;
LastFoundObject := 0;
end
else if LastFoundPage <> CurPage - 1 then
begin
LastFoundPage := CurPage - 1;
LastFoundObject := 0;
end;
Free;
FindText;
end;
end;
procedure TfrPreviewForm.EditBtnClick(Sender: TObject);
begin
if (Doc = nil) or not TfrReport(Doc).ModifyPrepared then Exit;
ConnectBack;
TfrReport(Doc).EditPreparedReport(CurPage - 1);
Connect(Doc);
RedrawAll;
end;
procedure TfrPreviewForm.DelPageBtnClick(Sender: TObject);
begin
if Doc = nil then Exit;
if TfrEMFPages(EMFPages).Count > 1 then
if MessageBox(0, PChar(LoadStr(SRemovePg)), PChar(LoadStr(SConfirm)),
mb_YesNo + mb_IconQuestion) = mrYes then
begin
TfrEMFPages(EMFPages).Delete(CurPage - 1);
RedrawAll;
end;
end;
procedure TfrPreviewForm.NewPageBtnClick(Sender: TObject);
begin
if Doc = nil then Exit;
TfrEMFPages(EMFPages).Insert(CurPage - 1, TfrReport(Doc).Pages[0]);
RedrawAll;
end;
type
THackBtn = class(TfrSpeedButton)
end;
procedure TfrPreviewForm.HelpBtnClick(Sender: TObject);
begin
Screen.Cursor := crHelp;
SetCapture(Handle);
THackBtn(HelpBtn).FMouseInControl := False;
HelpBtn.Invalidate;
end;
procedure TfrPreviewForm.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
c: TControl;
begin
HelpBtn.Down := False;
Screen.Cursor := crDefault;
c := frControlAtPos(Self, Point(X, Y));
if (c <> nil) and (c <> HelpBtn) then
Application.HelpCommand(HELP_CONTEXTPOPUP, c.Tag);
end;
procedure TfrPreviewForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
VScrollBar.Position := VScrollBar.Position + VScrollBar.SmallChange * KWheel;
end;
procedure TfrPreviewForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
VScrollBar.Position := VScrollBar.Position - VScrollBar.SmallChange * KWheel;
end;
procedure TfrPBox.MouseMove(Shift: TShiftState; X, Y: Integer);
var
i: Integer;
pt: TPoint;
r: TRect;
begin
if Preview.EMFPages = nil then Exit;
if Down then
begin
Preview.HScrollBar.Position := Preview.HScrollBar.Position - (X - LastX);
Preview.VScrollBar.Position := Preview.VScrollBar.Position - (Y - LastY);
LastX := X; LastY := Y;
end
else
with Preview do
if (Doc <> nil) {and Assigned(TfrReport(Doc).OnMouseOverObject }then
begin
pt := Point(x - ofx, y - ofy);
for i := 0 to TfrEMFPages(EMFPages).Count - 1 do
begin
r := TfrEMFPages(EMFPages)[i].r;
if PtInRect(r, pt) then
begin
pt := Point(Round((pt.X - r.Left) / per), Round((pt.Y - r.Top) / per));
break;
end;
end;
end;
end;
procedure TfrPBox.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
Down := False;
end;
procedure TfrPreviewForm.frTBButton1MouseEnter(Sender: TObject);
begin
Screen.Cursor := crHandPoint
end;
procedure TfrPreviewForm.frTBButton1MouseLeave(Sender: TObject);
begin
Screen.Cursor := crDefault
end;
procedure TfrPreviewForm.frTBButton1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar('www.fast-report.com'), nil, nil, SW_SHOWNORMAL);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -