procedure TForm1.btn2Click(Sender: TObject);
var
  vlist:TStringList;
  i:Integer;
  a,b,c:string;
  p,j:integer;
  const
    s ='a(bc),def(ghk)';  //括号和逗号都是中文输入法输入的。
begin
  vlist:= TStringList.Create;
      c:= ',';// 逗号是中文输入法输入的。
      vlist.Delimiter:= c[1];
      vlist.DelimitedText:= s;
      ShowMessage(vlist.DelimitedText);
      ShowMessage(IntToStr(vlist.Count));
      for i:= 0 to vlist.Count - 1 do
      begin
        a:= vlist.Strings[i];
        ShowMessage(a);
      end;
end;
现在想把s分成'abc','defghk'.但这个结果是'a','bc','','def','ghk','',非常奇怪,请高手来看看。

解决方案 »

  1.   

    那怎么用两个字节拆分呀?vlist.Delimiter要求是char型的,要不就报错,请指点一下!
      

  2.   

    中文的符号是占2Byte,语句:vlist.Delimiter:= c[1];
    只是将中文逗号的低位作为了分隔符,而不是中文“,”,所以出现这种上述情况。
    TStringList不支持中文的Delimiter,自己写个解析函数吧。
      

  3.   

    中文的符号是占2Byte,语句:vlist.Delimiter:= c[1];
    只是将中文逗号的低位作为了分隔符,而不是中文“,”,所以出现这种上述情况。
    TStringList不支持中文的Delimiter,自己写个解析函数吧。 
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      vlist:TStringList;
      i:Integer;
      a,b,c:string;
      p,j:integer;
      s1: string;
    const
      s ='a(bc),def(ghk)';  //括?和逗?都是中文?入法?入的。
    begin
      vlist:= TStringList.Create;
      s1 := '';
      i := 1;
      while i <= Length(s) do
        if (Copy(s, i, 2) = '(') or (Copy(s, i, 2) = ')') then
          Inc(i, 2)
        else if (Copy(s, i, 2) = ',') then
        begin
          vlist.Add(s1);
          s1 := '';
          Inc(i, 2);
        end
        else
        begin
          s1 := s1 + s[i];
          Inc(i);
        end;
      vlist.Add(s1);  Memo1.Lines.Add(vlist.DelimitedText);
      Memo1.Lines.Add(IntToStr(vlist.Count));
      for i:= 0 to vlist.Count - 1 do
      begin
        a:= vlist.Strings[i];
        Memo1.Lines.Add(a);
      end;
    end;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      vlist:TStringList;
      i:Integer;
      a,b,c:string;
      p,j:integer;
    const
      s ='a(bc),def(ghk),asfasfa';  //括?和逗?都是中文?入法?入的。
    begin
      vlist:= TStringList.Create;
      try
        Parse(s, vlist);
        Memo1.Lines.Add(vlist.DelimitedText);
        Memo1.Lines.Add(IntToStr(vlist.Count));
        for i:= 0 to vlist.Count - 1 do
        begin
          a:= vlist.Strings[i];
          Memo1.Lines.Add(a);
        end;
      finally
        vlist.Free;
      end;
    end;procedure TForm1.Parse(const s: string; slRsult: TStringList);
    var
      i:Integer;
      s1: string;
    begin
      s1 := '';
      i := 1;
      while i <= Length(s) do
        if (Copy(s, i, 2) = '(') or (Copy(s, i, 2) = ')') then
          Inc(i, 2)
        else if (Copy(s, i, 2) = ',') then
        begin
          slRsult.Add(s1);
          s1 := '';
          Inc(i, 2);
        end
        else
        begin
          s1 := s1 + s[i];
          Inc(i);
        end;
      slRsult.Add(s1);
    end;