FastReport与汉字折行问题?(50分)

  • 主题发起人 主题发起人 Benne Chen
  • 开始时间 开始时间
B

Benne Chen

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,这是一个老问题如果有补丁,或解决方法请告知?
 
有源码你可以自己改,我就是自己改的。如果你要的话你就说。
 
到Delphi窑洞去下载新的版本吧!折行问题已经解决了!
 
delphi.mychangshu.com
 
我记得好像是查找fr_classes中的 *wrap* 过程把参数中的string改成WideString就可以了
 
我试过,fr245中中文折行仍有问题,我是这样解决的。
1、在WrapMemo方法中的WrapLine程序中加入子程序(在变量声明之后)
procedure WrapLine(const s:String);
var
i, cur, beg, last, LoopPos: Integer;
WasBreak, CRLF: Boolean;
//以下为加入部分
procedure AdjustLast;
var
ls:string;
ci,ni:Integer;
begin
ls:=Copy(s,beg,last - beg + 1);
ci:=0;
for ni:=1 to Length(ls)do
if (ls[ni]>=#$A0) then
Inc(ci);
ni:=ci mod 2;
if (ni<>0) and (ls[Length(ls)]>=#$A0) then
Dec(last);
end;

2.在最后一次调用OutLine的地方作如下修改:
if WasBreak then
OutLine(Copy(s, beg, last - beg + 1) + '-')
else
if s[last] = ' ' then
OutLine(Copy(s, beg, last - beg))
else
begin
AdjustLast;
//此为新加的程序
OutLine(Copy(s, beg, last - beg + 1));
//在fr242中该行就是这样,在fr245中原来没有 + 1,但输出后last却减1, 不知为何
end;

如果那位高手有更好的方法,请不吝赐教。
 

我修改了程序,圆满的解决了问题。只需要增加一个语句就可以了。方法如下:
修改的文件fr_calss.pas,函数TfrMemoView.WrapMemo 中的WrapLine函数,在
if WCanvas.TextWidth(Copy(s,beg,cur-beg+1))>maxwidth then
begin
//下面增加一行
if ByteType(s,cur)=mbLeadByte then
cur=cun-1

 
主要改fr_class.pas中的wrapline过程,其中有一段:
else
if s[last] = ' ' then
OutLine(Copy(s, beg, last - beg)) else
OutLine(Copy(s, beg, last - beg + 1));//造成乱码的根本原因
改为
else
if s[last] = ' ' then
OutLine(Copy(s, beg, last - beg)) else
if ByteType(s,last) = mbLeadByte then
//判断是否是汉字字节
OutLine(Copy(s, beg, last - beg ))
else
OutLine(Copy(s, beg, last - beg + 1));
后面的
LoopPos := cur;
beg := last + 1;
last := beg;
要改为:
LoopPos := cur;
if ByteType(s,last) = mbLeadByte then

begin
beg := last ;
last := beg;
end
else
begin
beg := last + 1;
last := beg;
end;
参照http://tian.yeah.net的 fastreport2.41c
 
多人接受答案了。
 
后退
顶部