从某行开始续打当前页

从某行开始续打当前页

环境:

Windwos7 旗舰版;

DelphiXE2 Update2;

RichView版本13.10.1

原理:

在最终发给打印画布之前,处理要打印的内容(画布上的图),即获取到要打印的起始行的位置,将此位置之前的所有内容都“涂“为白色;

实现步骤:

1.在TSRichViewEdit中增加两个变量

    // 续打起始位置 ColorEgg  2012-7-6 23:20:48

    UseSequelPrint: Boolean;//初始化为False

    SequelPos: Integer;//初始化为0

在PaintPage中,处理续打的最后效果

具体伪代码如下,有ColorEgg的注释处为改动

procedure TSRichViewEdit.PaintPage(PageNo: Integer; Canvas: TCanvas;

  ScaleX, ScaleY: Single; PageRect, PaintRect, RClient: TRect;

  OffsetX, OffsetY: Integer; Printing: Boolean);

Var

begin

    with OldRect do

      hRegion := CreateRectRgn(Left, Top, Right, Bottom);

    SelectClipRgn(Canvas.Handle, hRegion);

    DeleteObject(hRegion);

  end;

  if not UseSequelPrint then //ColorEgg 正常打印

  begin

    // drawing Page Number

    if (FPageProperty.FPageViewMode) and (not FPageProperty.ShowPageBreaks) and

       FPageProperty.PageNoVisible and (PageNo >= FPageProperty.FPageNoFirst) and

       (not Printing or IsInPrintingRange(PageEndItemNo[PageNo - 1])) then

    begin

      …

    end;

 

    {$IFNDEF RVDONOTUSESEQ}

    If (PageStartDrawItemNo[PageNo - 1] <> -1) then

      …

    If not Printing or IsInPrintingRange(PageEndItemNo[PageNo - 1]) then

      …

    {$ENDIF}

    If not Printing or IsInPrintingRange(PageStartItemNo[PageNo - 1]) then

    begin

      …

    end;

 

    if Assigned(FOnPaintPage) and

      (not Printing or IsInPrintingRange(PageEndItemNo[PageNo - 1])) then

    begin

      …

    end;

  end

  else   // ColorEgg 处理续打

  begin

    tmp := PaintRect;

    tmp.Bottom := SequelPos;

    Canvas.FillRect(tmp);

  end;

  //  SetWorldTransform(Canvas.Handle, OldXForm);

  RestoreCanvasZoom(Canvas, OldInfo);

end;

上面的代码和原文有11行不一样,包括begin、else、end所占的行。

2.在按行续打按钮的事件中写

procedure TForm1.btnPrintCurLineClick(Sender: TObject);

var

  vPt: TPoint;

  vDocMs: TMemoryStream;

begin

  try

    vDocMs := TMemoryStream.Create;

    srvEdoc.RichViewEdit.SaveRVFToStream(vDocMs, False);

    vDocMs.Position := 0;

    srvEdocPrint.LoadRVFFromStream(vDocMs);

    srvEdocPrint.CurrentPage := srvEdoc.CurrentPage;

    vPt := srvEdoc.CaretPos;

    srvEdocPrint.UseSequelPrint := True;

    srvEdocPrint.SequelPos := vPt.Y;

    srvEdocPrint.PrintCurrent;

  finally

    FreeAndNil(vDocMs);

  end;

end;

其中,srvEdoc为编辑所用的TSRichViewEdit,srvEdocPrint为处理打印用的TSRichViewEdit,本例中这样做的原因是:打印时要对页面做一些“硬”处理,如果和编辑用同一个的话,会影响到编辑的所见,这样通过增加不到20行代码,即可最简单的完成从指定行续打。

存在问题:

上面讲的只适合从指定的文本行开始打印当前页,如果从表格中指定行续打会发生偏移,需要用另外的方法处理,不在本例讨论范围之内。

posted @ 2012-07-07 22:01  彩蛋  阅读(1582)  评论(0编辑  收藏  举报