![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с добавлением значения в TStringList [D6, WinXP]
Sidoran © (2007-05-21 14:56:00)Есть вот такая вот функция, которая делит строчку с разделителем на множество строчек.
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 17:41:00) [1]
> При большем отказывается
и вид строки при этом значения не имеет?
как-то слабо верится...
Sidoran (2007-05-21 17:39:00) [2]На всякий случай добавлю что функция работает без сучка и задоринки при количестве разделителей меньше 6. При большем отказывается.
Sidoran (2007-05-21 17:35:00) [3]
> кстати, если строчка не оканчивается разделителем, то последний
> элемент останется за бортом
Спасибо, но я знаю.Формат моего файла таков что каждая строчка начинается и заканчивается разделителем.
clickmaker (2007-05-21 17:34:00) [4]кстати, если строчка не оканчивается разделителем, то последний элемент останется за бортом
Sidoran (2007-05-21 17:33:00) [5]Вызов функции происходит так
p:=ExtString(k[i],#9,k1);
где обьект к1 уже создан.
{RASkov} (2007-05-21 17:32:00) [6]> [13] Sidoran © (21.05.07 17:16)
Не надо в теле ничего прописывать, у тебя должно выглядеть нечто так:
var sl: TStringList;
begin
sl:= TStringList.Create;
ExtString(<строка>, <разделитель>, sl);
.........
sl.Free;
end;
MBo (2007-05-21 17:23:00) [7]почему в теле функции?
Ей нужно передавать заранее созданный объект
Sidoran (2007-05-21 17:16:00) [8]
> объект str создан
прописывание в телее функции str:=TSrtingList.Create ни дало ни каких результатов.
MBo (2007-05-21 17:11:00) [9]объект str создан?
clickmaker (2007-05-21 17:03:00) [10]скорей всего, first+1 в какой-то момент выходит за границы
Sidoran (2007-05-21 17:00:00) [11]
> как используешь?
str.Add(item);// str:StringList,item:string;
если чет не понял то уточни плиз вопрос.
MBo (2007-05-21 16:55:00) [12]как используешь?
Sidoran (2007-05-21 16:31:00) [13]
> Покажи
В самом верху кусок кода
MBo (2007-05-21 16:22:00) [14]>А вот если добавлять по одному
Покажи
Sidoran (2007-05-21 16:21:00) [15]
> > если загонять в StringList целый файл, то все в порядкеэээ.
> .. не понял. Если только 7 значений, то падает, а если больше,
> то все пучком?
Если делать Вот так:
AssignFile(f,fname);
k:=TStringList.Create;
k.LoadFromFile(fname);
То все прекрасно хавается и намного больше 7 символов. Файл содержит почти 12 тыщ строк. А вот если добавлять по одному то выползает ошибка.
clickmaker (2007-05-21 15:53:00) [16]
> если загонять в StringList целый файл, то все в порядке
эээ... не понял. Если только 7 значений, то падает, а если больше, то все пучком?
Sidoran (2007-05-21 15:49:00) [17]
> вышел за границы массива, значит
Наврядли. если загонять в StringList целый файл, то все в порядке.
> TStringList.DelimitedText уже умеет делать заявленную задачу
Конекретно мою задачу оно не выполняет, потому как удаляет пустые значения. У меня же файл который содержит определенное количество разделителей, но не всегда определенноей количество заполненых полей.
Плохиш (2007-05-21 15:33:00) [18]
> StrLen(PChar(g))
Length уже не в моде?
В общем согласен с [2], но рекомендую посмотреть реализацию метода SetDelimitedText...
MBo (2007-05-21 15:14:00) [19]TStringList.DelimitedText уже умеет делать заявленную задачу
clickmaker (2007-05-21 14:59:00) [20]вышел за границы массива, значит