会否BUG!关于TQRDBText的折行问题!

hostname 2000-09-20 11:28:00
我想实现报表打印时,若太长的话则进行折行,程序中已设置autoStretch为true以及wordWrap为true,但打印时会出现如下问题(数据来源于SQL Server)
若数据为汉字如‘中国程序员开发网络’或‘A B C D E F G H I J’或‘1 2 3 4 5 6 7 8 9’打印的结果是可以折行如‘中国程序开发 ‘A B C D E F ‘1 2 3 4 5 6
网络’ G H I J’ 7 8 9 '
若数据为‘ABCDEFGHIJKLM’或‘1234567890’亦或‘A.B.C.D.E.F.G’或‘1.2.3.4.5.6.7’
打印的结果则为‘ABCDEFGH’或‘12345678’或‘A.B.C.D.E.’或‘1.2.3.4.5.’即不能实现折行的功能

请各位大虾指点迷津!
...全文
197 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdygis 2001-09-22
  • 打赏
  • 举报
回复
你用的一定是Delphi5以上的版本,在Delphi4中QRDBText是可以换行的。不过关系也不大,可以用以下方法解决:
1、首先,做一个函数控制字符串换行;
Function MitiLine (Str:String;N:Integer):String;
var L,I:Integer;
Strs:String;
Begin
L:=Length(Str);
L:=Round(L/N+0.5);
If L=0 Then
begin
Result:=Str;
Exit;
End;
For I:=1 To L Do Strs:=Strs+Copy(Str,N*(I-1)+1,N)+#13;
Result:=Strs;
End;

其中:Str是要控制的字符串,N是一行显示的字符数(注意汉字为双字符)。

2、然后,在报表打印前调用该函数。
如:
QRDBText1.Caption:=MitiLine(QRDBText1.Caption,24);
Preview;
这样就可以了。
llhh 2001-09-22
  • 打赏
  • 举报
回复
用TQRDBText办不到,我有一个报表控件,可以随心所欲地打印。
yyzzbb@chinese.com
BlackApple 2001-09-22
  • 打赏
  • 举报
回复
老兄?我觉得是BUG了,因为我根据DELPHI本身的帮助(他有一个这方面的提示步骤)去做也是白搭,很烦躁的呢,把我给还哭了
flyby 2000-09-22
  • 打赏
  • 举报
回复
但他也不能将1234567890当成英语单词呀
liang_z 2000-09-21
  • 打赏
  • 举报
回复
这应该是一个Windows的多语言支持功能,如果是一个中间没有空格的
字符串,Windows会把它作为一个单词来进行处理,而同一个单词一般
不会进行分行的。如果真要分行那真是您老的不幸啊!
方便quickreport控件自动换行问题 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Grids, DBGrids; type TForm1 = class(TForm) DBGrid1: TDBGrid; BitBtn1: TBitBtn; btnPrev: TBitBtn; btnPrt: TBitBtn; btnExit: TBitBtn; Memo1: TMemo; procedure btnPrevClick(Sender: TObject); procedure btnPrtClick(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure btnExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2,Unit3; {$R *.dfm} procedure TForm1.btnPrevClick(Sender: TObject); begin //调用QuickReport3模块 if Not Assigned(Form3) then Form3 := TForm3.Create(Application); //预览 Form3.QuickReport3.preview; end; procedure TForm1.btnPrtClick(Sender: TObject); begin //调用QuickReport3模块 if Not Assigned(Form3) then Form3 := TForm3.Create(Application); //打印 //Form3.QuickReport3.PreviewModal; Form3.QuickReport3.PrinterSetup; Form3.QuickReport3.Print; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin with DM.ADOQyp do begin close; sql.Clear; sql.Add(' select BM,MC from zd_yp where bm like ''04443'' '); open; end; //Form3.QRMemo1.Lines.Text:= DM.ADOQyp.FieldValues['MC'].AsString; //Form3.QRMemo1.Lines.Text:= DM.ADOQyp.FieldByName('MC').AsString; //Form3.QRMemo1.Lines.Text:= Memo1.Text; Form3.QRRichText1.Lines.Text := DM.ADOQyp.FieldByName('MC').AsString; end; procedure TForm1.btnExitClick(Sender: TObject); begin close; end; end.
一、 简单了解各控件功能   以下是各控件最简单的使用功能,其他功能依具体的实现而介绍。  TquickRep:带有坐标,作为其他报表控件(如TQRBand)的容器,它的Band属性可以自动添加各种类型的TQRBand.   TQRLabel:打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel , Caption的内容就打印出来的内容。   TQRDBText:打印数据库字段值,一个值一行。作用象TDBText.把它的DataSet , DataField分别赋予Table1,Company时,将打印Table1所指向的表的Company字段的内容。   TQRSysData:打印系统信息如时间,页码,报表头等。   TQRMemo:非常象TQRLabel,只是它可以打印多行,也是打印静态数据。   TQRRichText:打印RichText格式,能够连接到一个Form上的RichEdit控件并打印它的内容,不过必须是32位版本的。   TQRShape:打印方框、圆和垂直、水平线。   TQRImage:打印静态的图片,包括(BMP,WMF,ICON).   TQRDBImage:从数据库接收图片。   TQRBand:用来确定报表的不同位置应该显示什么内容,它上面可以放控件(参见二)。   TQRGoups:Groups可以不限级别的组操作。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作。   二、 报表的控件摆放循序   出现在所有页上的标题(PageHeader)   标题(只有首页才有)(Title)   所有列的标题(ColumnHeader)   记录的内容,一个字段一列(Detail)   摘要(最后一页才有)(Summary)   出现在所有页上的页脚(PageFooter)   这些根据设置不同的Band(不是控件,一种类型而已,在其上面可以放其他控件)来定位。总共有六种Band。   三、 一个简单的例子   这个例子制作打印一张表的部分字段名及该字段数据内容的报表。   建立一个新project   放一个TTable到Form上,DatabaseName设为BCDEMOS,TableName指向Customer表,Active设为true.   放一个TquickRep控件在Form上,DataSet属性为Table1.(即要显示上边Table1所指向的表的内)。   展开TquickRep的Bands属性,设HasDetail为true,这时自动增加个detail band(一个TQRBand控件,故也可以直接放一个TQRBand控件,BandType属性设为detail就行了)。   放一个TQRDBText控件在detail band上面,设DataSet指向Table1,DataField指向Company。第四步是设置在报表的什么位置显示什么类型的数据,而TQRDBText则具体实现。   选TquickRep控件,按右键,选择”Preview”预览,应该看到表Customer的字段Company的所有字段值。  到这一个简单的例子就OK了,程序实现预览及利用TQRuickRep自带的打印功能只须在Form中加一个按钮,它的OnClick事件为:QuickRep1->Preview();  四、一个使用TQRGoups、TQRExpr控件的报表   该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(groups中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在Unknown state下面。  建立一个新project。   放一个Tquery在Tquickrep上,其SQL属性为:select * from customer order by State,Company;(即根据州、公司排序),DatabaseName为BCDMome,Active为true.   放一个TquickRep控件在Form1上,DataSet为Tquery1.   放一个TQRGroups控件在TquickRep上,这时默认为group header。(任何时候当group中断或更高级别的group中断,这个header都将打印出来,如果有表达式,根据表达式的值显示内容。)接着添加一个group footer band,添加时,放一个TQRBand控件在报表上,连接TQRGroups的FooterBand属性到这个QRBand,这时这个新建的TQRBand就成为Group Footer. (TQRGroup的一个重要特性是表达式,任何时候当表达式的值变时Group都将中断,如表达式是按省列出城市名,当前列出广东省,当属于该省的城市列完后,表达式值改变,这时Group中断,接着显示其他省的城市名。)TQRGroups的Expression属性设为Query1.State(根据不同的州来中断)。   放一个TQRBand控件在报表上,BandType为rbDetail.   放一个TQRExpr控件在group header上面,其Expression属性为:if(State<>’’,State,’Unknown state’),即如果公司的州没填,就归入Unknown state,否则归入State.   放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company,Contact,Phone.   在放一个TQRExpr控件在group Footer上面,Expression为’Customers in’+State+’:’+Str(Count) 作用是在每个州的公司列完后显示该州总共有多少个公司。   按右键选预览,应该看到不同的州名及其公司和公司公司总数。  五、QuickReport 条件式列印   可以直接在 TQuickReport 的 OnFilter 事件中写明条件判断,OnFilter事件的引数中有一个以 var 宣告的 PrintRecord 布林型态变数,将这个变数设为 True(预设值), 该笔记录便会印出;反之, 设为False,就不印出这笔记录. procedure TForm1.QuickReport1Filter(var PrintRecord: Boolean); begin PrintRecord := False; if YourTable.FieldByName(‘WantedField‘).AsInteger <= 100 then Exit; if YourTable.FieldByName(‘WantedField‘).AsInteger >= 150 then Exit; PrintRecord := True;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