函数如下:Function MitiLine (Str:String;N:Integer):String;
var
I,j,zm,k,lns,s,gs:Integer;
 Strs:String;
Begin
     zm:=0;
     k:=0;
     L:=Length(Str );     s:=0;
     gs:=0;
     If L=0 Then
     begin
      Result:=Str;
      Exit;
     End;
    if floattostr(L/N)>inttostr(trunc(L/N)) then
     lns:=trunc(L/N)+1
     else
     lns:=trunc(L/N);
      L:=Lns;
     if L<1 THEN L:=1;      if L>1 then
      begin     For I:=1 To L Do
     begin
     //s:=(N*(I-1)+1);
      ZM:=0;      for j:=0 to N-1 do
      begin       if  ByteType(Str,(N*(I-1)+1+s+J))   =   mbSingleByte   then
       begin
        zm:=zm+1;
       end;
      end;
      if zm mod 2=0 then
       s:=0
      else
       begin
      s:=1;
     end;
        if i=1 then
        BEGIN
     Strs:=Strs+Copy(Str,N*(I-1)+1,N+s)+#13+#10 ;
     END
     else
     Strs:=Strs+Copy(Str,N*(I-1)+1+gs,N+s)+#13+#10;
     if s=1 then
      gs:=gs+1;        end;       strs:=leftstr(Strs,length(strs)-2);     Result:=Strs;
     end
     else
     begin     strs:=leftstr(Strs,length(strs)-2);
      Result:=Str;
     end;         End;
当传入数字、字符、汉字及其它字符进去后换行就会出现乱码,请大家帮忙查查哪有问题。

解决方案 »

  1.   

    首先你不能直接判断,当截取字节是否单字节,你可以试着先判断它是否首字节,
    class function TPrinteTable.WordWrap(const Value: AnsiString;
      var MaxLength: Integer): AnsiString;
    begin
      if MaxLength > Length(Value) then
        MaxLength := Length(Value);
      if System.AnsiStrings.ByteType(Value, MaxLength) = TMbcsByteType.mbLeadByte
      then
        Dec(MaxLength);
      Result := System.AnsiStrings.LeftStr(Value, MaxLength);
    end;
      

  2.   

    Function GetNChars(Str: AnsiString; var N: Integer): AnsiString;
    //截取字符串前 N 个字符
    begin
      if N >= Length(Str) then
      begin
        result := Str;
        N := 0;
      end
      else
      begin
        //如果第 N 个字符是汉字的前半部分,就少取一个字符
        if ByteType(Str, N) = mbLeadByte then
          N := N - 1;
        result := Copy(Str, 1, N);
      end;
    end;Function MitiLine(Str: AnsiString; N: Integer): AnsiString;
    var
      s: AnsiString;
      m: Integer;
    begin
      s := '';
      while True do
      begin
        m := N;
        if s = '' then
          s := GetNChars(Str, m)
        else
          s := s + #13#10 + GetNChars(Str, m);
        if m = 0 then
          Break;
        Str := Copy(Str, m + 1, Length(Str) - m);
      end;
      result := s;
    end;//示例
    procedure TForm1.btn1Click(Sender: TObject);
    var
      Str: AnsiString;
      N: Integer;
    begin
      Str := '昨天早盘,沪深两市双双跳空低开,沪指报3131.85点,跌幅1.71%,深成指报10656.9点,跌幅2.13%。开盘后低位震盪,盘中航空板块发力,沪指跌幅一度收窄至0.67%,但无力翻红。';
      Memo1.Text := MitiLine(Str, 25);
    end;
      

  3.   

    我不知道楼主用的是D7还是XE,但如果是XE的话,系统已经对ANSI和UNICODE编码有明显的机制区分
    COPY函数其实已经自动识别ANSI还是UNICODE编码
    下面的代码也许能给楼主提供参考,XE8测试通过,也建议:如非必要,一般不要跑到字节运算里面去var
      i,iCutLength:Integer;
      Str,sCurSymbol,sLineStr:String;
    begin
      iCutLength:=25;
      Str:='昨天早盘,沪深两市双双跳空低开,沪指报3131.85点,跌幅1.71%,深成指报10656.9点,跌幅2.13%。开盘后低位震盪,盘中航空板块发力,沪指跌幅一度收窄至0.67%,但无力翻红。';
      sCurSymbol:='';
      sLineStr:='';
      for I := 1 to Length(Str) do
      begin
        sCurSymbol:=Copy(Str,i,1);
        if Length(AnsiString(sLineStr+sCurSymbol))>iCutLength then
        begin
        //如果长度>iCutLength就清空行字符串
          Memo1.Lines.Add(sLineStr);
          sLineStr:=''
        end;
        sLineStr:=sLineStr+sCurSymbol;
      end;
      if sLineStr<>'' then
        Memo1.Lines.Add(sLineStr);
    end;