德尔福:StringList的分隔符始终是一个空格字符,即使分隔符设置(Delphi: String

2019-07-03 18:34发布

我有在TStringList中类的分隔符的麻烦。 看一看:

var
  s: string;
  sl: TStringList;

begin
  sl := TStringList.Create;
  s := 'Users^foo bar^bar foo^foobar^barfoo';
  sl.Delimiter := '^';
  sl.DelimitedText := s;
  ShowMessage(sl[1]);
end;

sl[1]应该返回'foo bar'

sl[1]不会返回'foo'

看来,分隔符现在是'^'' '

有任何想法吗?

Answer 1:

你应该设置s1.StrictDelimiter := True的空间不被认为是分隔符,更多信息在这里 。

既然你在不支持以上(作为答案提交后澄清)版本的工作,你有两个选择:

  1. 找到你知道一个字符将不会在原文中使用(例如,下划线),所有空格分割之前转换为字符,并分割后转换回。 这是ROBOSOFT的建议。
  2. 如果你没有在文本倒逗号和空格,您可以用亚历山大的把戏,敷分隔符的文本中倒命令,让'hello hello^bye bye'变成'"hello hello"^"bye bye"' 。 如果你选择了这条路,它适合你,请接受亚历山大的答案,不是我的,他还提供了实现它的代码。

不使用这两种解决方法StrictDelimiter有局限性:第一需要一些未使用的字符,第二个要求在原文中没有倒逗号和空格。

也许是时候升级到德尔福的新版本:)



Answer 2:

sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';


Answer 3:

莱恩具有提供商使用ExtractStrings这一问题的最佳解决方案(在Delphi)函数。 看到:

解析使用分隔符来一个的TStringList字符串,似乎也对解析空间(德尔福)

所以你的情况,与线下更换到sl.Delimiter和sl.DelimitedText电话:ExtractStrings([ '^'],[],PChar类型(S),SL);



Answer 4:

sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);


Answer 5:

工作在德尔福7“像手套”对我来说。 这是我的功能应用亚历山大的绝招后:

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText :=  '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo';
  Split('^',Edit1.Text,Memo1.Lines);
end;

非常感谢!



文章来源: Delphi: StringList Delimiter is always a space character even if Delimiter is set