Главная страница
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.008 c
1-1254906944
Aleks
2009-10-07 13:15
2011.05.22
Как вычислить матем.значение в Edit?


1-1254471574
dmitry1208197320
2009-10-02 12:19
2011.05.22
Прокрутка веб-страницы


3-1259290992
Diplomat
2009-11-27 06:03
2011.05.22
Поиск заданного значения в БД


1-1254923974
Agat2
2009-10-07 17:59
2011.05.22
из Delphi 2007 -> 2010


2-1297692086
Stringgrid
2011-02-14 17:01
2011.05.22
drag&drop в stringgrid