Главная страница
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.01 c
15-1296654994
pavel_guzhanov
2011-02-02 16:56
2011.05.22
Конференция по FastReport. Может быть кого-нибудь заинтересует?


2-1297686311
Ghost del vonte
2011-02-14 15:25
2011.05.22
Определение Left и Top у ячейки в DrawGrid


15-1297062417
И. Павел
2011-02-07 10:06
2011.05.22
Иконка в Delphi


2-1297184901
Студент
2011-02-08 20:08
2011.05.22
Пытался сравнить переменную с функцией изменяющей её значение :(


6-1229662971
AdMeen
2008-12-19 08:02
2011.05.22
Client-Server+Dynamic IP