主要是修改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/archive/2013/05/06/3063072.html
相关资源:RichView Demo