假如memo控件内有很多行文字,长度不同,我想把每行的前15位取出来放到memo2中,应该如何做?

解决方案 »

  1.   

    Uses StrUtils;
    var
      i: integer;
    begin
      for i:=0 to Memo1.Lines.count do
        Memo2.Lines.Add(LeftStr(Memo1.Lines.Strings[i],15));
    end;
      

  2.   

    //最长取15位,当第15位是一个双字节字符的第一个字节时,取14位
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, n: Integer;
      s: String;
    begin
      Memo2.Lines.Clear;
      for i := 0 to Memo1.Lines.Count - 1 do
      begin
        s := Memo1.Lines[i];
        n := 1;
        while (n < 15) and (n <= Length(s)) do
        begin
          if Ord(s[n]) >= $80 then
            Inc(n, 2)
          else
            Inc(n);
        end;
        Memo2.Lines.Add(Copy(s, 1, n));
      end;
    end;
      

  3.   

    改一下,上面那个有问题
    ---------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, j: Integer;
      s: String;
      b: Boolean;
    begin
      Memo2.Lines.Clear;
      for i := 0 to Memo1.Lines.Count - 1 do
      begin
        s := Memo1.Lines[i];
        b := True;
        for j := 1 to 15 do
          if (not b) or (Ord(s[j]) >= $80) then
            b := not b;
        if b then
          Memo2.Lines.Add(Copy(s, 1, 15))
        else
          Memo2.Lines.Add(Copy(s, 1, 14));
      end;
    end;
      

  4.   

    s變量改為WideString就可以不管它是中文還是英文還是中英混血的了
      

  5.   

    楼上的,如果换成WideString,不能满足取15位的要求,例如:
    Copy('一二三四五六七八九十一二三四五六', 1, 15)的结果是“一二三四五六七八九十一二三四五”共30位
    Copy('1234567890123456', 1, 15)的结果是“123456789012345”共15位
    “混血”的位数就更不好说了
      

  6.   

    看錯了,我以為是取前15個字符,那麼 WideString 取出來的沒錯,中文(2字節)是當做1個字符看待.