打印中一些问题的解决方法 (taogou)
以下quickrpt版本都为3.6
关于自动折行
需求:将超过长度的文本自动折行
解决方法:根据delphi的判断函数来控制超过长度文本的取舍,其实它本身有判断并截取中文字符的功能,
但是只取了第一行,所以就没有折行的效果。
源码:文件 qrctrls;函数 formatlines;子函数addword
procedure addword(aword : string);
{$ifdef ver100}
var
s: string;
{$endif}
begin
while alinewidth(newline + aword) > width do //字符长度超过指定长度
begin
if newline = '' then
begin
{$ifdef ver100} //版本控制 似乎只分了{$ifdef ver36} 和这个。
if syslocale.fareast then
begin
while true do
begin
if (aword[1] in leadbytes) and (length(aword) > 1) then
s := copy(aword, 1, 2)
else
s := copy(aword, 1, 1);
if alinewidth(newline + s) < width then
begin
newline := newline + s;
delete(aword, 1, length(s));
end
else
break;
end;
end
else
while alinewidth(newline + copy(aword, 1, 1)) < width do
begin
newline := newline + copy(aword, 1, 1);
delete(aword, 1, 1);
end;
{$else}
while alinewidth(newline + copy(aword, 1, 1)) <= width do
begin
if bytetype(aword, length(aword)) = mbtrailbyte then //如果是是双字节字符,则截两位
//如果截的是双字节字符而长度恰好又超过了指定长度,
//系统默认将指定长度扩展一位。如果不愿意,当然这里也可以自己再加入控制
begin
newline:=newline +copy(aword,1,2);
delete(aword, 1, 2);
end else
begin
newline := newline + copy(aword, 1, 1);
delete(aword, 1, 1);
end;
end;
{$endif}
//taogou aword := ''; //该句的赋值就将导致不能换行
end;
flushline; //将截取的指定长度的字符加入到字符串列表中
{ if alinewidth(aword) > width then
begin
if newline = '' then
begin
if width = 0 then
aword := ''
else
while alinewidth(aword) > width do
{$ifdef ver100}
{ if bytetype(aword, length(aword)) = mbtrailbyte then