如何在QuickReport中的TQRDBText自动换行很急的先谢谢了。

解决方案 »

  1.   

    fancier(OP&&C/C++)你可以参考
    http://expert.csdn.net/Expert/topic/1314/1314396.xml?temp=.6958734
    http://expert.csdn.net/Expert/topic/1351/1351063.xml?temp=.9529535
    http://expert.csdn.net/Expert/topic/1265/1265250.xml?temp=.2919428
    http://expert.csdn.net/Expert/topic/1302/1302834.xml?temp=.9411737
    http://expert.csdn.net/Expert/topic/1282/1282681.xml?temp=.8808863不过,我自己试过TQRDBText(已经修改了里面QRCtrls单元中的AddWord过程)、QRmemo都不能解决自动换行的问题。
    我自己的解决方法如下:
    1.在需要显示换行的字段的地方用TQRMemo替代TQRDBText,并调整好TQRMemo的长度和宽度(显示字段的最大范围);
    2.在报表所在的Form上放一个TMemo控件,由它来负责解决换行问题,在TQRMemo所在的band的BeforePrint事件中写代码,具体如下
    var
      i: integer;
    begin
      memo1.lines.clear;
      TQRMemo.lines.clear;
      memo1.width:= TQRMemo.Width;
     memo1.lines.text:= ADODataSet1.FieldByName('字段名').AsString;
      for i:= 0 to memo1.lines.Count - 1 do
        QRMemo.lines.Add(memo1.lines.strings[i]);
    end;
    只要在需要的地方依上面的方法处理就行。
      

  2.   

    QRDBText 不能换行
    用QRRichText
    如果要显示两行,在QRRichText中敲回车一次
    如果要显示三行,在QRRichText中敲回车两次
    依次类推
      

  3.   

    to :things(平)
       我按照你的方法试了一下,单步运行没问题,可是QRMemo就是显示不出来,多谢指教!
      

  4.   

    procedure autochangerow(wide: integer;
      var value: string);
    var
       temparr:array of string;
       widelen,i,j:integer;
       s:widestring;
    begin
       j:=1;
       s:=value;
       widelen:=length(s);
       setlength(temparr,j);
       temparr[0]:='';
       for i:=1 to widelen do
          begin
             if length(temparr[j-1])+length(s[i])>wide then
                begin
                   j:=j+1;
                   setlength(temparr,j);
                   temparr[j-1]:=s[i];
                end
             else
                begin
                    temparr[j-1]:=temparr[j-1]+s[i];
                end;
          end;
       s:='';
       for i:=0 to length(temparr)-2 do
           s:=s+temparr[i]+chr(13);
       value:=s+temparr[length(temparr)-1];
       temparr:=nil;end;在QRDBText的ONPRINT事件中写如下代码
    procedure Tshaminputrptform.qrdbtxt_namePrint(sender: TObject;
      var Value: String);
    begin
       autochangerow(39,value);
    end;
    函数中WIDE参数为一行长度,汉字不会乱码
      

  5.   

    以下是我收藏的最好的解决方法procedure QrDbTextOnPrint(sender: TObject; var Value: String);
    var
      i : integer;
    begin
      FMemo := TMemo.Create(FWinControl);  FMemo.Parent := self; //是报表所在的窗体
      FMemo.Width := Tcontrol(sender).Width;
      FMemo.height := Tcontrol(sender).Height;  FMemo.Text := Value;               
      Value := FMemo.Lines[0];
      For i:= 1 to FMemo.Lines.Count-1 do
        value := value + #13 + FMemo.Lines[i];
      FMemo.Free;