Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.22;
Скачать: CL | DM;

Вниз

Как внести изменения в TStringList?   Найти похожие ветки 

 
Cobalt ©   (2009-10-01 18:40) [0]

обнаружил в Д2007 неприятный баг - при использовании св-ва DelimitedText:
   Strings.Delimiter := #9;
   Strings.StrictDelimiter := True;
   Strings.DelimitedText := ReportRow;


разбиение строки происходит с учетом кавычек, кладя с прибором на StrictDelimiter := True

Попытка в Classes добавить
     if (not FStrictDelimiter) and (P^ = QuoteChar) then
       S := AnsiExtractQuotedStr(P, QuoteChar)
     else

к успеху не привела - на доп. условие все равно кладется, и строка берется из кавычек, а не до Delimiter,  из-за того, как я понимаю, что измененный модуль не компилируется в программу.

подскажите, как это можно обойти? не хочется писать своё колесо.


 
Cobalt ©   (2009-10-01 18:44) [1]

т.е. если имеется строка вида
"ООО", Фирма  супер-пупер" #9 "строка 1" #9 "строка2"
и надо ее разделить по символу #9, то получаем массив:

ООО
, Фирма  супер-пупер
строка 1
строка2

Т.е. вместо 3-х строк имеем 4 :-(


 
DVM ©   (2009-10-01 18:51) [2]


> Cobalt ©

вот, так попробуй, (с) Игорь Шевченко кажется:

procedure Split(const S, Delimeter: string; Parts: TStrings);
var
 curPos: Integer;
 curStr: string;
begin
 Parts.Clear;
 if Length(S) = 0 then Exit;
 Parts.BeginUpdate;
 try
   CurStr := S;
   repeat
     CurPos := AnsiPos(Delimeter, CurStr);
     if CurPos > 0 then
       begin
         Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
         CurStr := Copy(CurStr, CurPos + Length(Delimeter), Length(CurStr) - CurPos - Length(Delimeter) + 1);
       end
     else
       Parts.Add(CurStr);
   until CurPos = 0;
 finally
  Parts.EndUpdate;
 end;
end;


 
Anatoly Podgoretsky ©   (2009-10-01 19:33) [3]

> Cobalt  (01.10.2009 18:44:01)  [1]

Все правильно, такой уж у тебя формат строки, а надо
ООО, Фирма  супер-пупер" #9 "строка 1" #9 "строка2"


 
Германн ©   (2009-10-02 01:00) [4]

А что мешает перед добавлением строки в StringList использовать StringReplace?


 
Cobalt ©   (2009-10-02 09:01) [5]

Проще, видать, будет написать хелпер навроде  DVM ©   (01.10.09 18:51) [2]


> Anatoly Podgoretsky ©   (01.10.09 19:33) [3]
> > Cobalt  (01.10.2009 18:44:01)  [1]
> Все правильно, такой уж у тебя формат строки, а надо
> ООО, Фирма  супер-пупер" #9 "строка 1" #9 "строка2"

Не согласен, это неправильное поведение.

TStrings.StrictDelimiter Property
Use this property to specify whether the Delimiter is the only value used within the DelimitedText property. If set to True, individual strings in DelimitedText are separated only by the character that is the value of Delimiter. If set to False, individual strings in DelimitedText can be separated by a space, a non-printable character, or the character that is the value of Delimiter.

P.S.
И ни слова о таком свойстве, как QuoteChar :-(
Догадайся, мол, сама...


 
Anatoly Podgoretsky ©   (2009-10-02 09:17) [6]

Это да -самострой, но с другой стороны, что прикажешь делать с такими строками, ведь они являются сами по себе ограничителем для строки?
Возможно это стоит отнести к недаработкам или в коде или в документации. Не выполнено правило удвоения ограничителей


> When retrieving CommaText, any string in the list that include
> spaces, commas or quotes will be contained in double quotes,
>  and any double quotes in a string will be repeated.

Надо удваивать или сменить QuoteChar, в справке и пример приведен

"Stri""ng 2"


 
Cobalt ©   (2009-10-05 17:19) [7]

Сделал проще - обнулил QuoteChar
QuoteChar := #0;



Страницы: 1 вся ветка

Текущий архив: 2011.05.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1296941377
Юрий
2011-02-06 00:29
2011.05.22
С днем рождения ! 6 февраля 2011 воскресенье


3-1259081869
Anatoly Podgoretsky
2009-11-24 19:57
2011.05.22
Явное против неявного


13-1126698091
DenisUA
2005-09-14 15:41
2011.05.22
Подскажите задачу!


15-1297075464
istok
2011-02-07 13:44
2011.05.22
мониторинг принтеров...


3-1258970968
denis_7
2009-11-23 13:09
2011.05.22
Проблема с отчетами в Rave