Непонятная ошибка. Помогите разобраться.

И снова доброго времени суток.
Второй день борюсь с непонятным багом, идеи на исходе.
Собственно, что происходит.
Раздел. Реестр - это динамически сформированный дерево-видный грид(Имя, периоды), который наполняется по средству выполнения некой хранимой процедуры(процедура выполняется раз, дальше результаты хранятся в памяти на клиенте в xml). Раздел и его функционирование очень похожи не базовое планирование(только без функций подсчета факта).
Группы - тоже дерево, что и в главном реестре(в реестр подтягиваются все дочерние элементы выделенного элемента в группах).
А так же есть форма для наполнения реестра данными - это редактируемый грид.
Тут все работает...

Теперь о самой ошибки(к слову, при одинаковых телодвижениях ошибка появляется не всегда... но часто).
Вызываем форму для наполнения грида. Он фильтруется относительно активного элемента в реестре. Просто кликаем по реестру(на БД никаких запросов не идет, в реестр ничего не возвращается). Закрываем(то есть просто Self.Close()). Дальше меняем позицию курсора в группах и свал.
Причем свал тотальный, у клиентов террасофт просто вылетает по-английски, а у меня(возможно из-за того, что включен отладчик скриптов) выдает лог и там ошибка PositionChange датасета групп, но дальше работать нельзя.

Далее интересней. Если ставить точки останова в теле обработчика события и идти построчно то на абсолютно разных строчках(при чем это не функции или методы объектов, а просто присвоение, к примеру) debugger говорит:
"There is no source code available for the current location"
ну и, собственно, все...

Помогите кто чем может хоть толчками в нужное направления. Заранее спасибо.
Версия: 3.2.0.10(MS SQL)

Нравится

8 комментариев

Несколько вопросов:
- какой компонент используется для дерева групп и для реестра - DBDataset или MemoryDataset ?
- для дерева и для реестра используется один dlData или разные?
- если не вызывать форму редактирования - ошибка никогда не происходит?
- форма редактирования - наследована от wnd_BaseEdit или wnd_BaseDBEdit ?
- какие атрибуты передаются форме редактирования?

И, если можно, скриншоты не помешали бы...

"Валерий Андрусик" написал:- какой компонент используется для дерева групп и для реестра - DBDataset или MemoryDataset ?

И там и там MemoryDataset
"Валерий Андрусик" написал:- для дерева и для реестра используется один dlData или разные?

Разные
"Валерий Андрусик" написал:- если не вызывать форму редактирования - ошибка никогда не происходит?

Уже боюсь утверждать точно, но я не замечал. Людьми, которые с этим работают, так же замечено не было.
"Валерий Андрусик" написал:- форма редактирования - наследована от wnd_BaseEdit или wnd_BaseDBEdit ?

Нет, все самописные.
"Валерий Андрусик" написал:- какие атрибуты передаются форме редактирования?

Парметры для фильтрации. Ссылка на окно реестра(NotifyObject). Все.

На скриншоте в форме ничего не менялось. Нажимаем "Закрыть". Меняем позицию в Группах - свал(Ошибка выполнения метода 'dlGroupsOnDatasetAfterPositionChange'. Разрушительный сбой ).

При закрытии окна редактирования передается ли какое-то сообщение окну реестра ?
Если да, попробуйте временно закомментировать, и проверьте, будет ли ошибка

Да, сообщение передается(Notify).
Комментировать, конечно же, пробовал - ошибка таже.

Выскажу теоретическое предположение :)
Исходная информация:
- Если я правильно понял, в памяти есть объект XML, в котором хранятся данные;
- При открытии раздела из этого объекта данные загружаются в два MemoryDataset-а, и наверное какие-то связи на объект сохраняются?;
- При закрытии окна редактирования данные в этом объекте как-то изменяются (и наверное в MemoryDataset-ах тоже?);

Возможно, что при сохранении изменений "теряется" связь между датасетами и объектом, а в обработчиках на датасет группы при этом происходит ошибка...
Другого пока в голову не приходит. Лучший выход сейчас - детально пройтись в отладчике по стэку вызовов с момента нажатия кнопки "Закрыть" до момента срабатывания ошибки (в Visual Studio - по F11, с заходом внутрь вызываемых функций).

"Валерий Андрусик" написал:Исходная информация:

Да все почти именно так...

Вобщем путем "случайного тыка" было установлено, что если окно получить не Services.GetNewItemByUSI(), а GetSingleItemByCode() то свал не наблюдается ... хотя не факт )
Тогда вопрос: почему?

Проблема крылась в методе Close у окна. Во всяком случае на это все указывает, ибо если окно не закрывать, то и свала нет.
Насколько я понимаю, Close не уничтожает объект, лишь скрывает, а умирают они благодаря сборщику мусора? Хотелось бы о таких нюансах побольше узнать.
Или я неправильно предполагаю?

А в окно редактирования, случайно, не передается какой-либо объект, который при его закрытии уничтожается?

Нет, я же писал. Только значение фильтров для датасета и ссылка на окно реестра.

Показать все комментарии