Форум: "Основная";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
ВнизПроблема с добавлением значения в TStringList Найти похожие ветки
← →
Sidoran © (2007-05-21 14:56) [0]Есть вот такая вот функция, которая делит строчку с разделителем на множество строчек.
function ExtString(g:string;ch:char;str:TStringList):integer;
var i,p,first,last:integer;
item:string;
begin
i:=0;first:=1;
for p:=2 to StrLen(PChar(g))do
if g[p]=ch then begin
last:=p;
item:=copy(g,first+1,last-first-1);
str.Add(item);
first:=last;
i:=i+1;
end;
ExtString:=i;
end;
Проблема в том что при добавлении 7 по счету значения компилятор начинает матюкаться на Access Violation.
Подскажите в чем собственно проблема.
← →
clickmaker © (2007-05-21 14:59) [1]вышел за границы массива, значит
← →
MBo © (2007-05-21 15:14) [2]TStringList.DelimitedText уже умеет делать заявленную задачу
← →
Плохиш © (2007-05-21 15:33) [3]
> StrLen(PChar(g))
Length уже не в моде?
В общем согласен с [2], но рекомендую посмотреть реализацию метода SetDelimitedText...
← →
Sidoran © (2007-05-21 15:49) [4]
> вышел за границы массива, значит
Наврядли. если загонять в StringList целый файл, то все в порядке.
> TStringList.DelimitedText уже умеет делать заявленную задачу
Конекретно мою задачу оно не выполняет, потому как удаляет пустые значения. У меня же файл который содержит определенное количество разделителей, но не всегда определенноей количество заполненых полей.
← →
clickmaker © (2007-05-21 15:53) [5]
> если загонять в StringList целый файл, то все в порядке
эээ... не понял. Если только 7 значений, то падает, а если больше, то все пучком?
← →
Sidoran © (2007-05-21 16:21) [6]
> > если загонять в StringList целый файл, то все в порядкеэээ.
> .. не понял. Если только 7 значений, то падает, а если больше,
> то все пучком?
Если делать Вот так:
AssignFile(f,fname);
k:=TStringList.Create;
k.LoadFromFile(fname);
То все прекрасно хавается и намного больше 7 символов. Файл содержит почти 12 тыщ строк. А вот если добавлять по одному то выползает ошибка.
← →
MBo © (2007-05-21 16:22) [7]>А вот если добавлять по одному
Покажи
← →
Sidoran © (2007-05-21 16:31) [8]
> Покажи
В самом верху кусок кода
← →
MBo © (2007-05-21 16:55) [9]как используешь?
← →
Sidoran © (2007-05-21 17:00) [10]
> как используешь?
str.Add(item);// str:StringList,item:string;
если чет не понял то уточни плиз вопрос.
← →
clickmaker © (2007-05-21 17:03) [11]скорей всего, first+1 в какой-то момент выходит за границы
← →
MBo © (2007-05-21 17:11) [12]объект str создан?
← →
Sidoran © (2007-05-21 17:16) [13]
> объект str создан
прописывание в телее функции str:=TSrtingList.Create ни дало ни каких результатов.
← →
MBo © (2007-05-21 17:23) [14]почему в теле функции?
Ей нужно передавать заранее созданный объект
← →
{RASkov} © (2007-05-21 17:32) [15]> [13] Sidoran © (21.05.07 17:16)
Не надо в теле ничего прописывать, у тебя должно выглядеть нечто так:
var sl: TStringList;
begin
sl:= TStringList.Create;
ExtString(<строка>, <разделитель>, sl);
.........
sl.Free;
end;
← →
Sidoran © (2007-05-21 17:33) [16]Вызов функции происходит так
p:=ExtString(k[i],#9,k1);
где обьект к1 уже создан.
← →
clickmaker © (2007-05-21 17:34) [17]кстати, если строчка не оканчивается разделителем, то последний элемент останется за бортом
← →
Sidoran © (2007-05-21 17:35) [18]
> кстати, если строчка не оканчивается разделителем, то последний
> элемент останется за бортом
Спасибо, но я знаю.Формат моего файла таков что каждая строчка начинается и заканчивается разделителем.
← →
Sidoran © (2007-05-21 17:39) [19]На всякий случай добавлю что функция работает без сучка и задоринки при количестве разделителей меньше 6. При большем отказывается.
← →
clickmaker © (2007-05-21 17:41) [20]
> При большем отказывается
и вид строки при этом значения не имеет?
как-то слабо верится...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c