![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пропадают объекты? [D6, WinXP]
G0ga © (2005-09-28 16:33:00)Уважаемые мастера столкнулся с такой проблемой. В наличии есть таблица (неважно какая). Из нее берется 5 полей и помещается в TObject. Который потом "заталкивается" в TObjectList (методом Insert). В качестве индекса берется уникальное строковое поле из 6ти цифр - преобразованное в целое число(FieldByName('...').AsInteger). На этапе отладки строка "100002" заносится в TObjectList, а по завершении процесса эта строка и ещё серия строк - пропадает. Где может сабака зарыта?
P.S. При значении индекса > TObjectList.Count меняю значение Count на значение индекса и провожу Insert.
umbra (2005-09-28 19:50:00) [1]
> Ошибки возникают только в i:=srcRecord.FieldByName('BaseCode').
> AsInteger;, но для этого и стоит try except end;.
>
Ну вот, теперь ясно в чем дело. В справке о свойстве AsInteger объекта типа TField написано, что TField не поддерживает полей целого типа и при попытке чтения ВСЕГДА возникает ошибка.
Пэтому, чтобы ошибок не было вообще, надо вместо
i:=srcRecord.FieldByName('BaseCode').AsInteger;
поставить что-то вроде
i := inttostr(temp.BaseCode)
Помогло?
G0ga (2005-09-28 19:34:00) [2]В "Библиях"неочень точно описан механизм свойства Capacity. Вероятна ситуация когда выделенного пространства памяти не хватает для дальнейшего
Inserta. И TObjectList начинает терять объекты.
G0ga (2005-09-28 19:30:00) [3]Ошибки возникают только в
i:=srcRecord.FieldByName('BaseCode').AsInteger;, но для этого и стоитtry except end;.
umbra (2005-09-28 19:00:00) [4]
> G0ga © (28.09.05 18:55) [12]
Проблема, скорее всего в том, что список адресов слишком большой для локальной переменной, объявленной в процедуре
umbra (2005-09-28 18:59:00) [5]весь этот процесс присходит в процедуре (или функции)? и выскакивают ли таблички с красными крестами и сообщением наподобие "raised exception EStackOverflow at address ....."? Просто недостаточно информации, чтобы можно было определить проблему. Подробнее, пожалуйста!
G0ga (2005-09-28 18:55:00) [6]Может проблема в
Price.Capacity:=иPrice.Count:=?
G0ga (2005-09-28 18:51:00) [7]Интересное наблюдение при попытке взять
TOP 30000ошибки не наблюдается.
umbra (2005-09-28 18:23:00) [8]ну, для начала - если убираете
except
Price.Add(temp^);
end;
то убирайте и словоtryвыше. Когда убереште, запустите прогу. Могу спорить, что она выдаст ошибку. Если напишеште, какую, то, возможно и разберемся в чем дело.
G0ga (2005-09-28 18:13:00) [9]Убрал
except
Price.Add(temp^);
end;
umbra (2005-09-28 18:08:00) [10]
> Убрал обработку except
То есть вообще теперь нет блока try ... except? И табличек об ошибках программа не выдает?
G0ga (2005-09-28 17:59:00) [11]Убрал обработку
exceptдумал она портит кртину. Оказалось проблема продолжается.
umbra (2005-09-28 17:33:00) [12]
try
i:=srcRecord.FieldByName('BaseCode').AsInteger;
if Price.Count<=i then
Price.Count:=i+1;
Price.Insert(i,temp^);
except
Price.Add(temp^);
end;
Здесь написано, что в случае ошибки надо добавить элемент в конец списка. Довольно необычное поведение - не интересуясь, что за ошибка, делать, в принципе, то же, что и в блоке try. Элементы, скорее всего, исчезают потому, что какая-то ошибка случается, например переполнение стека или потеря коннекта с базой данных, и, соответственно после нее все уже каким то образом неправильно. В блокеexceptлучше обрабатывать не все возможные ошибки, а только некоторые, которые можно обработать
G0ga (2005-09-28 17:20:00) [13]Нет
umbra (2005-09-28 17:18:00) [14]
> В качестве индекса берется уникальное строковое поле из
> 6ти цифр
В TObjectList элементы нумеруются числами начиная с нуля. Элементами TObjectList являются указатели (адреса памяти) на объекты, "затолкнутые" в список. В методе Insert параметр Index - номер элемента в списке, в котором будет содержаться указатель. Нужет ли список, в котором 99999 пустых элементов и только 100000-ый занят?
Германн (2005-09-28 17:17:00) [15]Insert сам увеличивает Count. Зачем ты это делаешь?
G0ga (2005-09-28 17:11:00) [16]БД MSAccess
...
srcRecord.Open;
Price:=TObjectList.Create;
srcRecord.Last;
Price.Capacity:=srcRecord.RecordCount;
srcRecord.First;
while Not srcRecord.Eof do
begin
New(temp);
temp^:=TPriceInfo.Create;
temp.BaseCode:=srcRecord.FieldByName('BaseCode').AsString;
temp.Name:=srcRecord.FieldByName('Name').AsString;
temp.Factory:=srcRecord.FieldByName('Factory').AsString;
temp.Country:=srcRecord.FieldByName('Country').AsString;
temp.Artikul:=srcRecord.FieldByName('Artikul').AsString;
temp.CostValue:=srcRecord.FieldByName('Cost').AsInteger;
temp.Suffix:='р.';
temp.Cost2Value:=srcRecord.FieldByName('For_Cost2').AsInteger;
temp.Date:=Date();
try
i:=srcRecord.FieldByName('BaseCode').AsInteger;
if Price.Count<=i then
Price.Count:=i+1;
Price.Insert(i,temp^);
except
Price.Add(temp^);
end;
srcRecord.Next;
end;
srcRecord.Close;
...
erika (2005-09-28 16:53:00) [17]какая БД и листинг, пожалуйста