从某行开始续打当前页
环境:
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行代码,即可最简单的完成从指定行续打。
存在问题:
上面讲的只适合从指定的文本行开始打印当前页,如果从表格中指定行续打会发生偏移,需要用另外的方法处理,不在本例讨论范围之内。