Delphi XE7 TStrings.DelimitedText

Delphi XE7 TStrings.DelimitedText

我想填充一个 TStringList 并得到一个逗号分隔的引用结果。

根据我所读的内容,这是可能的,但我只是得到一个逗号分隔的结果,没有引号。我无法让它删除重复项。

procedure TForm5.BitBtn1Click(Sender: TObject);
var
  sl : TStringList;
  s : string;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := ',';
    sl.QuoteChar := '"';
    sl.Duplicates := dupIgnore;
    //sl.DelimitedText := '"1","2","3"';
    sl.DelimitedText := '1,2,3';
    sl.Add('a');
    sl.Add('2');
    s := sl.DelimitedText;
    ShowMessage(s);
  finally
    sl.Free;
  end;
end;

我一直将 var s 设置为 1,2,3,a,2,但我期望的是 "1","2","3","a"

TStrings.DelimitedText 属性 getter 将字符串包装在 QuoteChar 仅当 包含以下任一内容时:

  1. #0 空字符。
  2. QuoteChar 角色
  3. Delimiter 角色
  4. 如果 TStrings.StrictDelimiters 为假,#1..#32 之间的任何 ASCII whitespace/control 字符,包括在内。

如果您希望字符串始终被引用,则必须手动引用它们,例如:

procedure TForm5.BitBtn1Click(Sender: TObject);
var
  sl : TStringList;
  s, tmp : string;
  i: Integer;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := ',';
    sl.QuoteChar := '"';
    sl.Duplicates := dupIgnore;

    //sl.DelimitedText := '"1","2","3"';
    sl.DelimitedText := '1,2,3';

    sl.Add('a');
    sl.Add('2');

    //s := sl.DelimitedText;
    s := '';
    for I := 0 to sl.Count-1 do
      S := S + AnsiQuotedStr(sl[I], sl.QuoteChar) + sl.Delimiter;
    Delete(S, Length(S), 1);

    ShowMessage(s);
  finally
    sl.Free;
  end;
end;

试试这个:

procedure TForm1.FormCreate(Sender: TObject);
var
  sl : TStringList;
  s : string;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := ',';
    sl.QuoteChar := #0;  // default = '"'
    sl.Duplicates := dupIgnore;
    sl.DelimitedText := '"1","2","3"';
    sl.Add('a');
    sl.Add('"2"');
    s := sl.DelimitedText;
    ShowMessage(s);
  finally
    sl.Free;
  end;
end;