📄 rm_preview.pas
字号:
//此处应增加如下行
if lEndPage <> nil then //ADD BY PGT
begin
lRect := lEndPage.PageRect;
OffsetRect(lRect, FPreview.FOffsetLeft, FPreview.FOffsetTop);
if PtInRect(lRect, lPoint) then
begin
lPoint := Point(Round((lPoint.X - lRect.Left) / FPReview.FScale),
Round((lPoint.Y - lRect.Top) / FPReview.FScale));
if _GenOnePage then
begin
FSavePageNo := FVisiblePages[i] + 1;
FSaveEndPage := lEndPage;
Break;
end;
end;
end; {if }
end;
Cursor := lCursor;
FPreview.FStatusBar.Panels[1].Text := lUrlStr;
end;
finally
FBusy := False;
end;
end;
procedure TRMDrawPanel.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (not FPreview.FPaintAllowed) then Exit;
FDown := False;
end;
procedure TRMDrawPanel.DblClick;
begin
FDown := False;
FDoubleClickFlag := True;
FPreview.EditPage(FPreview.CurPage - 1);
end;
{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{ TRMVirtualPreview }
constructor TRMVirtualPreview.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FKWheel := 20;
BevelInner := bvNone;
BevelOuter := bvLowered;
Caption := '';
OnResize := OnResizeEvent;
FParentForm := nil;
FOnPageChanged := nil;
FOnStatusChange := nil;
FOutlineTreeView := TTreeView.Create(Self);
with FOutlineTreeView do
begin
Parent := Self;
Align := alLeft;
Width := 180;
Visible := False;
ReadOnly := True;
OnClick := OnOutlineClickEvent;
end;
FSplitter := TSplitter.Create(Self);
with FSplitter do
begin
Parent := Self;
Align := alLeft;
Left := 10;
Visible := False;
OnMoved := OnSplitterMovedEvent;
end;
FScrollBox := TRMScrollBox.Create(Self);
with FScrollBox do
begin
Parent := Self;
//BorderStyle := bsNone;
Caption := '';
Align := alClient;
HorzScrollBar.SmallChange := Self.FKWheel;
HorzScrollBar.LargeChange := 300;
VertScrollBar.SmallChange := Self.FKWheel;
VertScrollBar.LargeChange := 300;
OnMouseWheelUp := OnMouseWheelUpEvent;
OnMouseWheelDown := OnMouseWheelDownEvent;
OnChange := Self.OnScrollBoxScroll;
end;
FTopPanel := TPanel.Create(Self);
with FTopPanel do
begin
Parent := FScrollBox;
Caption := '';
Height := 29;
Align := alTop;
BevelOuter := bvNone;
Visible := False;
end;
FLeftTopPanel := TPanel.Create(Self);
with FLeftTopPanel do
begin
Parent := FTopPanel;
Caption := '';
Width := 29;
Align := alLeft;
BevelOuter := bvNone;
end;
FTopPanel1 := TPanel.Create(Self);
with FTopPanel1 do
begin
Parent := FTopPanel;
Caption := '';
Height := 29;
Align := alClient;
BevelOuter := bvNone;
end;
FLeftPanel := TPanel.Create(Self);
with FLeftPanel do
begin
Parent := FScrollBox;
Caption := '';
Width := 29;
Align := alLeft;
BevelOuter := bvNone;
Visible := False;
end;
FHRuler := TRMDesignerRuler.Create(Self);
FHRuler.Parent := FTopPanel1;
FHRuler.Units := RMUnits;
FHRuler.Orientation := roHorizontal;
FHRuler.SetBounds(FLeftPanel.Width, 0, FTopPanel1.Width, FTopPanel1.Height);
FVRuler := TRMDesignerRuler.Create(Self);
FVRuler.Parent := FLeftPanel;
FVRuler.Units := RMUnits;
FVRuler.Orientation := roVertical;
FVRuler.SetBounds(0, 0, FLeftPanel.Width, FLeftPanel.Height);
FStatusBar := TStatusBar.Create(Self);
with FStatusBar do
begin
Parent := Self;
Align := alBottom;
with Panels.Add do
begin
Width := 140;
end;
with Panels.Add do
begin
Width := 260;
end;
with Panels.Add do
begin
Width := 100;
end;
end;
FDrawPanel := TRMDrawPanel.Create(FScrollBox);
with FDrawPanel do
begin
Parent := FScrollBox;
Caption := '';
Align := alClient;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clGray;
FPreview := Self;
end;
FLastScale := 1;
FZoomMode := mdNone;
end;
destructor TRMVirtualPreview.Destroy;
begin
if FReport <> nil then
begin
TRMReport(FReport).ReportInfo := FSaveReportInfo;
end;
ClearOutLine;
inherited Destroy;
end;
function TRMVirtualPreview.CanModify: Boolean;
begin
Result := (RMDesignerClass <> nil) and Assigned(FReport) and TRMReport(Report).ModifyPrepared;
end;
procedure TRMVirtualPreview.Connect_1(aReport: TRMCustomReport);
begin
FReport := aReport;
if FReport <> nil then
FTotalPages := TRMEndPages(GetEndPages).Count;
end;
{$HINTS OFF}
procedure TRMVirtualPreview.ShowReport(aReport: TRMCustomReport);
begin
FPrepareReportFlag := False;
if Assigned(FOnBeforeShowReport) then FOnBeforeShowReport(aReport);
Connect(aReport);
end;
procedure TRMVirtualPreview.Disconnect;
begin
if FReport <> nil then
TRMReport(FReport).ReportInfo := FSaveReportInfo;
FReport := nil;
end;
procedure TRMVirtualPreview.ClearOutLine;
var
i: Integer;
lNode: TTreeNode;
begin
for i := 0 to FOutLineTreeView.Items.Count - 1 do
begin
lNode := FOutLineTreeView.Items[i];
if lNode.Data <> nil then
begin
Dispose(lNode.Data);
lNode.Data := nil;
end;
end;
FOutLineTreeView.Items.Clear;
end;
procedure TRMVirtualPreview.GotoPosition(aPageNo, aPosition: Integer);
var
lPages: TRMEndPages;
lPageRectHeight: Integer;
lPageHeight: Integer;
begin
lPages := TRMEndPages(GetEndPages);
if (aPageNo < 0) or (aPageNo >= lPages.Count) then Exit;
aPosition := Round(aPosition * FScale) +
RMToScreenPixels(lPages[aPageNo].mmMarginTop * FScale, rmutMMThousandths);
if aPageNo > 0 then
lPageRectHeight := lPages[aPageNo].PageRect.Bottom - lPages[aPageNo - 1].PageRect.Bottom
else
lPageRectHeight := lPages[aPageNo].PageRect.Bottom;
lPageRectHeight := lPageRectHeight - 10;
lPageHeight := Round(lPages[aPageNo].PrinterInfo.ScreenPageHeight * FScale);
FCurPage := -1;
CurPage := aPageNo + 1;
VScrollBar.Position := VScrollBar.Position +
Round(aPosition * lPageRectHeight / lPageHeight) + 10 - 5;
end;
procedure TRMVirtualPreview.OnOutlineClickEvent(Sender: TObject);
var
lNode: TTreeNode;
lPages: TRMEndPages;
begin
lNode := FOutLineTreeView.Selected;
if (lNode = nil) or (lNode.Data = nil) then Exit;
GotoPosition(PRMPreviewNodeDataInfo(lNode.Data).PageNo,
PRMPreviewNodeDataInfo(lNode.Data).Position);
end;
procedure TRMVirtualPreview.SetOutLineInfo; // 设置outline
var
i, j: Integer;
lStr: string;
lInfo: PRMPreviewNodeDataInfo;
lParentNode, lNode: TTreeNode;
lCaption: string;
lPageNo, lPosition, lNodeLevel: Integer;
lTmpPos, lOldNodeLevel: Integer;
lEndPages: TRMEndPages;
begin
FOutLineTreeView.Items.BeginUpdate;
try
lEndPages := TRMEndPages(GetEndPages);
ClearOutLine;
// lNode := FOutLine.Items.AddChild(nil, '目录');
// lNode.Data := nil;
lNode := nil;
lParentNode := lNode;
lOldNodeLevel := 0;
{ lEndPages.OutLines.Add('1' + #1 + '0' + #1 + '100' + #1 + '0');
lEndPages.OutLines.Add('2' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('3' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('4' + #1 + '1' + #1 + '100' + #1 + '2');
lEndPages.OutLines.Add('5' + #1 + '1' + #1 + '100' + #1 + '2');
lEndPages.OutLines.Add('6' + #1 + '1' + #1 + '100' + #1 + '1');
lEndPages.OutLines.Add('7' + #1 + '1' + #1 + '100' + #1 + '0');
}for i := 0 to lEndPages.OutLines.Count - 1 do
begin
lStr := lEndPages.OutLines[i];
lTmpPos := 1;
lCaption := RMStrGetToken(lStr, #1, lTmpPos);
lPageNo := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
lPosition := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
lNodeLevel := StrToInt(RMStrGetToken(lStr, #1, lTmpPos));
if lNodeLevel > lOldNodeLevel then
begin
lParentNode := lNode;
end
else if lNodeLevel < lOldNodeLevel then
begin
lParentNode := lNode;
for j := lNodeLevel to lOldNodeLevel do
begin
if lParentNode = nil then Break;
lParentNode := lParentNode.Parent;
end;
end;
lNode := FOutLineTreeView.Items.AddChild(lParentNode, lCaption);
New(lInfo);
lInfo.PageNo := lPageNo;
lInfo.Position := lPosition;
lNode.Data := lInfo;
lOldNodeLevel := lNodeLevel;
end;
finally
FOutLineTreeView.FullExpand;
FOutLineTreeView.Items.EndUpdate;
ShowOutline(FOutLineTreeView.Items.Count > 0);
end;
end;
procedure TRMVirtualPreview.Connect(aReport: TRMCustomReport);
var
lParentForm: TForm;
begin
Connect_1(aReport);
FTotalPages := 0;
FLeftPanel.Visible := Options.RulerVisible;
FTopPanel.Visible := Options.RulerVisible;
FHRuler.Units := Options.RulerUnit;
FVRuler.Units := Options.RulerUnit;
TRMPreview(Self).SetButtonsVisible;
if aReport = nil then
begin
FPaintAllowed := False;
HScrollBar.Range := 2;
HScrollBar.PageSize := 1;
VScrollBar.Range := 2;
VScrollBar.PageSize := 1;
FStatusBar.Panels[0].Text := '';
FStatusBar.Panels[1].Text := '';
ShowOutline(False);
ClearOutLine;
Exit;
end;
FTotalPages := TRMEndPages(GetEndPages).Count;
FSaveReportInfo := TRMReport(FReport).ReportInfo;
case TRMReport(FReport).InitialZoom of
pzDefault:
begin
FScale := 1;
FZoomMode := mdNone;
end;
pzPageWidth: FZoomMode := mdPageWidth;
pzOnePage: FZoomMode := mdOnePage;
pzTwoPages: FZoomMode := mdTwoPages;
end;
SetOutLineInfo;
CurPage := 1;
RedrawAll(True);
lParentForm := FParentForm;
if (lParentForm = nil) and (Parent <> nil) and (Parent is TForm) then
lParentForm := TForm(Parent);
if lParentForm <> nil then
begin
lParentForm.OnMouseWheelUp := OnMouseWheelUpEvent;
lParentForm.OnMouseWheelDown := OnMouseWheelDownEvent;
end;
end;
{$HINTS ON}
procedure TRMVirtualPreview.DoStatusChange;
begin
if Assigned(FOnStatusChange) then
FOnStatusChange(Self);
end;
procedure TRMVirtualPreview.SetToCurPage;
begin
if (GetEndPages = nil) or (FCurPage < 1) then Exit;
TRMEndPages(GetEndPages).CurPageNo := FCurPage; //by waw
if FOffsetTop <> TRMEndPages(GetEndPages)[FCurPage - 1].PageRect.Top - 10 then
VScrollBar.Position := TRMEndPages(GetEndPages)[FCurPage - 1].PageRect.Top - 10;
end;
procedure TRMVirtualPreview.ShowPageNum;
begin
if GetEndPages = nil then
FStatusBar.Panels[0].Text := ''
// FLabel.Caption := ''
else
begin
if Assigned(FOnPageChanged) then
FOnPageChanged(Self);
FStatusBar.Panels[0].Text {FLabel.Caption} := RMLoadStr(SPg) + ' ' + IntToStr(FCurPage) + '/' +
IntToStr(FTotalPages);
TRMEndPages(GetEndPages).CurPageNo := FCurPage;
end;
end;
procedure TRMVirtualPreview.LoadFromFile(aFileName: string);
var
lSaveReport: TRMCustomReport;
begin
if FPrepareReportFlag then Exit;
if (FReport = nil) or (GetEndPages = nil) then Exit;
FPaintAllowed := False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -