rm_preview.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,231 行 · 第 1/5 页

PAS
2,231
字号
  maxy := 0;
  while i < lPages.Count do
  begin
    j := 0;
    maxdy := 0;
    curx := 10;
    while (j < nx) and (i + j < lPages.Count) do
    begin
      lPageWidth := Round(lPages[i + j].PrinterInfo.PageWidth * FScale);
      lPageHeight := Round(lPages[i + j].PrinterInfo.PageHeight * FScale);
      if (nx = 1) and (lPageWidth < FDrawPanel.Width) then
      begin
        d := (FDrawPanel.Width - lPageWidth) div 2;
        lPages[i + j].PageRect := Rect(d, y, d + lPageWidth, y + lPageHeight);
      end
      else
        lPages[i + j].PageRect := Rect(curx, y, curx + lPageWidth, y + lPageHeight);
      if maxx < lPages[i + j].PageRect.Right then
        maxx := lPages[i + j].PageRect.Right;
      if maxy < lPages[i + j].PageRect.Bottom then
        maxy := lPages[i + j].PageRect.Bottom;
      Inc(j);
      if maxdy < lPageHeight then
        maxdy := lPageHeight;
      Inc(curx, lPageWidth + 10);
    end;
    Inc(y, maxdy + 10);
    Inc(i, nx);
  end;

  HScrollBar.Max := maxx + 10;
  HScrollBar.RefreshLargePage(FScrollBox.ClientWidth);
  if HScrollBar.Position > HScrollBar.Max - HScrollBar.LargeChange then
    HScrollBar.Position := HScrollBar.Max - HScrollBar.LargeChange;

  VScrollBar.Max := maxy + 10;
  VScrollBar.RefreshLargePage(FScrollBox.ClientHeight);
  if VScrollBar.Position > VScrollBar.Max - VScrollBar.LargeChange then
    VScrollBar.Position := VScrollBar.Max - VScrollBar.LargeChange;

  SetToCurPage;
  FPaintAllowed := True;
  DoStatusChange;
end;

procedure TRMPreview.RedrawAll(ResetPage: Boolean);
//var
//  i: Integer;
begin
  FPaintAllowed := True;
  FScale := FLastScale;
  if ResetPage then
  begin
    FCurPage := 1;
    FOffsetLeft := 0;
    FOffsetTop := 0;
    FOldHPos := 0;
    FOldVPos := 0;
    HScrollBar.Position := 0;
    VScrollBar.Position := 0;
  end;
  ShowPageNum;
  OnResizeEvent(nil);
  {  if GetEndPages <> nil then
    begin
      for i := 0 to TRMEndPages(GetEndPages).Count - 1 do
      begin
        TRMEndPages(GetEndPages).Pages[i].RemoveCachePage;
      end;
    end;}
  FDrawPanel.Repaint;
end;

procedure TRMPreview.OnScrollBoxScroll(Sender: TObject; Kind: TRMScrollBarKind);
var
  i, p, pp: Integer;
  lRect: TRect;
  lPages: TRMEndPages;
begin
  if GetEndPages = nil then Exit;

  if Kind = rmsbHorizontal then
  begin
    p := HScrollBar.Position;
    pp := FOldHPos - p;
    FOldHPos := p;
    FOffsetLeft := -p;
    lRect := Rect(0, 0, FDrawPanel.Width, FDrawPanel.Height);
    ScrollWindow(FDrawPanel.Handle, pp, 0, @lRect, @lRect);
  end
  else
  begin
    lPages := TRMEndPages(GetEndPages);
    p := VScrollBar.Position;
    pp := FOldVPos - p;
    FOldVPos := p;
    FOffsetTop := -p;
    lRect := Rect(0, 0, FDrawPanel.Width, FDrawPanel.Height);
    ScrollWindow(FDrawPanel.Handle, 0, pp, @lRect, @lRect);
    for i := 0 to lPages.Count - 1 do
    begin
      if (lPages[i].PageRect.Top < -FOffsetTop + 11) and (lPages[i].PageRect.Bottom > -FOffsetTop + 11) then
      begin
        FCurPage := i + 1;
        ShowPageNum;
        Break;
      end;
    end;
  end;
end;

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

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

procedure TRMPreview.SetZoom(Value: Double);
begin
  FScale := Value / 100;
  FZoomMode := mdNone;
  LastScale := FScale;
  OnResizeEvent(nil);
  FDrawPanel.Paint;
  DoStatusChange;
end;

function TRMPreview.GetTotalPages: Integer;
begin
  if GetEndPages <> nil then
    Result := TRMEndPages(GetEndPages).Count
  else
    Result := 0;
end;

procedure TRMPreview.OnePage;
begin
  FZoomMode := mdOnePage;
  OnResizeEvent(nil);
  FDrawPanel.Paint;
  DoStatusChange;
end;

procedure TRMPreview.TwoPages;
begin
  FZoomMode := mdTwoPages;
  OnResizeEvent(nil);
  FDrawPanel.Paint;
  DoStatusChange;
end;

procedure TRMPreview.PageWidth;
begin
  FZoomMode := mdPageWidth;
  OnResizeEvent(nil);
  FDrawPanel.Paint;
  DoStatusChange;
end;

procedure TRMPreview.PrinterZoom;
begin
  if RMPrinter.PrinterInfo.IsValid then
    FZoomMode := mdPrinterZoom
  else
    FZoomMode := mdPageWidth;
  OnResizeEvent(nil);
  FDrawPanel.Paint;
  DoStatusChange;
end;

procedure TRMPreview.First;
begin
  CurPage := 1;
end;

procedure TRMPreview.Next;
begin
  CurPage := CurPage + 1;
end;

procedure TRMPreview.Prev;
begin
  CurPage := CurPage - 1;
end;

procedure TRMPreview.Last;
begin
  CurPage := TotalPages;
end;

procedure TRMPreview.Print;
var
  lSavePrinterIndex: Integer;
  lNeedSave: Boolean;
  lPages: string;
  lForm: TRMPrintDialogForm;
begin
  if (GetEndPages = nil) or (RMPrinters.Count = 2) then Exit;

  lForm := TRMPrintDialogForm.Create(nil);
  try
    with lForm do
    begin
      CurrentPrinter := TRMReport(FReport).ReportPrinter;
      Copies := TRMReport(FReport).DefaultCopies;
      chkCollate.Checked := TRMReport(FReport).DefaultCollate;
      chkTaoda.Checked := TRMReport(FReport).PrintBackGroundPicture;
      chkColorPrint.Checked := TRMReport(FReport).ColorPrint;
      THackReport(FReport).ScalePageSize := -1;
      THackReport(FReport).ScaleFactor := 100;
      PrintOffsetTop := TRMReport(FReport).PrintOffsetTop;
      PrintOffsetLeft := TRMReport(FReport).PrintOffsetLeft;
      if TRMReport(Report).ShowPrintDialog then
        lSavePrinterIndex := TRMReport(FReport).ReportPrinter.PrinterIndex
      else
        lSavePrinterIndex := -1;

      if (not TRMReport(Report).ShowPrintDialog) or (ShowModal = mrOK) then
      begin
        if TRMReport(FReport).CanRebuild and (lForm.NeedRebuild or
          (TRMReport(FReport).ReportPrinter.PrinterIndex <> lSavePrinterIndex)) then // 改变了打印机设置
        begin
          {          if TRMReport(FReport).ChangePrinter(liSavePrinterIndex, TRMReport(FReport).ReportPrinter.PrinterIndex) then
                    begin
                      TRMEndPages(FEndPages).Free;
                      FEndPages := nil;
                      TRMReport(FReport).PrepareReport;
                      Connect(FReport);
                    end
                    else
                    begin
                      Free;
                      Exit;
                    end;
                  }
        end;

        TRMReport(FReport).ColorPrint := chkColorPrint.Checked;
        THackReport(FReport).Flag_PrintBackGroundPicture := not chkTaoda.Checked;
        GetPageInfo(THackReport(FReport).ScalePageWidth, THackReport(FReport).ScalePageHeight, THackReport(FReport).ScalePageSize);
        THackReport(FReport).ScaleFactor := lForm.ScaleFactor;
        lNeedSave := (TRMReport(FReport).PrintOffsetTop <> PrintOffsetTop) or
          (TRMReport(FReport).PrintOffsetLeft <> PrintOffsetLeft);
        TRMReport(FReport).PrintOffsetTop := PrintOffsetTop;
        TRMReport(FReport).PrintOffsetLeft := PrintOffsetLeft;
        if rdbPrintAll.Checked then
          lPages := ''
        else if rbdPrintCurPage.Checked then
          lPages := IntToStr(FCurPage)
        else
          lPages := edtPages.Text;

        if lNeedSave then
          TRMReport(FReport).SaveReportOptions.SaveReportSetting(TRMReport(FReport), '');

        FPaintAllowed := False;
        try
          TRMReport(FReport).PrintPreparedReport(lPages, Copies, chkCollate.Checked,
            TRMPrintPages(cmbPrintAll.ItemIndex));
        finally
          Connect_1(FReport);
          RedrawAll(False);
        end;
      end;
    end;
  finally
    lForm.Free;
  end;
end;

procedure TRMPreview.PrintCurrentPage; //打印当前页
begin
  if (GetEndPages = nil) or (RMPrinters.Count = 2) then Exit;

  FPaintAllowed := False;
  try
    THackReport(FReport).Flag_PrintBackGroundPicture := TRMReport(FReport).PrintbackgroundPicture;
    THackReport(FReport).ScalePageSize := -1;
    THackReport(FReport).ScaleFactor := 100;

    TRMReport(FReport).PrintPreparedReport(IntToStr(CurPage), 1, TRMReport(FReport).DefaultCollate,
      rmppAll);
  finally
    RedrawAll(False);
  end;
end;

procedure TRMPreview.DlgPageSetup;
var
  tmpForm: TRMPageSetupForm;
  liEndPage: TRMEndPage;
  lPage: TRMCustomPage;
  i: Integer;
  w, lhRgn, p: Integer;
  lOldIndex: Integer;
begin
  if GetEndPages = nil then Exit;

  lOldIndex := RMPrinter.PrinterIndex;
  liEndPage := TRMEndPages(GetEndPages)[0];
  tmpForm := TRMPageSetupForm.Create(nil);
  try
    with tmpForm, liEndPage do
    begin
      PageSetting.PrinterName := RMPrinters.Printers[RMPrinter.PrinterIndex];
      PageSetting.Title := TRMReport(Report).ReportInfo.Title;
      PageSetting.DoublePass := TRMReport(Report).DoublePass;
      PageSetting.PrintBackGroundPicture := TRMReport(Report).PrintbackgroundPicture;
      PageSetting.ColorPrint := TRMReport(Report).ColorPrint;
      PageSetting.MarginLeft := RMFromMMThousandths(mmMarginLeft, rmutMillimeters);
      PageSetting.MarginTop := RMFromMMThousandths(mmMarginTop, rmutMillimeters);
      PageSetting.MarginRight := RMFromMMThousandths(mmMarginRight, rmutMillimeters);
      PageSetting.MarginBottom := RMFromMMThousandths(mmMarginBottom, rmutMillimeters);
      PageSetting.PageOr := PageOrientation;
      PageSetting.PageBin := PageBin;
      PageSetting.PageSize := PageSize;
      PageSetting.PageWidth := PageWidth;
      PageSetting.PageHeight := PageHeight;
      if PreviewPageSetup then
      begin
        if lOldIndex <> cmbPrinterNames.ItemIndex then
          TRMReport(Report).ChangePrinter(RMPrinter.PrinterIndex, cmbPrinterNames.ItemIndex);

        TRMReport(Report).ReportInfo.Title := PageSetting.Title;
        TRMReport(Report).DoublePass := PageSetting.DoublePass;
        TRMReport(Report).PrintbackgroundPicture := PageSetting.PrintbackgroundPicture;
        TRMReport(Report).ColorPrint := PageSetting.ColorPrint;

        mmMarginLeft := RMToMMThousandths(PageSetting.MarginLeft, rmutMillimeters);
        mmMarginTop := RMToMMThousandths(PageSetting.MarginTop, rmutMillimeters);
        mmMarginRight := RMToMMThousandths(PageSetting.MarginRight, rmutMillimeters);
        mmMarginBottom := RMToMMThousandths(PageSetting.MarginBottom, rmutMillimeters);

        PageOrientation := PageSetting.PageOr;
        PageBin := PageSetting.PageBin;
        p := PageSetting.PageSize;
        w := PageSetting.PageWidth;
        lhRgn := PageSetting.PageHeight;

        for i := 0 to TRMReport(Report).Pages.Count - 1 do
        begin
          lPage := TRMReport(Report).Pages[i];
          if lPage is TRMReportPage then
          begin
            TRMReportPage(lPage).mmMarginLeft := mmMarginLeft;
            TRMReportPage(lPage).mmMarginTop := mmMarginTop;
            TRMReportPage(lPage).mmMarginRight := mmMarginRight;
            TRMReportPage(lPage).mmMarginBottom := mmMarginBottom;

            TRMReportPage(lPage).ChangePaper(p, w, lhRgn, liEndPage.PageBin, liEndPage.PageOrientation);
          end;
        end;
        TRMReport(Report).SaveReportOptions.SaveReportSetting(TRMReport(Report), '');

        if Assigned(OnAfterPageSetup) then
          OnAfterPageSetup(PageSetting);
        if TRMReport(Report).CanRebuild then
        begin
          FPaintAllowed := False;
          //          SetLength(FVisiblePages, 0);
          TRMReport(Report).PrepareReport;
          Connect_1(Report);
        end;

        RedrawAll(True);
      end;
    end;
  finally
    tmpForm.Free;
  end;
end;

procedure TRMPreview.AddPage;
begin
  if FReport = nil then Exit;

  TRMEndPages(GetEndPages).InsertFromEndPage(TRMEndPages(GetEndPages).Count,
    TRMEndPages(GetEndPages).Pages[TRMEndPages(GetEndPages).Count - 1]);
  RedrawAll(False);
end;

procedure TRMPreview.InsertPageBefore;
var
  liEndPage: TRMEndPage;
  liPageNo: Integer;
begin
  if FReport = nil then Exit;

  if FCurPage > TRMEndPages(GetEndPages).Count then
  begin
    liEndPage := TRMEndPages(GetEndPages).Pages[TRMEndPages(GetEndPages).Count - 1];
    liPageNo := TRMEndPages(GetEndPages).Count - 1;
  end
  else
  begin
    liEndPage := TRMEndPages(GetEndPages).Pages[FCurPage - 1];
    liPageNo := FCurPage - 1;
  end;

  TRMEndPages(GetEndPages).InsertFromEndPage(liPageNo, liEndPage);
  TRMReport(FReport).Modified := True;
  RedrawAll(False);
end;

procedure TRMPreview.InsertPageAfter;
begin
  if FReport = nil then Exit;

  if FCurPage > TRMEndPages(GetEndPages).Count then
    AddPage
  else
  begin
    TRMEndPages(GetEndPages).InsertFromEndPage(FCurPage, TRMEndPages(GetEndPages).Pages[FCurPage - 1]);
    RedrawAll(False);
  end;
  TRMReport(FReport).Modified := True;
end;

procedure TRMPreview.DeletePage(PageNo: Integer);
begin
  if (FReport = nil) or (GetEndPages = nil) then Exit;

  if (PageNo >= 0) and (TRMEndPages(GetEndPages).Count > 1) then
  begin
    if MessageBox(0, PChar(RMLoadStr(SRemovePg)), PChar(RMLoadStr(SConfirm)),
      mb_YesNo + mb_IconQuestion) = mrYes then
    begin
      TRMEndPages(GetEndPages).Delete(PageNo);
      RedrawAll(True);
      TRMReport(FReport).Modified := True;
    end;
  end;
end;

⌨️ 快捷键说明

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