⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rm_preview.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 5 页
字号:
        //此处应增加如下行
        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 + -