Форум: "Основная";
Текущий архив: 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