Волшебным образом, я проверил, мой способ таки работает.
Код:
procedure WordDivider(SL: TStringList);
var
Text: string;
begin
Text := Trim(SL.Text);
Text := StringReplace(text, ' ', ' ', [rfReplaceAll]); // kill all double-space
SL.Delimiter := ' ';
SL.DelimitedText := Text; // divide all Text into words
// sl.Insert(2, ''); // тест работы листа с пустыми строками
end;
// вызов
SL := TStringList.Create;
SL.Text := ' ваша строка с чем угодно';
WordDivider(SL);
for i := 0 to SL.Count - 1 do
ShowMessage(SL[i]); // выводим разбитый на слова текст
sl.Free;
Я думаю, DelimitedText прожёвывает любые пробелы в момент своей работы, считая их пачку за 1 разделитель, так как без нареканий работает даже такое (пробел - внутри листа считается разделителем, если Strictdelimter = false)
Код:
procedure WordDivider(SL: TStringList);
begin
SL.DelimitedText := SL.Text; // divide all Text into words
end;
А про стрингреплейс я говорю свою функцию написать - для общих целей, не именно для этих, ибо как показали тесты, схлопывания дубликатов при реплейсе нет, а такая задача может понадобиться (при любом парсинге).
И кстати, Вы недалеки по своей интуиции от правды - TList имеет метод Pack для удаления указателей = нил, но стринглист - наследник тстрингс, а не листа
