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

Delphi Sources



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

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

Имеем вот такой код:

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  Classes, SysUtils;

Var
  Lst: TStringList;
  Example: String;
begin
 Example := '\\root\subdir 1\subdir 1 1\subdir 1 1 1\filename.ext';
 Lst := TStringList.Create;
 // Вариант1
 Lst.Delimiter := '\';
 Lst.DelimitedText := Example;
 WriteLn(Lst.Strings[Lst.Count - 2]);
 // Вариант2
 Lst.Text := StringReplace(Example,'\',#13,[rfReplaceAll]);
 WriteLn(Lst.Strings[Lst.Count - 2]);
 ReadLn;
 Lst.Free;
end.

Вопрос. Почему разный результат?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #2  
Старый 02.03.2012, 19:36
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Пробелы не учитывает кажись
Цитата:
Код:
while (P^ > ' ') and (P^ <> Delimiter) do
        {$IFDEF MSWINDOWS}
          P := CharNext(P);
        {$ELSE}
          Inc(P);
        {$ENDIF}
        SetString(S, P1, P - P1);
      end;
      Add(S);
Из модуля Classes.
Ответить с цитированием
  #3  
Старый 02.03.2012, 19:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Я в общем-то что-то подобное предполагал, но ведь это явный баг. Неужели никто не заметил до сих пор? Надо в XE проверить.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 02.03.2012, 19:44
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

И там то же самое
Цитата:
Код:
while ((not FStrictDelimiter and (P^ > ' ')) or
              (FStrictDelimiter and (P^ <> #0))) and (P^ <> Delimiter) do
        {$IFDEF MSWINDOWS}
          P := CharNext(P);
        {$ELSE}
          Inc(P);
        {$ENDIF}
        SetString(S, P1, P - P1);
      end;
      Add(S);
Значит, так нужно
Ответить с цитированием
  #5  
Старый 02.03.2012, 19:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вот кто-бы мне объяснил почему пробелы-то обязательно использовать как разделитель при пользовательском Delimited? Как-то не врублюсь в логику этого навязчивого сервиса.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 02.03.2012, 21:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Наверное потому, что однажды созданное, переделывать не хочется.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 03.03.2012, 18:29
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Цитата:
Сообщение от YVitaliy
И там то же самое
Там есть свойство StrictDelimiter.
Код:
Lst.StrictDelimiter := True;
и пробелы не будут считаться разделителями.
Ответить с цитированием
Этот пользователь сказал Спасибо ryderx34 за это полезное сообщение:
Страдалецъ (05.03.2012)
  #8  
Старый 03.03.2012, 18:40
Аватар для Klyaksa
Klyaksa Klyaksa вне форума
Новичок
 
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
По умолчанию

Все таки тут видать зависит версии Delphi. Хоть у меня и стоит 7-ка, но свойства StrictDelimiter у меня нет.
Ответить с цитированием
  #9  
Старый 04.03.2012, 04:01
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Оно, вроде бы, в Delphi 2006 впервые появилось.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter