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

📄 rm_view.pas

📁 report machine 2.3 功能强大
💻 PAS
📖 第 1 页 / 共 3 页
字号:
        end;
      end;
    end; {with}
  end; {else}
end;

procedure TRMDrawPanel.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Cursor = crMagnifier then
  begin
    if FPreview.FLastScaleMode = mdOnePage then
      FPreview.Zoom := 100
    else
      FPreview.OnePage;
    FPreview.FVScrollBar.Position := FPreview.FVScrollBar.Position + FOldMousePos.y;
    FPreview.FHScrollBar.Position := FPreview.FHScrollBar.Position + FOldMousePos.x;
  end;

  FDown := False;
end;

procedure TRMDrawPanel.DblClick;
begin
  if FPreview.AutoScale then Exit;
  FDown := False;
  FDFlag := True;
  FPreview.EditPage(FPreview.CurPage - 1);
end;

{----------------------------------------------------------------------------}
{----------------------------------------------------------------------------}
{ TRMPreview}

constructor TRMPreview.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanModify := True;
  BevelInner := bvNone;
  BevelOuter := bvLowered;
  Caption := '';
  OnResize := OnResizeEvent;
  FParentForm := nil;

  FScrollBox := TScrollBox.Create(Self);
  with FScrollBox do
  begin
    Parent := Self;
    Caption := '';
    Align := alClient;
{$IFDEF Delphi4}
    OnMouseWheelUp := OnMouseWheelUpEvent;
    OnMouseWheelDown := OnMouseWheelDownEvent;
{$ENDIF}
  end;

  FRPanel := TPanel.Create(Self);
  with FRPanel do
  begin
    Parent := Self;
    Caption := '';
    Width := 16;
    Align := alRight;
    BevelOuter := bvNone;
  end;

  FVScrollBar := TScrollBar.Create(FRPanel);
  with FVScrollBar do
  begin
    Parent := FRPanel;
    Kind := sbVertical;
    Align := alTop;
    Ctl3D := True;
    LargeChange := 200;
    Max := 32000;
    ParentCtl3D := False;
    SmallChange := 10;
    OnChange := OnVScrollBarChange;
  end;

  FPgUp := TSpeedButton.Create(FRPanel);
  with FPgUp do
  begin
    Parent := FRPanel;
    Left := 0;
    Top := 184;
    Width := 16;
    Height := 16;
    Glyph.Handle := LoadBitmap(hInstance, 'PgUp');
    OnClick := OnPgUpClick;
  end;

  FPgDown := TSpeedButton.Create(FRPanel);
  with FPgDown do
  begin
    Parent := FRPanel;
    Left := 0;
    Top := 200;
    Width := 16;
    Height := 16;
    Glyph.Handle := LoadBitmap(hInstance, 'PgDn');
    OnClick := OnPgDnClick;
  end;

  FBPanel := TPanel.Create(Self);
  with FBPanel do
  begin
    Parent := Self;
    Caption := '';
    Height := 18;
    Align := alBottom;
    BevelOuter := bvNone;
  end;

  FBevel := TBevel.Create(FBPanel);
  with FBevel do
  begin
    Parent := FBPanel;
    Left := 0;
    Top := 1;
    Width := 77;
    Height := 17;
  end;

  FLabel := TLabel.Create(FBPanel);
  with FLabel do
  begin
    Parent := FBPanel;
    Left := 4;
    Top := 3;
    Width := 6;
    Height := 12;
  end;

  FHScrollBar := TScrollBar.Create(FBPanel);
  with FHScrollBar do
  begin
    Parent := FBPanel;
    Left := 80;
    Top := 1;
    Width := 329;
    Height := 16;
    Ctl3D := True;
    LargeChange := 200;
    Max := 32000;
    ParentCtl3D := False;
    SmallChange := 10;
    OnChange := OnHScrollBarChange;
  end;

  FPBox := TRMDrawPanel.Create(FScrollBox);
  with FPBox do
  begin
    Parent := FScrollBox;
    Caption := '';
    Align := alClient;
    BevelInner := bvNone;
    BevelOuter := bvNone;
    Color := clGray;
    FPreview := Self;
  end;

  FLastScale := 1;
  FLastScaleMode := mdNone;
  ScrollBars := ssBoth;
  FKWheel := 1;
  FOnPageChanged := nil;
  FOnStatusChange := nil;
end;

destructor TRMPreview.Destroy;
begin
  if FEMFPages <> nil then
    TRMEMFPages(FEMFPages).Free;
  FEMFPages := nil;
  FPBox.Free; FPBox := nil;

  inherited Destroy;
end;

function TRMPreview.CanModify: Boolean;
begin
  Result := FCanModify and (RMDesignerClass <> nil) and (Assigned(FDoc) and TRMReport(Doc).ModifyPrepared);
end;

procedure TRMPreview.Connect_1(aDoc: TObject);
begin
  FDoc := ADoc;
  if FEMFPages <> nil then
    TRMEMFPages(FEMFPages).Free;
  FEMFPages := TRMReport(FDoc).EMFPages;
  TRMReport(FDoc).EMFPages := TRMEMFPages.Create(TRMReport(FDoc));
end;

{$HINTS OFF}

procedure TRMPreview.Connect(aDoc: TObject);
begin
  Connect_1(aDoc);
  case TRMReport(FDoc).InitialZoom of
    pzDefault:
      begin
        FPer := 1;
        FLastScaleMode := mdNone;
      end;
    pzPageWidth: FLastScaleMode := mdPageWidth;
    pzOnePage: FLastScaleMode := mdOnePage;
    pzTwoPages: FLastScaleMode := mdTwoPages;
  end;

  Page := 1;
  RedrawAll(TRUE);
{$IFDEF Delphi4}
  if FParentForm <> nil then
  begin
    FParentForm.OnMouseWheelUp := OnMouseWheelUpEvent;
    FParentForm.OnMouseWheelDown := OnMouseWheelDownEvent;
//	  FKWheel := 3;
  end;
{$ENDIF}
end;
{$HINTS ON}

procedure TRMPreview.Disconnect;
begin
  ConnectBack;
end;

procedure TRMPreview.DoStatusChange;
begin
  if Assigned(FOnStatusChange) then
    FOnStatusChange(Self);
end;

procedure TRMPreview.SetToCurPage;
begin
  if FEMFPages = nil then Exit;
  if Fofy <> TRMEMFPages(FEMFPages)[FCurPage - 1].r.Top - 10 then
    FVScrollBar.Position := TRMEMFPages(FEMFPages)[FCurPage - 1].r.Top - 10;
end;

procedure TRMPreview.ShowPageNum;
begin
  if FEMFPages = nil then
    FLabel.Caption := ''
  else
  begin
    if Assigned(FOnPageChanged) then
      FOnPageChanged(Self);
    FLabel.Caption := RMLoadStr(SPg) + ' ' + IntToStr(FCurPage) + '/' +
      IntToStr(TRMEMFPages(FEMFPages).Count);
  end;
end;

procedure TRMPreview.LoadFromFile(name: string);
begin
  if (FEMFPages = nil) or (FDoc = nil) then Exit;
  TRMEMFPages(FEMFPages).Free;
  FEMFPages := nil;
  TRMReport(FDoc).LoadPreparedReport(name);
  Connect_1(FDoc);
  FCurPage := 1;
  OnResizeEvent(nil);
  FPaintAllowed := False;
  ShowPageNum;
  SetToCurPage;
  FPaintAllowed := True;
  FPBox.Repaint;
end;

procedure TRMPreview.SaveToFile(name: string; aIndex: Integer);
begin
  if FEMFPages = nil then Exit;

  if aIndex < 2 then
  begin
    if FDoc = nil then Exit;
    name := ChangeFileExt(name, '.rmp');
    ConnectBack;
    TRMReport(FDoc).SavePreparedReport(name);
    Connect_1(FDoc);
  end
  else //export输出
  begin
    ConnectBack;
    TRMReport(Doc).ExportTo(TRMExportFilter(RMFilters(aIndex - 2).Filter),
      ChangeFileExt(name, Copy(RMFilters(aIndex - 2).FilterExt, 2, 255)));
    Connect_1(FDoc);
    RedrawAll(False);
  end;
end;

procedure TRMPreview.OnResizeEvent(Sender: TObject);
var
  i, j, y, d, nx, dwx, dwy, maxx, maxy, maxdy, curx: Integer;
  Pages: TRMEMFPages;
begin
  FPgDown.Top := FRPanel.Height - 16;
  FPgUp.Top := FPgDown.Top - 16;
  FVScrollBar.Height := FPgUp.Top - 1;
