关于中文折行及相关问题的解决方法 (taogou)[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 taogou 的 blog

打印中一些问题的解决方法 (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

本文关键:折行,打印
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top