Hunter |
Отправлено: 22.09.2005, 08:00 |
|
Не зарегистрирован
|
здравствуйте! при выполнении запроса к бд access с помощью TQuery Code Guard отлавливает следующее: Method called on illegally casted object: Attempt to access 32 byte(s) at xxx. The 'this' pointer points to heap block xxx which is only 28 bytes long. Останов происходит в следующем коде TField* operator[](int Index) { return Fields[Index]; } внутри vcl. причем сама программа работает правильно и ошибок не выдает.
Вызывающий код:
Query1->Params->Items[0]->AsInteger=id;
Query1->Active=true;
r_cnt=Query1->RecordCount;
Query1->First();
for(int j=0;j
{
pts[j]=Query1->Fields->operator [](0)->AsFloat;//здесь происходит ошибка
Query1->Next();
}
Query1->Active=false;
В чем может быть дело? BCB6 update 1
спасибо |
|
AVC |
Отправлено: 22.09.2005, 08:08 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
А почему не написать просто как в хелпе
Query1->Fields->Fields[j]->AsFloat
? |
|
Hunter |
Отправлено: 22.09.2005, 08:30 |
|
Не зарегистрирован
|
Спасибо... помогло... чо то я намудрил...javascript:emoticon('') |
|
olegenty |
Отправлено: 22.09.2005, 08:43 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
но стиль написания кода происходит от слова ужас ... подобный код чреват ДОЛГИМ поиском ошибок.
1. Обращаться к параметрам по индексу... ну, а если спецификация параметров изменится, при том произойдёт просто смена тех же самых параметров местами?
2. То же самое касается полей
3. Ориентация на RecordCount??? Да Вы, Батенька, оптимист! (Не знаю уж, в каком поколении)
4. Ну и ориентированный на RecordCount цикл, как следствие п.3., невредно заменить на:
CODE |
try
{
for (Query->Open(); !Query->Eof; Query->Next())
{
... // чё-то сделать оптом, либо в розницу
}
} __finally
{
if (Query->Active) Query->Close();
}
|
|
|