Delphi: разделитель StringList всегда является пробелом, даже если установлен разделитель
у меня возникли проблемы с разделителем в классе 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'
кажется, что разделитель теперь '^'
и ' '
какие идеи?
5 ответов
вы должны установить s1.StrictDelimiter := True
для пробелов, которые не считаются разделителями, больше информации здесь.
поскольку вы работаете в версии, которая не поддерживает вышеизложенное (как было разъяснено после отправки ответа), у вас есть два варианта:
- найдите символ, который, как вы знаете, не будет использоваться в исходном тексте (например, подчеркивание), преобразуйте все пробелы в этот символ перед разделением и преобразуйте обратно после разделения. Это robosoft'ы предложение.
- если у вас нет кавычек и пробелов в тексте, вы можете использовать Александртрюк и обернуть текст между разделителями в перевернутой команде, так что
'hello hello^bye bye'
превращается в'"hello hello"^"bye bye"'
. Если вы выбрали этот путь, и он работает для вас, пожалуйста, примите ответ Александра, а не мой, он также предоставляет код для его реализации.
оба обходных пути не используют StrictDelimiter
имеют ограничения: первый требует некоторого неиспользованного характера, и во-вторых, в исходном тексте нет перевернутых запятых и пробелов.
возможно, пришло время перейти на более новую версию Delphi:)
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
У Райана есть отличное решение этой проблемы с помощью функции ExtractStrings () в Delphi. См.:
поэтому в вашем случае замените вызовы на sl.Разделитель и сл.DelimitedText со строкой ниже: ExtractStrings(['^'], [], PChar( S), sl);
работа в Delphi 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;
Спасибо большое!