• 从某行开始续打当前页


    从某行开始续打当前页

    环境:

    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行代码,即可最简单的完成从指定行续打。

    存在问题:

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

  • 相关阅读:
    LinkedList源码解析
    HashMap源码解析
    HashMap和Hashtable区别
    arcgis api for js 之网络分析服务发布
    arcgis api for js 之发布要素服务
    arcis api for js 值 3.17 本地部署
    ArcGIS 产品体系结构
    layui select下拉框选项不显示
    windows10企业版2016长期服务版激活
    PHP常见的输出语句
  • 原文地址:https://www.cnblogs.com/coloregg/p/2580931.html
Copyright © 2020-2023  润新知