主要是修改SclRVIew单元的CalculatePageCount函数
增加变量
vPageStartTableItemOffs: array of 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];
//+