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

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

Пропадают объекты? [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]

какая  БД и  листинг, пожалуйста


Наверх

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