向一个memo中输入文字(包括数字,标点,汉字)怎么实现标点不能在一个新行的最前面,数字不能分开,而且每一行对齐,打印控件是qrrichtext,而且qrrichtext中每一行汉子的个数有时会是30个汉子,有时会是28个汉子。

解决方案 »

  1.   

    这是我原来写的一段程序
    qrrichtext1.lines.clear;
      if length(mre1.Text) > 600 then
      begin
        //回车
        str := enterline(mre1.Text, 30);
        qrrichtext1.Font.Size := 14;
      end
      else
      begin
        str := enterline(mre1.Text, 28);
        qrrichtext1.Font.Size := 15;
      end;  qrrichtext1.Lines.Add(str);
    enterline函数:
    function newline(str: string; width: integer): string;
    var
      buf, resultBuf, estr: wideString;
      str1, str2, cstr: string;
      cnum, enum, i, j, mnum: integer;
    label resultlab;
    begin
      //转成宽字符后可以不用判断汉字
      buf := str;
      resultBuf := ''; //初始化结果
      while Length(buf) > width do
      begin
        estr := copy(buf, 1, width);
        Delete(buf, 1, width);
        ///////////////////////////如有数字,则从后面截取字////////////////////////////////////
        mnum := 0;
        cstr := estr;
        cnum := length(cstr) - length(estr);
        enum := 2 * length(estr) - length(cstr);
        if trunc(cnum + enum / 2) <= width then
        begin
          if enum mod 2 = 1 then
          begin
          /////////////////////空格不能插入数字中///////////////////////////////////
            str1 := '';
            str1 := Copy(estr, Length(estr) - mnum, 1);
            while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.')) do
            begin
              mnum := mnum + 1;
              str1 := Copy(estr, Length(estr) - mnum, 1);
            end;
            enum := enum + 1;
            insert(' ', estr, length(estr) - mnum)
            //estr := estr + ' ';
          end;
          if trunc(cnum + enum / 2) < width then
          begin
            estr := estr + copy(buf, 1, (width - trunc(cnum + enum / 2)));
            Delete(buf, 1, (width - trunc(cnum + enum / 2)));
          end;
        end;
         /////////////////////处理数字///////////////////////
        str1 := '';
        str2 := '';
        mnum := 0;
        str1 := Copy(estr, Length(estr), 1);
        str2 := copy(buf, 1, 1);
        while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.'))
          and (((str2 >= '0') and (str2 <= '9')) or (str2 = '.')) do
        begin
          mnum := mnum + 1;
          estr := estr + str2;
          delete(buf, 1, 1);
          str1 := '';
          str2 := '';
          str1 := Copy(estr, Length(estr), 1);
          str2 := copy(buf, 1, 1);
        end;
        cstr := estr;
        cnum := length(cstr) - length(estr);
        enum := 2 * length(estr) - length(cstr);
        if mnum > (width - cnum - trunc(enum / 2)) then
        begin
          str1 := '';
          str1 := Copy(estr, Length(estr), 1);
          while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.')) do
          begin
            buf := copy(estr, Length(estr), 1) + buf;
            estr := copy(estr, 1, Length(estr) - 1);
            str1 := '';
            str1 := Copy(estr, Length(estr), 1);
          end;
          goto resultlab;
        end
        else
        begin
          estr := estr + copy(buf, 1, mnum);
          delete(buf, 1, mnum);
        end;
        {/////处理标点符号////////////////////////////////////// }
        str1 := '';
        str1 := copy(buf, 1, 1);
        if (str1 = ',') or (str1 = ',') or (str1 = '。') or (str1 = '.') or (str1 = '?') or (str1 = '?')
          or (str1 = '!') or (str1 = '!') or (str1 = ';') or (str1 = ';') or (str1 = '、') or (str1 = '》')
          or (str1 = '”') or (str1 = '"') or (str1 = ')') or (str1 = ')') then
        begin
          estr := Copy(estr, 1, Length(estr)) + str1;
          delete(buf, 1, 1);
        end;
       { /////////////////////加空格////////////////////////////////////////// }
        resultlab: cstr := estr;
        cnum := length(cstr) - length(estr); //汉字个数
        enum := 2 * length(estr) - length(cstr); //数字个数
        if trunc(cnum + enum / 2) < width then
        begin
          j := 6;
          for i := 1 to (width - trunc(cnum + enum / 2)) do
          begin
          //////////////////空格不能插入数字中////////////////////////
            str1 := '';
            str1 := copy(estr, j - 1, 1);
            while (j = 1) or ((str1 >= '0') and (str1 <= '9')) or (str2 = '.') do //判断是否数字
            begin
              j := j + 2;
              str1 := '';
              str1 := copy(estr, j - 1, 1);
            end;
            insert(' ', estr, j);
            j := j + 2;
          end;
        end;
        resultBuf := resultBuf + estr + #13#10;
      end;
      resultBuf := resultBuf + buf;
      Result := resultBuf;
    end;{=============================================================================}
    {=============================================================================}
     //处理回车
    {=============================================================================}function enterline(str: string; width: integer): string;
    var
      ls_len: integer;
      strn, strf, ls_str: string;
    begin
      result := '';
      strn := str;
      ls_len := pos(#13#10, strn);
      while ls_len > 0 do
      begin
        strf := copy(strn, 1, ls_len - 1) + #13#10;
        delete(strn, 1, ls_len + 1);
        ls_len := pos(#13#10, strn);
        ls_str := ls_str + newline(strf, width);
        result := ls_str;
      end;
      result := result + newline(strn, width);
    end;
    {=============================================================================}
     //处理回车
      

  2.   

    你可以改成这样:
    function newline(str: string; width: integer): string;
    var
      buf, resultBuf, estr: wideString;
      str1, str2, cstr: string;
      cnum, enum, i, j, mnum: integer;
    label resultlab;
    begin
      //转成宽字符后可以不用判断汉字
      buf := str;
      resultBuf := ''; //初始化结果
      while Length(buf) > width do
      begin
        estr := copy(buf, 1, width);
        Delete(buf, 1, width);
        ///////////////////////////如有数字,则从后面截取字////////////////////////////////////
        mnum := 0;
        cstr := estr;
        cnum := length(cstr) - length(estr);
        enum := 2 * length(estr) - length(cstr);
        if trunc(cnum + enum / 2) <= width then
        begin
          if enum mod 2 = 1 then
          begin
          /////////////////////空格不能插入数字中///////////////////////////////////
            str1 := '';
            str1 := Copy(estr, Length(estr) - mnum, 1);
            while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.')) do
            begin
              mnum := mnum + 1;
              str1 := Copy(estr, Length(estr) - mnum, 1);
            end;
            enum := enum + 1;
            insert(' ', estr, length(estr) - mnum)
            //estr := estr + ' ';
          end;
          if trunc(cnum + enum / 2) < width then
          begin
            estr := estr + copy(buf, 1, (width - trunc(cnum + enum / 2)));
            Delete(buf, 1, (width - trunc(cnum + enum / 2)));
          end;
        end;
         /////////////////////处理数字///////////////////////
        str1 := '';
        str2 := '';
        mnum := 0;
        str1 := Copy(estr, Length(estr), 1);
        str2 := copy(buf, 1, 1);
        while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.'))
          and (((str2 >= '0') and (str2 <= '9')) or (str2 = '.')) do
        begin
          mnum := mnum + 1;
          estr := estr + str2;
          delete(buf, 1, 1);
          str1 := '';
          str2 := '';
          str1 := Copy(estr, Length(estr), 1);
          str2 := copy(buf, 1, 1);
        end;
        cstr := estr;
        cnum := length(cstr) - length(estr);
        enum := 2 * length(estr) - length(cstr);
        if mnum > (width - cnum - trunc(enum / 2)) then
        begin
          str1 := '';
          str1 := Copy(estr, Length(estr), 1);
          while (((str1 >= '0') and (str1 <= '9')) or (str1 = '.')) do
          begin
            buf := copy(estr, Length(estr), 1) + buf;
            estr := copy(estr, 1, Length(estr) - 1);
            str1 := '';
            str1 := Copy(estr, Length(estr), 1);
          end;
          goto resultlab;
        end
        else
        begin
          estr := estr + copy(buf, 1, mnum);
          delete(buf, 1, mnum);
        end;
        {/////处理标点符号////////////////////////////////////// }
        str1 := '';
        str1 := copy(buf, 1, 1);
        if (str1 = ',') or (str1 = ',') or (str1 = '。') or (str1 = '.') or (str1 = '?') or (str1 = '?')
          or (str1 = '!') or (str1 = '!') or (str1 = ';') or (str1 = ';') or (str1 = '、') or (str1 = '》')
          or (str1 = '”') or (str1 = '"') or (str1 = ')') or (str1 = ')') then
        begin
          estr := Copy(estr, 1, Length(estr)) + str1;
          delete(buf, 1, 1);
        end;
       { /////////////////////加空格////////////////////////////////////////// }
        resultlab: cstr := estr;
        cnum := length(cstr) - length(estr); //汉字个数
        enum := 2 * length(estr) - length(cstr); //数字个数
        if trunc(cnum + enum / 2) < width then
        begin
          j := 6;
          for i := 1 to (width - trunc(cnum + enum / 2)) do
          begin
          //////////////////空格不能插入数字中////////////////////////
            str1 := '';
            str1 := copy(estr, j - 1, 1);
            while (j = 1) or ((str1 >= '0') and (str1 <= '9')) or (str2 = '.') do //判断是否数字
            begin
              j := j + 2;
              str1 := '';
              str1 := copy(estr, j - 1, 1);
            end;
            insert(' ', estr, j);
            j := j + 2;
          end;
        end;
        resultBuf := resultBuf + estr + #13#10;
      end;
      resultBuf := resultBuf + buf;
      Result := resultBuf;
    end;{=============================================================================}
    {=============================================================================}
     //处理回车
    {=============================================================================}function enterline(str: string; width: integer): string;
    var
      ls_len: integer;
      strn, strf, ls_str: string;
    begin
      result := '';
      strn := str;
      ls_len := pos(#13#10, strn);
      while ls_len > 0 do
      begin
        strf := copy(strn, 1, ls_len - 1) + #13#10;
        delete(strn, 1, ls_len + 1);
        ls_len := pos(#13#10, strn);
        ls_str := ls_str + newline(strf, width);
        result := ls_str;
      end;
      result := result + newline(strn, width);
    end;
    {=============================================================================}
     //处理回车
    qrrichtext1.lines.clear;
      if length(mre1.Text) > 600 then
      begin
        //回车
        str := enterline(mre1.Text, 30);
        qrrichtext1.Font.Size := 14;
      end
      else
      begin
        str := enterline(mre1.Text, 28);
        qrrichtext1.Font.Size := 15;
      end;  qrrichtext1.Lines.Add(str);
    之后预览打印,你可以试试