Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с добавлением значения в 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]

вышел за границы массива, значит


Наверх

Титульная страница Поиск, карта сайта Написать письмо