dbmemo 中文折行时有时乱码 ( 积分: 200 )

  • 主题发起人 主题发起人 lifu888
  • 开始时间 开始时间
L

lifu888

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:delphi6.0+Reportbuilder Enterprise 6.0;
由于内容宽度经常变化,因此有时会出现汉字被截,导致出现乱码的问题。
这个问题存在很久了,一直没有解决,也找了很多资料,仍然没找到一个很好的解决方法,期待大家的帮助.
 
是不是用的宋体中文字符集?
 
转化成Unicode字符就不会出现乱码了,99年写的函数,很好用。
{
功能:对一个Pascal字符串进行定长换行处理
入口参数:Value -- 要转换的Pascal字符串, max_len_line -- 每行Unicode字符个数。
返回结果:转换后的字符串。
}
function wrap_line(Value: String;
max_len_line: integer ): String;
var
ws: WideString;
s: string;
begin
ws:= Value;
s:= '';
while length(ws) > MAX_LEN_LINEdo
begin
s:= s + Copy(ws, 1, MAX_LEN_LINE) + #13;
delete(ws, 1, MAX_LEN_LINE);
end;

Result:= s + ws;
end;
调用方法:
procedure Tform_kucun_chaxun_prn.QRDBText4Print(sender: TObject;
var Value: String);
begin
Value:= wrap_line(Value, 15);
//打印之前转化以下,加换行
end;
 
頂。。。。。。。。。。
 
我本身用的是宋体字符集。
man8888的方法是不错,但是不是很完美,假如每15个字符一行,假定内容长度为32个字符,第一位开始有8个汉字,一个汉字占两个字符,这样第八汉字将会被截掉,出现乱码,
也许有人会说,那么设为16个长度一行,但是假如前面有一个数字,后面有8个汉字呢,
同样第8个字会出现乱码。主要是因为内容是有数字与中文夹在一起。
 
当然,man888可能会说,使用自定报表,初始一行的长度,打印报表时,可以随意设定一行的宽度,这个方法是可以,但是不是最好的解决方法,有些用户是电脑盲,他们只要求什么都是现成的,稍微要他们自己做些修改就搞不定了。
 
如果能取得dbmemo的宽度的话,那么问题就解决了,把dbmemo的宽度作为行的宽度,
问题不知道dbmemo到底能容纳多少字符,如果人工去数,那太繁琐了
 
我們公司的ERP系統的dbmemo總是出現汉字被截的情況,但還沒有亂碼,也是使用Reportbuilder。
 
我说的汉字被截是那个字前一个字节在上一行末尾处,后一个字符在下一行的开始处,
整个内容是有的,比方说dmemo的一行的宽度可以放20个字节,显示内容共有40个字节,显示还是40个字节,只不过,第20、21字节是乱码,而不是20个字节以后不显示了。
 
中英文混用吧,先把内容转成Unicode然后存储,显示的时候再转过来
 
多人接受答案了。
 
后退
顶部