Показать сообщение отдельно
  #17  
Старый 29.04.2014, 11:04
phomm phomm вне форума
Новичок
 
Регистрация: 07.10.2013
Адрес: Тюмень
Сообщения: 50
Версия Delphi: 7/2007/XE+/FPC
Репутация: 22
По умолчанию

Волшебным образом, я проверил, мой способ таки работает.
Код:
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 для удаления указателей = нил, но стринглист - наследник тстрингс, а не листа
Ответить с цитированием