Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.04.2014, 22:17
Аватар для madMonia
madMonia madMonia вне форума
Новичок
 
Регистрация: 25.02.2014
Сообщения: 50
Версия Delphi: Delphi XE3
Репутация: 2545
По умолчанию

Цитата:
Сообщение от phomm
Надо будет запилить свою функцию схлопывания подстроки из дубликатов символов.
Блин, а я думал есть какой-то флаг у StringList который пустые строки удалит. В любом случае, на мой взгляд проще самому избавится от пустых строк в стринглисте, чем двойные пробелы изничтожать.
__________________
Невозможно заточить карандаш тупым топором. Столь же тщетно пытаться сделать это десятком тупых топоров
Ответить с цитированием
  #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 для удаления указателей = нил, но стринглист - наследник тстрингс, а не листа

Последний раз редактировалось phomm, 29.04.2014 в 11:10.
Ответить с цитированием
  #18  
Старый 29.04.2014, 13:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Действительно, был не прав по поводу родного StringReplace. Посмотрел исходный код сей функции. У нас с авторами видимо разное представление о флаге rfReplaceAll. Вот первый вариант улучшенной функции StringReplace. Есть в ней один косяк при включенном флаге rfIgnoreCase, тут надо подумать. Но во всем остальном вроде нормально пашет. Если есть замечания, то выкладывайте свой вариант. Будем совместно править косяк Embarcadero
Код:
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
Var LS, RS, Pattern: String;
begin
 Result := S;
 Pattern := OldPattern;
 if rfIgnoreCase in Flags
 then begin
      Result := AnsiUpperCase(S);
      Pattern := AnsiUpperCase(OldPattern);
      end;
 while Pos(Pattern, Result) <> 0
 do begin
    LS := Copy(Result, 1, Pos(Pattern, Result)-1);
    RS := Copy(Result, Pos(Pattern, Result) + Length(Pattern), Length(Result));
    Result := LS + NewPattern + RS;
    if not (rfReplaceAll in Flags) then Break;
    if Result = S then Break;
    end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter