bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Delphi QuickReport 報表元件 TQRDBText 中文不會自動換行
查看: 12756|回復: 5
go

TQRDBText 中文不會自動換行 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2010-3-30 16:53 |只看該作者 |正序瀏覽 |打印
設計 QuickReport 的報表

已將 QRDBText 元件的屬性設定如下:

AutoSize := False;
AutoStretch := True;
WordWrap := True;

在英文資料時會換行,但在中文資料時就沒有換行
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

6#
發表於 2010-3-30 21:12 |只看該作者
  1. function ChiWrap(Memo : String;LineLen : Integer) : String;
  2. var
  3.   MemoList, ResultList : Tstrings;
  4.   i : integer;
  5.   WS : WideString;
  6. begin
  7.   MemoList := TStringList.Create;
  8.   ResultList := TStringList.Create;
  9.   try
  10.       MemoList.Text := Memo;
  11.       for i := 0 to MemoList.Count -1 do
  12.       begin
  13.       WS := MemoList[i];
  14.       while Length(WS) > LineLen do
  15.       begin
  16.       ResultList.Add(Copy(WS,0,LineLen));
  17.       WS := Copy(WS,LineLen+1,Length(WS));
  18.       end;
  19.       ResultList.Add(WS);
  20.       end;
  21.       Result := ResultList.Text;
  22.   finally
  23.       MemoList.Free;
  24.       ResultList.Free;
  25.   end;
  26. end;

  27. procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
  28. begin
  29.   QRLabel1.Caption := ChiWrap(Table1.FieldByName('ChiDesc').AsString,40);
  30. end;
複製代碼
寫在 QRLabel 的 BeforePrint 事件或該 band 的 BeforePrint 事件都可以

參考來源
http://delphi.ktop.com.tw/board. ... d=100&tid=27799
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

5#
發表於 2010-3-30 20:47 |只看該作者
QuickReport里TQRText对中文居然不能正确换行,即使设置了WordWarp属性为True。QuickReport就是Bug多多,现在Delphi已经改带Rave,QuickReport已经被抛弃了,估计它的开发工作也快停止了。可是有时候遇到历史遗留问题,还是不得不面对它的。为了这个不能换行的问题郁闷了好久。有人采用直接改正QuickReport源代码里的AddWord方法,似乎一劳永逸啊,可是改起来还是有点难度的。当多人合作的时候,其他人也得改。在网上看到一个利用TMemo的自动换行功能来解决问题的方法,感觉不错。我也想过相似的思路,不过我想的是TRichEdit。不过发现一个bug,TRichEdit里不能显示字符“°”(度数 ),TQRRichText也一样,会出现“RichEdit line insert error”。恰好我做的报表包括字符“°”,恰好撞上,所以我的方法失败了。估计这是Borland在实现TRichEdit时的Bug。而TMemo就可以显示“°”。
具体说一下利用TMemo的解决方法:
1.在报表所在的Form上放一个TMemo控件Memo1,一个就够,由它来负责解决换行问题
2.在需要显示换行的字段的地方用TQRMemo替代TQRDBText,并调整好TQRMemo的长度和宽度(显示字段的最大范围);
3.在TQRMemo所在的band的BeforePrint事件中调用PrepareQRMemo
  1. procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
  2. begin
  3. ...
  4. PrepareQRMemo(qrmmBZ, '备注');
  5. ...
  6. end;

  7. procedure TForm1.PrepareQRMemo(aQRMemo: TQRMemo; FieldName: string);
  8. begin
  9.   Memo1.Lines.Clear;
  10.   Memo1.Width := aQRMemo.Width;
  11.   Memo1.Lines.Text := ds.FieldByName(FieldName).AsString;
  12.   aQRMemo.Lines.Assign(Memo1.Lines);
  13. end;
複製代碼
參考來源 http://arming.ycool.com/post.610253.html
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

4#
發表於 2010-3-30 20:35 |只看該作者
一個更簡單的方法:
1. 加一個 TQRRichText
2. 在該 TQRRichText 的 band 的 BeforePrint 事件中,加入以下以下程式碼
  1. procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
  2. begin
  3.   QRRichText1.Lines.Clear;
  4.   QRRichText1.Lines.Add(Query1.FieldByName(欄位名稱).AsString);
  5. end;
複製代碼
參考來源
http://delphi.ktop.com.tw/board. ... id=66&tid=41104
http://delphi.ktop.com.tw/board. ... d=100&tid=44298
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

3#
發表於 2010-3-30 17:17 |只看該作者
看到另一個辦法就是放一個 TMemo 元件來幫忙負責換行,把換好行後的 Lines 再 Assign 回來即可。
  1. procedure TqrWeekQA.QRDBTxtInTimePrint(sender: TObject; var Value: String);
  2. var  I: Integer;
  3. begin
  4.   with Sender as TQRDBText do
  5.   begin
  6.     meCutWord.Font.Assign(Font); //指定字型
  7.     meCutWord.Width := Width;    //指定寬度
  8.     meCutWord.Lines.Clear;       //清除上一次的東西
  9.     meCutWord.Lines.Text := Value; //把 value assign 進去
  10.     Value := meCutWord.Lines.Strings[0];
  11.     for I := 1 to meCutWord.Lines.Count - 1 do
  12.     begin
  13.       Value := Value + #13 + meCutWord.Lines.Strings; //逐行取出再塞回去
  14.     end;
  15.   end;
  16. end;
複製代碼
參考來源
http://vclxx.org/forum/index.php?topic=22428.0
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2025-6-17 17:11 , Processed in 0.018743 second(s), 11 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.