//  FVScrollBar.Left := 0;
  if FRPanel.Visible then
    FHScrollBar.Width := FBPanel.Width - FHScrollBar.Left - FVScrollBar.Width
  else
    FHScrollBar.Width := FBPanel.Width - FHScrollBar.Left;

  if FEMFPages = nil then Exit;
  Pages := TRMEMFPages(FEMFPages);
  FPaintAllowed := False;
  with Pages[FCurPage - 1].PrnInfo do
  begin
    dwx := Pgw; dwy := Pgh;
  end;
  case Fmode of
    mdNone: ;
    mdPageWidth: Fper := (FPBox.Width - 20) / dwx;
    mdOnePage: Fper := (FPBox.Height - 20) / dwy;
    mdTwoPages: Fper := (FPBox.Width - 30) / (2 * dwx);
  end;

  nx := 0; maxx := 10; j := 0;
  for i := 0 to Pages.Count - 1 do
  begin
    d := maxx + 10 + Round(Pages[i].PrnInfo.Pgw * Fper);
    if d > FPBox.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
      begin
        if nx < j then nx := j;
      end;
    end;
  end;
  if nx = 0 then nx := 1;
  if Fmode = mdOnePage then nx := 1;
  if Fmode = 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 * Fper);
      dwy := Round(Pages[i + j].PrnInfo.Pgh * Fper);
      if (nx = 1) and (dwx < FPBox.Width) then
      begin
        d := (FPBox.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;

  maxx := maxx - FPBox.Width;
  maxy := maxy - FPBox.Height;
  if maxx < 0 then maxx := 0 else Inc(maxx, 10);
  if maxy < 0 then maxy := 0 else Inc(maxy, 10);
  FHScrollBar.Max := maxx; FVScrollBar.Max := maxy;
  FHScrollBar.Enabled := maxx <> 0;
  FVScrollBar.Enabled := maxy <> 0;
  SetToCurPage;
  FPaintAllowed := True;
  DoStatusChange;
end;

procedure TRMPreview.RedrawAll(ResetPage: Boolean);
var
  i: Integer;
begin
  Fper := FLastScale;
  Fmode := FLastScaleMode;

  if ResetPage then
  begin
    FCurPage := 1;
    Fofx := 0; Fofy := 0; FOldH := 0; FOldV := 0;
    FHScrollBar.Position := 0;
    FVScrollBar.Position := 0;
  end;
  ShowPageNum;
  OnResizeEvent(nil);
  if FEMFPages <> nil then
  begin
    for i := 0 to TRMEMFPages(FEMFPages).Count - 1 do
    begin
      TRMEMFPages(FEMFPages)[i].Visible := False;
      TRMEMFPages(FEMFPages).Draw(i, Canvas, Rect(0, 0, 0, 0));
    end;
  end;
  FPBox.Repaint;
end;

procedure TRMPreview.OnVScrollBarChange(Sender: TObject);
var
  i, p, pp: Integer;
  r: TRect;
  Pages: TRMEMFPages;
begin
  if FEMFPages = nil then Exit;
  Pages := TRMEMFPages(FEMFPages);
  p := FVScrollBar.Position;
  pp := FOldV - p;
  FOldV := p;
  Fofy := -p;
  r := Rect(0, 0, FPBox.Width, FPBox.Height);
  ScrollWindow(FPBox.Handle, 0, pp, @r, @r);

  for i := 0 to Pages.Count - 1 do
  begin
    if (Pages[i].r.Top < -Fofy + 11) and (Pages[i].r.Bottom > -Fofy + 11) then
    begin
      FCurPage := i + 1;
      ShowPageNum;
      break;
    end;
  end;
end;

procedure TRMPreview.OnHScrollBarChange(Sender: TObject);
var
  p, pp: Integer;
  r: TRect;
begin
  if FEMFPages = nil then Exit;
  p := FHScrollBar.Position;
  pp := FOldH - p;
  FOldH := p;
  Fofx := -p;
  r := Rect(0, 0, FPBox.Width, FPBox.Height);
  ScrollWindow(FPBox.Handle, pp, 0, @r, @r);
end;

procedure TRMPreview.ConnectBack;
begin
  TRMReport(FDoc).EMFPages.Free;
  TRMReport(FDoc).EMFPages := TRMEMFPages(FEMFPages);
  FEMFPages := nil;
end;

procedure TRMPreview.SetPage(Value: Integer);
begin
  if (Value < 1) or (Value > AllPages) then Exit;
  FCurPage := Value;
  SetToCurPage;
  if Assigned(FOnPageChanged) then
    FOnPageChanged(Self);
end;

function TRMPreview.GetZoom: Double;
begin
  Result := FPer * 100;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -