richview表格夸页的修改(源码)

主要是修改SclRVIew单元的CalculatePageCount函数
增加变量

vPageStartTableItemOffs: array of Integer; 存放夸页时,上一页已经绘制掉的东西

 vHasDrawOffs: Integer;    //表格跨页时,前页剩余的高度
 vCanOffsLines: Integer;   //剩余高度能显示多少行内容

procedure calculateTablePageCount(NumberingNote : Boolean);

        if not isRowSpan then
        begin
          GetRowHeight(StartRow, CRowTop, vRowHeight);
          //+ 如果当前行都大于页面 看看减去上一页画掉的部分后还大不大
          if (vRowHeight> pHeight) and (Result > 0) then
            vRowHeight:= vRowHeight- vPageStartTableItemOffs[Result - 1];
          //+

。。。。。。
            if isFirstItem then
            begin
              //+ 如果当前页连当前行都放不下,下一页还要从当前行的内容显示起
              if vRowHeight > pHeight then
                NextRow := StartRow;
              //+
              PageEndTableItem[Result] := srvCurItem.ItemNo;
              PageEndTableRow[Result] := StartRow;
              PageStartTableRow[Result + 1] := NextRow;
              if (NextRow > -1) then
                PageStartTableItem[Result + 1] := srvCurItem.ItemNo;
            end
。。。。。
            if isFirstItem then
            begin
              if StartRow = PageStartTableRow[Result] then
              begin
                vBottomOfPage := srvCurItem.MinTop +
                  Math.min(CRowTop - srvCurItem.MinTop + vRowHeight, pHeight);
                //+
                if vRowHeight > pHeight then
                begin
                  vHasDrawOffs := srvCurItem.MinTop + pHeight - vBottomOfPage; //距底部剩余的空间
                  vCanOffsLines := vHasDrawOffs div 16;                        //剩余空间能放下几行
                  if vCanOffsLines > 0 then
                  begin
                    vHasDrawOffs := vCanOffsLines * 16;
                    vBottomOfPage := vBottomOfPage + vHasDrawOffs;
                  end;
                  vPageStartTableItemOffs[Result] := vBottomOfPage - srvCurItem.MinTop + vPageStartTableItemOffs[Result - 1];
                end;
                //+
              end
。。。。。。
            else
            begin
              GetRowHeight(PriorRow, CRowTop, vRowHeight); //如果从第三行换到下一页,重新取第二行的相关信息做本页使用
              vBottomOfPage := srvCurItem.MinTop +
                Math.min(vCRowTop + vRowHeight - srvCurItem.MinTop, pHeight);
              //+
              vHasDrawOffs := srvCurItem.MinTop + pHeight - vBottomOfPage; //距底部剩余的空间
              vCanOffsLines := vHasDrawOffs div 16;                        //剩余空间能放下几行
              if vCanOffsLines > 0 then
              begin
                vHasDrawOffs := vCanOffsLines * 16;
                vBottomOfPage := vBottomOfPage + vHasDrawOffs;
                vPageStartTableItemOffs[Result] := vHasDrawOffs;
              end;
              //+
            end;


  //+
  SetLength(vPageStartTableItemOffs, 100);
  for vHdId := Low(vPageStartTableItemOffs) to High(vPageStartTableItemOffs) do
    vPageStartTableItemOffs[vHdId] := 0;
  vPageStartTableItemOffs[0] := 0;
  //+
  while (srvCurItem.DrawItemNo <= viDrawLinesCount) do  //循环 每一个line计算高度并计算页数
  begin
    isCanNextDrawItem := TRUE;
。。。。。。。
    if isFirstItem and (PageStartTableItem[Result] > -1) and //第一个item是上页跨过来的表格
      (PageStartTableRow[Result] > 0) then
    begin
      srvCurItem.Top := srvCurItem.Top + vTableItem.Cells[PageStartTableRow[Result], 0].Top;

      //+加上已经在上一页夸页处理时绘制掉的部分做为新的起始位置
      srvCurItem.Top := srvCurItem.Top + vPageStartTableItemOffs[Result - 1];
      //+

原文地址:https://www.cnblogs.com/coloregg/p/3063072.html