如何在DBText中换行显示并同时动态调整报表各元素的位置(100分)

B

Brier

Unregistered / Unconfirmed
GUEST, unregistred user!
打印中为了控制DBText的数据换行显示,并根据DBText需要的高度动态改变DetailBand和
QRShape(表格竖线)的高度以及DBText的Top,我在DBText的ONPrint事件中写了如下代码
(其中换行的处理是在参照了论坛上一位朋友的程序)。预览发现DetailBand和DBText的
Height都适当调整了,但QRShape却在第一行数据显示中没有变化,从第二行起才变为希望
的高度,苦恼:( 报表是静态创建的。
procedure Twebprint.DBText1Print(sender: TObject;var Value: String);
var
strSource, strTemp,controlsName : string;
charLen,iLen,DBTextWidth,TextWidth1,TextWidth2,Ti:Integer;
begin
strSource:=value;
Value := '';
i:=0;
while truedo
begin
i:=i+1;
iLen := 1;
DBTextWidth:=(sender as TQRDBText).width;
TextWidth1:=(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,Copy(strSource, 1, iLen-1));
TextWidth2:=(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,strSource[iLen]);
while ((DBTextWidth-TextWidth1)>=TextWidth2)do
begin
if(length(strSource)<iLen)
then
break;
if ord(strSource[iLen]) > 128
then
if(((sender as TQRDBText).width-(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,Copy(strSource, 1, iLen-1)))>=(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,strSource[iLen]+strSource[iLen+1]))
then
inc(iLen, 2)
else
break
else
inc(iLen);
TextWidth1:=(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,Copy(strSource, 1, iLen-1));
TextWidth2:=(sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,strSource[iLen]);
end;
dec(iLen);
strTemp := Copy(strSource, 1, iLen);
//加回车。
if Value = '' then
Value := strTemp
else
Value := Value + #13 + strTemp;
strSource := Copy(strSource, iLen + 1, Length(strSource) - iLen);
if((sender as TQRDBText).ParentReport.TextWidth((sender as TQRDBText).font,strSource)<=(sender as TQRDBText).width)then
begin
if ((Length(strSource))>0) then
begin
Value := Value + #13 + strSource;
i:=i+1;
end;
break;
end;
end;
(sender as TQRDBText).height:=(0-(sender as TQRDBText).Font.Height+1)+(0-(sender as TQRDBText).Font.Height+4) *(i-1)-2*(i-1);
if (BandHeight<((sender as TQRDBText).height+10))then
BandHeight:=(sender as TQRDBText).height+10;
(sender as TQRDBText).parent.Height:=BandHeight;
for i:=0 to (sender as TQRDBText).parent.ControlCount-1do
begin
controlsName:=(sender as TQRDBText).parent.Controls.Name;
//改变竖线的高度
if(pos('QRShape',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.Height :=(sender as TQRDBText).parent.Height;
//改变DetailBand下线的top
if (pos('detailBottomLine',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.top :=(sender as TQRDBText).parent.Height-2;
//改变DBText的top
if (pos('DBText',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.top :=round(((sender as TQRDBText).parent.Height-2)/2-(sender as TQRDBText).parent.Controls.Height/2) ;
end;

end;
 
问题出在第二部分,我把它单独提出来看起来清楚些,请各位朋友帮帮忙!
procedure Twebprint.DBText1Print(sender: TObject;var Value: String);
var
strSource, strTemp,controlsName : string;
charLen,iLen,DBTextWidth,TextWidth1,TextWidth2,Ti:Integer;
begin
//在DBText中的字符串中隔一定长度插入回车实现换行的程序,见上
//动态改变DTailBand中各元素的高度,i为前面程序得出的DBText中文本的行数
//改变DBText的高度
(sender as TQRDBText).height:=(0-(sender as TQRDBText).Font.Height+1)+(0-(sender as TQRDBText).Font.Height+4) *(i-1)-2*(i-1);
//改变DTailBand的高度
if (BandHeight<((sender as TQRDBText).height+10))then
BandHeight:=(sender as TQRDBText).height+10;
(sender as TQRDBText).parent.Height:=BandHeight;
//改变DETailBand中各元素的高度
for i:=0 to (sender as TQRDBText).parent.ControlCount-1do
begin
controlsName:=(sender as TQRDBText).parent.Controls.Name;
//改变竖线的高度
if(pos('QRShape',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.Height :=(sender as TQRDBText).parent.Height;

//改变DetailBand下线的top
if (pos('detailBottomLine',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.top :=(sender as TQRDBText).parent.Height-2;

//改变DBText的top
if (pos('DBText',controlsName)>0)
then
(sender as TQRDBText).parent.Controls.top :=round(((sender as TQRDBText).parent.Height-2)/2-(sender as TQRDBText).parent.Controls.Height/2) ;
end;

end;
预览时第一行的竖线高度没被改变,与创建时一样,从第二行开始才变到适合高度;各行中
DBText的top有个别也没有受预期的控制;其他的调整都实现了。
是不是我采用的方法有问题?请问还有更好的方法吗?
 
顶部