public constructor Create(AOwner:TComponent); override; destructor Destroy(); override;
... //代码位置,其中 QRExpr2 是另外字段显示用的 TQRExpr
constructor TQuickReport1.Create(AOwner:TComponent); begin inherited Create(AOwner); oldHQR:=QRRichText1.Height; oldHGroup:=DetailBand1.Height; FBitmap:=TBitmap.Create(); FBitmap.Canvas.Font.Assign(QRRichText1.Font); end;destructor TQuickReport1.Destroy(); begin FBitmap.Free(); inherited Destroy(); end;procedure TQuickReport1.QRExpr2Print(sender: TObject; var Value: String); var w,d:Integer; h:Integer; begin QRRichText1.Lines.Text:=self.DataSet.fieldbyname('Description').AsString; w:=FBitmap.Canvas.TextWidth(self.DataSet.fieldbyname('Description').AsString); //计算字符串所占的宽度 h:=FBitmap.Canvas.TextHeight('T'); if(w>QRRichText1.ClientWidth) then begin d:=w div QRRichText1.ClientWidth; if((w mod QRRichText1.ClientWidth) >0 ) then d:=d+1; QRRichText1.Height:=oldHQR+h*(d-1); DetailBand1.Height:=oldHGroup+h*(d-1); end else begin QRRichText1.Height:=oldHQR; //恢复原高度,否则,它会一致沿用上一条数据的高度 DetailBand1.Height:=oldHGroup; end; end;
将 = 改为 := (赋值)
将 int h,cH,d; 改为 h,ch,d:Integer;QuickReport中有些显示的数据过长,会出现被后面显示的数据覆盖或覆盖后面的数据的情况。对于这种情况,只有使该字符串自动换行,才能彻底解决问题。控件TQRText, TQRMemo, TQRExpr, TQRDBText等都有 WorWrap 属性,可以通过该属性,改变控件的高度,达到换行目的。[步骤]
1.在Report创建的时候,记录下需要 调整高度的孔件 原始高度。[Create]
oldHQR=DetailBand->Height;2.在控件的 OnPrint事件中,利用报表本身的Canvas计算字符串所占的宽度像素(代码中,默认为报表的字体与本身控件的字体完全一样)。[OnPrint]
int h,cH,d;
cH=oldHQR; h=this->Canvas->TextWidth(Value); //计算字符串所占的宽度
if(h>QRExpr1->ClientWidth)
{
d=h/QRExpr1->ClientWidth+((h%QRExpr1->ClientWidth >0)? 1:0);
//cH;
QRExpr1->Height=cH*d;
QRGroup1->Height=oldHGroup+cH*(d-1);
}
else
{
QRExpr1->Height=oldHQR; //恢复原高度,否则,它会一致沿用上一条数据的高度
QRGroup1->Height=oldHGroup;
}
QRShape1->Top=QRGroup1->Height-2-QRShape1->Height; TQRExpr 可以替代 TQRDBText 功能:比较两者的用法:[TQRExpr:]TMyReport.DataSet:=<MyReportDataSet>;
TQRExpr.Expression:=<字段名称>;[TQRDBText:]TQRDBText.DataSet:=<MyReportDataSet>;
TQRDBText.FieldName:=<字段名称>;你只要将TQRExpr.AutoSize:=false; 并将它的宽度在设计时调好即可。我用中文简单测试过 TQRExpr 它的自动换行没有问题。如果你一定需要使用 TQRDBText,你可以用类似办法测试一下,看它是否可行1.Autosize:=false;
2.设计阶段调整好 宽度
3.WordWrap:=true;
4.使用前面的代码,调整 TQRDBText 的高度。*原理:字符串长度,可以用 TCanvas.TextWidth(xxx) 得到相同字体,字符集条件下所占用的像素 L
原来的 TQRDBText的宽度为 oldW
n:=L % oldW 可以得到字符串应该有多少行.
如果 L mod oldW 大于 0
n:=n+1;
将DetailBand.Heigth=(old DetailBand.Height)+oldH*n 即可。
虽然比较烦,但是还是可以解决问题。
老大,你最好还是直接给我一个ehlib for delphi6 吧
*样例已经发到 [email protected]贴出代码,与大家交流在我自己用Delphi6做时,发现一个新的问题:WordWrap并不起作用,我又用TLabel试了一下:输入"1234567890",发现它并不自动换行(AutoSize=false, WordWrap=ture), 而当输入"12345 67890"时,它会遇空格换行。
我猜想 TQRExpr 不换行与它可能很相似。我试了 TQRMemo, TQRExprMemo都是这样。最后,我用TQRRichText成功了。类申明位置
...
private
oldHQR:Integer;
oldHGroup:Integer; FBitmap:TBitmap;
public
constructor Create(AOwner:TComponent); override;
destructor Destroy(); override;
... //代码位置,其中 QRExpr2 是另外字段显示用的 TQRExpr
constructor TQuickReport1.Create(AOwner:TComponent);
begin
inherited Create(AOwner); oldHQR:=QRRichText1.Height;
oldHGroup:=DetailBand1.Height; FBitmap:=TBitmap.Create();
FBitmap.Canvas.Font.Assign(QRRichText1.Font);
end;destructor TQuickReport1.Destroy();
begin
FBitmap.Free();
inherited Destroy();
end;procedure TQuickReport1.QRExpr2Print(sender: TObject; var Value: String);
var
w,d:Integer;
h:Integer;
begin
QRRichText1.Lines.Text:=self.DataSet.fieldbyname('Description').AsString; w:=FBitmap.Canvas.TextWidth(self.DataSet.fieldbyname('Description').AsString); //计算字符串所占的宽度
h:=FBitmap.Canvas.TextHeight('T');
if(w>QRRichText1.ClientWidth) then begin
d:=w div QRRichText1.ClientWidth; if((w mod QRRichText1.ClientWidth) >0 ) then
d:=d+1; QRRichText1.Height:=oldHQR+h*(d-1);
DetailBand1.Height:=oldHGroup+h*(d-1);
end else begin
QRRichText1.Height:=oldHQR; //恢复原高度,否则,它会一致沿用上一条数据的高度
DetailBand1.Height:=oldHGroup;
end;
end;