![]() |
|
|
![]()
|
|
| Петрович |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 6 Всего: 55 |
Найдена ошибка в IBX.
Всем известно что метод Locate у любых наследников tDataSet не должен возбуждать исключительную ситуацию (Exception) если не нашел искомую запись. Однако в IBX, иногда, он это делает. А именно, если выполнить присваивание закладки (Bookmark) ссылающейся на несуществующую запись, то он это сделает "молча", не возбуждая исключения. Естественно, после этого реальная позиция в наборе данных не отражает требования пользователя. Уже это можно считать ошибкой. Но, если после этого еще и вызвать Locate ищущий несуществующую в наборе данных запись, то вместо того что-бы получить результат False, мы получаем исключительную ситуацию EDatabaseError с текстом "Record not found". Проще всего, это можно продемонстрировать на следующем примере:
В нем, вместо последовательно получения сообщений: 'Сейчас будем выполнять Locate' 'Locate не нашел запись' Мы получим: 'Сейчас будем выполнять Locate' 'Record not found' <- результат возникшего в Locate исключения EDatabaseError. Не стану "нагружать" Вас рассказами почему это происходит, а сразу перейду к тому как исправить. Сделать это не сложно. Но, поскольку в мире "бродят" несколько версий IBX, я не стану выкладывать сюда исправленный модуль, а приведу алгоритм исправления для версии v6.03. Если Вы используете другую версию IBX, то Вы сможете подправить ее самостоятельно. Итак. Исправления нужно внести в файл IBCustomDataSet.pas. Там, нужно добавить одну строчку в тело метода TIBCustomDataSet.InternalGetRecord. У себя, в v6.03, я сделал это так:
В версии IBX v6.08, текст этого метода идентичен, поэтому Вы можете его туда просто скопировать. Про другие версии не знаю, но думаю что он уже давно не меняется. Однако, стоит обратить внимание, что после исправления этой ошибки, в приведенном выше примере, Вы вообще не увидите сообщение 'Сейчас будем выполнять Locate'. Вместо него Вы сразу получите 'Record not found' - результат возникшего исключения EDatabaseError при выполнении строки:
Но это естественно правильно. Ведь присваиваемая закладка ссылается на уже не существующую запись. А что бы у Вас не оставалось сомнения в правильности этого, скажу что теперь, поведение IBX становится таким-же как и поведение ADO в подобных ситуациях - проверено Добавлено @ 11:20 Ой, совсем забыл:
-------------------- Все знать невозможно, но хочется |
||||||
|
|||||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 17 Всего: 162 |
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Golden Hands |
|
|||
![]() Золотой ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2023 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 2 Всего: 83 |
А в Борланд написал?
-------------------- Мы обречены... но только на победу! Настанет день, и мы построим новый дом. Внесем в него тепло, что сохранить сумели, И воскресим все то, что в нас когда-то умерло... © Тень Света |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |