请你们推荐一种对中文比较适应的报表工具。我的程序报表中需要对一些较长的中文段进行折行处理,可是不管是QuickReport还是ReportBuilder、FastReport等等所谓的先进控件,都无法实现对中文的正常折行处理。特别是ReportBuilder4.XX版,花了我十几个小时下载(我的56K猫迈着0.1K/S的速度),谁知试用一下,还是有问题。我真想狠狠地踩它一脚。
如果没有现成的控件,也请大家介绍一下如何用标准的报表控件实现。
6 个解决方案
#1
不如自己画吧,用djprint 下面是他的一段折行处理:
你如果需要我可以寄一份。
不过就是程序写起来可能麻烦一些,当然有失就有得,对打印机的控制会更自如。
procedure Thxpreviewform.ExtPrint(x,y:integer;Text:string);//x,y单位:0.1毫米
var
i,ij,LineNum,iTemp,HanziNum:integer;
szTemp:string;
begin
itemp:=0;
if not wordWrap then PrintText(x,y,Text)
else
begin
if maxlength=0 then begin printText(x,Y,text);exit;end;
i:=0;LineNum:=0;ij:=1;
HanziNum:=0;
repeat
i:=i+1;
szTemp:=copy(text,ij,i-ij+1);
itemp:=itemp+strLength(text[i]);
if text[i]>#127 then HanziNum:=HanziNum+1
else HanziNum:=0;
if ((iTemp+(i-ij)*WordSpace)>maxLength) or (i=length(Text)) then
begin
if i=length(text) then
begin
szTemp:=copy(text,ij,i-ij+1);i:=i+1;
end
else
if odd(HanziNum) then
begin szTemp:=copy(text,ij,i-ij-1);i:=i-2;end
else
begin szTemp:=Copy(Text,ij,i-ij);i:=i-1;end;
ij:=i;i:=i-1;LineNum:=LineNum+1;
if LineNum>1 then y:=Y+LineSpace+strHeight(szTemp);
printText(x,y,szTemp);
itemp:=0;HanziNum:=0;
end;
until i>=length(Text);
end;
end;
你如果需要我可以寄一份。
不过就是程序写起来可能麻烦一些,当然有失就有得,对打印机的控制会更自如。
procedure Thxpreviewform.ExtPrint(x,y:integer;Text:string);//x,y单位:0.1毫米
var
i,ij,LineNum,iTemp,HanziNum:integer;
szTemp:string;
begin
itemp:=0;
if not wordWrap then PrintText(x,y,Text)
else
begin
if maxlength=0 then begin printText(x,Y,text);exit;end;
i:=0;LineNum:=0;ij:=1;
HanziNum:=0;
repeat
i:=i+1;
szTemp:=copy(text,ij,i-ij+1);
itemp:=itemp+strLength(text[i]);
if text[i]>#127 then HanziNum:=HanziNum+1
else HanziNum:=0;
if ((iTemp+(i-ij)*WordSpace)>maxLength) or (i=length(Text)) then
begin
if i=length(text) then
begin
szTemp:=copy(text,ij,i-ij+1);i:=i+1;
end
else
if odd(HanziNum) then
begin szTemp:=copy(text,ij,i-ij-1);i:=i-2;end
else
begin szTemp:=Copy(Text,ij,i-ij);i:=i-1;end;
ij:=i;i:=i-1;LineNum:=LineNum+1;
if LineNum>1 then y:=Y+LineSpace+strHeight(szTemp);
printText(x,y,szTemp);
itemp:=0;HanziNum:=0;
end;
until i>=length(Text);
end;
end;
#2
不妨在前面的问题中找一下,有一个推荐ehlib152控件的贴子.我觉得这个控件相当好用,
可以在打印时实现对中文的正常折行处理,
可惜忘了下载的站点,也来不及帮你查了
可以在打印时实现对中文的正常折行处理,
可惜忘了下载的站点,也来不及帮你查了
#3
还有,
在http://www.nease.net/~bozhi里下载一个EReport控件(有源码),
也可以实现对中文的正常折行处理
在http://www.nease.net/~bozhi里下载一个EReport控件(有源码),
也可以实现对中文的正常折行处理
#4
sky_horse:
我下载了你推荐的EReport控件,并试验了它的DEMO。可惜我在运行DEMO时,我按下打印报表(一),出现以下错误:
EReadError With message '属性不存在'。
EConvertError with message 'No argument for format '%s''
No argument for format '%s'
没有预览画面,倒是在TEMP目录下生成了几个TMP文件,用它的专用编辑器可以打开看到报表的内容。
可惜,一个不错的控件,太多的BUG。
所以,请原谅不能给分。
我下载了你推荐的EReport控件,并试验了它的DEMO。可惜我在运行DEMO时,我按下打印报表(一),出现以下错误:
EReadError With message '属性不存在'。
EConvertError with message 'No argument for format '%s''
No argument for format '%s'
没有预览画面,倒是在TEMP目录下生成了几个TMP文件,用它的专用编辑器可以打开看到报表的内容。
可惜,一个不错的控件,太多的BUG。
所以,请原谅不能给分。
#5
'属性不存在'的原因:
1.可能是delphi版本的问题,你是用的d5吗? 我也在为d5下用Ereport头痛呢!
2.我以前是在d3下用,记得也曾出现过'属性不存在'的问题,后来好像是把工作目录
定为程序所在的目录才用好的,你出的问题也可能是demo去找不到放着TEP文件的
TEMP目录.
要不然到http://www.nccsoft.com/delphi/vcl_lst/grids1.htm去下载俄ehlib1.52
罢,d3-d5都能用,这可是i/o共用的控件哟!
1.可能是delphi版本的问题,你是用的d5吗? 我也在为d5下用Ereport头痛呢!
2.我以前是在d3下用,记得也曾出现过'属性不存在'的问题,后来好像是把工作目录
定为程序所在的目录才用好的,你出的问题也可能是demo去找不到放着TEP文件的
TEMP目录.
要不然到http://www.nccsoft.com/delphi/vcl_lst/grids1.htm去下载俄ehlib1.52
罢,d3-d5都能用,这可是i/o共用的控件哟!
#6
Very easy!!!
1、设置autosize=false后将DBEDIT控件拉到折行宽度;
2、autostretch=true即可
1、设置autosize=false后将DBEDIT控件拉到折行宽度;
2、autostretch=true即可
#1
不如自己画吧,用djprint 下面是他的一段折行处理:
你如果需要我可以寄一份。
不过就是程序写起来可能麻烦一些,当然有失就有得,对打印机的控制会更自如。
procedure Thxpreviewform.ExtPrint(x,y:integer;Text:string);//x,y单位:0.1毫米
var
i,ij,LineNum,iTemp,HanziNum:integer;
szTemp:string;
begin
itemp:=0;
if not wordWrap then PrintText(x,y,Text)
else
begin
if maxlength=0 then begin printText(x,Y,text);exit;end;
i:=0;LineNum:=0;ij:=1;
HanziNum:=0;
repeat
i:=i+1;
szTemp:=copy(text,ij,i-ij+1);
itemp:=itemp+strLength(text[i]);
if text[i]>#127 then HanziNum:=HanziNum+1
else HanziNum:=0;
if ((iTemp+(i-ij)*WordSpace)>maxLength) or (i=length(Text)) then
begin
if i=length(text) then
begin
szTemp:=copy(text,ij,i-ij+1);i:=i+1;
end
else
if odd(HanziNum) then
begin szTemp:=copy(text,ij,i-ij-1);i:=i-2;end
else
begin szTemp:=Copy(Text,ij,i-ij);i:=i-1;end;
ij:=i;i:=i-1;LineNum:=LineNum+1;
if LineNum>1 then y:=Y+LineSpace+strHeight(szTemp);
printText(x,y,szTemp);
itemp:=0;HanziNum:=0;
end;
until i>=length(Text);
end;
end;
你如果需要我可以寄一份。
不过就是程序写起来可能麻烦一些,当然有失就有得,对打印机的控制会更自如。
procedure Thxpreviewform.ExtPrint(x,y:integer;Text:string);//x,y单位:0.1毫米
var
i,ij,LineNum,iTemp,HanziNum:integer;
szTemp:string;
begin
itemp:=0;
if not wordWrap then PrintText(x,y,Text)
else
begin
if maxlength=0 then begin printText(x,Y,text);exit;end;
i:=0;LineNum:=0;ij:=1;
HanziNum:=0;
repeat
i:=i+1;
szTemp:=copy(text,ij,i-ij+1);
itemp:=itemp+strLength(text[i]);
if text[i]>#127 then HanziNum:=HanziNum+1
else HanziNum:=0;
if ((iTemp+(i-ij)*WordSpace)>maxLength) or (i=length(Text)) then
begin
if i=length(text) then
begin
szTemp:=copy(text,ij,i-ij+1);i:=i+1;
end
else
if odd(HanziNum) then
begin szTemp:=copy(text,ij,i-ij-1);i:=i-2;end
else
begin szTemp:=Copy(Text,ij,i-ij);i:=i-1;end;
ij:=i;i:=i-1;LineNum:=LineNum+1;
if LineNum>1 then y:=Y+LineSpace+strHeight(szTemp);
printText(x,y,szTemp);
itemp:=0;HanziNum:=0;
end;
until i>=length(Text);
end;
end;
#2
不妨在前面的问题中找一下,有一个推荐ehlib152控件的贴子.我觉得这个控件相当好用,
可以在打印时实现对中文的正常折行处理,
可惜忘了下载的站点,也来不及帮你查了
可以在打印时实现对中文的正常折行处理,
可惜忘了下载的站点,也来不及帮你查了
#3
还有,
在http://www.nease.net/~bozhi里下载一个EReport控件(有源码),
也可以实现对中文的正常折行处理
在http://www.nease.net/~bozhi里下载一个EReport控件(有源码),
也可以实现对中文的正常折行处理
#4
sky_horse:
我下载了你推荐的EReport控件,并试验了它的DEMO。可惜我在运行DEMO时,我按下打印报表(一),出现以下错误:
EReadError With message '属性不存在'。
EConvertError with message 'No argument for format '%s''
No argument for format '%s'
没有预览画面,倒是在TEMP目录下生成了几个TMP文件,用它的专用编辑器可以打开看到报表的内容。
可惜,一个不错的控件,太多的BUG。
所以,请原谅不能给分。
我下载了你推荐的EReport控件,并试验了它的DEMO。可惜我在运行DEMO时,我按下打印报表(一),出现以下错误:
EReadError With message '属性不存在'。
EConvertError with message 'No argument for format '%s''
No argument for format '%s'
没有预览画面,倒是在TEMP目录下生成了几个TMP文件,用它的专用编辑器可以打开看到报表的内容。
可惜,一个不错的控件,太多的BUG。
所以,请原谅不能给分。
#5
'属性不存在'的原因:
1.可能是delphi版本的问题,你是用的d5吗? 我也在为d5下用Ereport头痛呢!
2.我以前是在d3下用,记得也曾出现过'属性不存在'的问题,后来好像是把工作目录
定为程序所在的目录才用好的,你出的问题也可能是demo去找不到放着TEP文件的
TEMP目录.
要不然到http://www.nccsoft.com/delphi/vcl_lst/grids1.htm去下载俄ehlib1.52
罢,d3-d5都能用,这可是i/o共用的控件哟!
1.可能是delphi版本的问题,你是用的d5吗? 我也在为d5下用Ereport头痛呢!
2.我以前是在d3下用,记得也曾出现过'属性不存在'的问题,后来好像是把工作目录
定为程序所在的目录才用好的,你出的问题也可能是demo去找不到放着TEP文件的
TEMP目录.
要不然到http://www.nccsoft.com/delphi/vcl_lst/grids1.htm去下载俄ehlib1.52
罢,d3-d5都能用,这可是i/o共用的控件哟!
#6
Very easy!!!
1、设置autosize=false后将DBEDIT控件拉到折行宽度;
2、autostretch=true即可
1、设置autosize=false后将DBEDIT控件拉到折行宽度;
2、autostretch=true即可