QRDBText打印的时候只能打印成一行,不能根据数据长度自动分行,如果数据太长的话纸就不够用了,QRMemo又不能数据库连接,怎么办,有QRDBMemo这样的控件吗?

解决方案 »

  1.   

    我用DBGridEh,它可以直接打印,并能达到自动分行的效果。这是它的控件包名称ehlib17,找找看。
      

  2.   

    *以下内容,我在C++ Builder 5中测试通过,你只要将它改为Delphi代码即可。将 -> 改为 . (访问属性/方法)
    将 = 改为 := (赋值)
    将 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 即可。
      

  3.   

    QRDBText可以分行,但不能自动分行,如果用Memo之类的分行输入,QRDBText->OK
      

  4.   

    我就是找不到QRDBMemo,谁能给我一个,谢谢了,我的邮箱:[email protected]
      

  5.   

    gong_hui2000(gong_hui2002) ,你说的根本就行不通!
      

  6.   

    使用一个Memo控件来中转一下就可以了。因为Memo可以自动换行,所以先用Memo来接受数据,然后再放到QRMemo就可以了。
    虽然比较烦,但是还是可以解决问题。
      

  7.   

    你留下E-mail地址,我给你发一个样例。
      

  8.   

    [email protected]
    老大,你最好还是直接给我一个ehlib for delphi6 吧
      

  9.   

    *我没有 ehlib for delphi6, 我基本上都使用 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;