Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.05.22;
Скачать: [xml.tar.bz2];

Вниз

Как внести изменения в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
2-1297847287
RWolf
2011-02-16 12:08
2011.05.22
AV в API callback


15-1297011378
artem
2011-02-06 19:56
2011.05.22
Заработок на учебных заведениях


2-1297871090
Gu
2011-02-16 18:44
2011.05.22
Variant 2 String


15-1296656605
Shirson
2011-02-02 17:23
2011.05.22
Absolute Database


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский