Возможная недоработка TStringList

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Возможная недоработка TStringList

Сообщение HIRome » 05.09.2016 15:37:25

Добрый день!
Столкнулся с некоторой странностью при работе с TStringList. Такое ощущение, что при использовании свойства Text для получения, собственно, текста, при конкатинации строк в конец каждой строки банально добавляется #10. То есть в выгруженном, с помощью вышеупомянутого свойства, тексте последний символ всегда #10 - хоть одна стока в массиве, хоть десять... Таким образом, отображая где-либо данный текст, мы получим одну лишнюю пустую строку снизу.

Проверил такое поведение на fpc версии 2.6.4 под Linux:

program TestStringList;
{$mode objfpc}{$H+}
uses Classes, SysUtils;
var
oTmp : TStringList;
cTmp : Char;
sTmp : string;
begin
oTmp:=TStringList.Create;
with oTmp do
begin
Add('Hello,');
Add('World!')
end;
sTmp:=oTmp.Text;
oTmp.Free;
for cTmp in sTmp do Write(IntToStr(Ord(cTmp))+' ');
Writeln
end.

Вывод в консоль:

~/Laboratory/FP$ ./teststringlist
72 101 108 108 111 44 10 87 111 114 108 100 33 10

Вот теперь думаю, баг это или не баг?
Приходится делать фильтр на последний символ для каждого применения свойства Text. Обидно будет, если добавят код, который будет отслеживать последнюю строку и блокировать добавление #10.
HIRome
незнакомец
 
Сообщения: 3
Зарегистрирован: 05.09.2016 15:14:22

Re: Возможная недоработка TStringList

Сообщение Лекс Айрин » 05.09.2016 15:49:57

Судя по всему, это особенность реализации.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Возможная недоработка TStringList

Сообщение HIRome » 05.09.2016 17:01:20

Лекс Айрин, с одной стороны в таком поведении тоже есть некая польза: конкатинируя несколько "результатов" стринглистов нет необходимости добавлять конец строки к каждому предыдущему... К тому же передача текста из стринглиста в стринглист не добавляет пустых строк. Видимо, действительно, особенность... Я раньше значения не предавал особого: это становится заметно только тогда, когда начинаешь выгружать текст из стринглиста куда-нибудь в переменную для дальнейшей обработки, с последующей визуализацией.. Понятное дело, если из стринглиста тупо выгружать в ячейки таблицы - таблица распухнет неоправдано от пустого пространства снизу ячеек. Всё-таки логичнее было бы получать чистый текст из свойства Text стринглиста. А сейчас, в моём случае, придётся урезать текст на один символ, предварительно проверив, является ли он управляющим, дабы предотвратить возможное изменение реализации стринглиста в будущем...
HIRome
незнакомец
 
Сообщения: 3
Зарегистрирован: 05.09.2016 15:14:22

Re: Возможная недоработка TStringList

Сообщение SSerge » 05.09.2016 17:27:53

HIRome, а вы описание действия свойства text то читали?
Text returns, when read, the contents of the stringlist as one big string consisting of all strings in the list, separated by an end-of-line marker.

"Возвращает содержимое всех строк в списке в виде одной строки, в качестве разделителя составных частей используется маркер конца строки"
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Возможная недоработка TStringList

Сообщение Лекс Айрин » 05.09.2016 17:45:08

Это не самое сложное и страшное.

И, возможно, это не косяк StringList, а косяк компонент отображающих текст.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Возможная недоработка TStringList

Сообщение HIRome » 05.09.2016 17:52:37

SSerge, читал когда-то...
one big string consisting of all strings in the list, separated by an end-of-line marker
в виде одной строки, в качестве разделителя составных частей используется маркер конца строки

Ну да, всё правильно. "в качестве разделителя составных частей".
'Одна часть'+'Разделитель'+'Другая часть'+'Разделитель'+'Третья часть' - зачем в конец ставить "Разделитель", который последнюю строчку ни от чего не отделяет?
Вам не кажется, что Ваша цитата противоречит ситуации? :wink:

Добавлено спустя 4 минуты 53 секунды:
Лекс Айрин, ну по логике, компонент, отображающий текст, должен отображать его "как есть", ничего не фильтруя.. И эти компоненты правильно делают.
Не самое сложное и страшное, согласен.. Но вот тут нарвался на такую вот ерунду. Специально для этого сделал процедуру:
Код: Выделить всё
procedure OSNRemoveLastControlChar(var sSource: string);
begin
  if sSource[Length(sSource)] < ' ' then SetLength(sSource, Length(sSource)-1)
end; \0

Однако, чувствую нутром, что "непорядок" :?
HIRome
незнакомец
 
Сообщения: 3
Зарегистрирован: 05.09.2016 15:14:22

Re: Возможная недоработка TStringList

Сообщение Лекс Айрин » 05.09.2016 18:24:37

HIRome писал(а):Лекс Айрин, ну по логике, компонент, отображающий текст, должен отображать его "как есть", ничего не фильтруя..


На самом деле, нет. Как минимум, есть управляющие символы, которые могут и не отображаться. Пример этого, кстати, символы #10 и #13 (конец строки и перевод каретки, соответственно).

HIRome писал(а):Однако, чувствую нутром, что "непорядок" :?


Подозреваю, что подобное действие оставляет за собой мусор в виде крайнего символа.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Возможная недоработка TStringList

Сообщение zub » 05.09.2016 19:28:55

Че годать та? Смотрите как это работает в дельфи: также - делфисовместимость, по другому - "недоработка".
Чтото мне подсказывает что дельфисовместимость))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Возможная недоработка TStringList

Сообщение resident » 06.09.2016 00:49:46

HIRome писал(а):Вам не кажется, что Ваша цитата противоречит ситуации?

+1

Может так?
Код: Выделить всё
oTmp.Delimiter := #10;
sTmp:=oTmp.DelimitedText; 


HIRome писал(а):Вот теперь думаю, баг это или не баг?

Если беспокоит, то лучше, ИМХО, написать свою функцию и забыть.

HIRome писал(а):Обидно будет

Сговорились, чтоль?
Я в печали, Вы уже всё написали, когда я еще был маленьким!
Обидно будет, когда обнаружат, к примеру, саркому легкого или Аннушка масло разольет.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 251

Рейтинг@Mail.ru