Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 13:19

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: AV в DBSumLst.pas|TDBSumListProducer|ReturnEvents
СообщениеДобавлено: 20 июн 2013, 13:11 
Не в сети

Зарегистрирован: 20 июн 2013, 12:46
Сообщений: 4
Здравствуйте.
Сравнительно недавно на пустом месте возникла проблема с библиотекой EhLib (а может и нет).
Использую: OS-Win8-64, Delphi7, EhLib 6.1.130
Суть проблемы.
Если на PageControl кинуть DbGridEh в котором активировать SumList, грид подключить к любому (BDE, ClientDataSet, FibDataSet) датасет-у, но сам датасет в run-time не открывать и grid разместить на "невидимой" сейчас странице, то выход из ничего не делающей программы приводит к AV.
Код:
Call Stack Information:
------------------------------------------------------------------------------------
|Address |Module      |Unit        |Class             |Procedure/Method   |Line    |
------------------------------------------------------------------------------------
|*Exception Thread: ID=4420; Priority=0; Class=; [Main]                            |
|----------------------------------------------------------------------------------|
|005175C5|Project1.exe|DBSumLst.pas|TDBSumListProducer|ReturnEvents       |336[3]  |
|00517598|Project1.exe|DBSumLst.pas|TDBSumListProducer|ReturnEvents       |333[0]  |
|00595219|Project1.exe|DBGridEh.pas|TDBGridEhSumList  |ReturnEvents       |25318[2]|
|00518B29|Project1.exe|DBSumLst.pas|TDBSumListProducer|Deactivate         |835[4]  |
|00518AF0|Project1.exe|DBSumLst.pas|TDBSumListProducer|Deactivate         |831[0]  |
|0051722E|Project1.exe|DBSumLst.pas|TDBSumListProducer|Destroy            |238[1]  |
|005672F0|Project1.exe|DBGridEh.pas|TCustomDBGridEh   |Destroy            |7459[32]|
|006542D8|Project1.exe|Project1.dpr|                  |                   |16[5]   |
|76A9850B|KERNEL32.DLL|            |                  |BaseThreadInitThunk|        |
------------------------------------------------------------------------------------


И, что странно, вся эта ерунда возникает когда в uses-секции указывается модуль от FIBPlus FIBDataSet. Если модуль убрать, проблема исчезает.
Я пробовал на разных версиях библиотеки (6.1.127, -129, -130) и FIBPlus-а (7.3.0, 7.4, 7.4.5, 7.5.0) - ошибка имеет место, но некоторые запуски программы (1-2 % ) не приводят к AV.
Кстати, на XP закрытие тестового проекта не приводит к AV. На Win7-32, Win2008 R2-64 (все разные компы) - AV присутствует. Запуск в режиме совместимости с WinXP к AV, тоже не приводит.

До этого времени таких проблем не было.

В прикрепленном файле тестовый проект. Если открыть и скомпилировать сразу, при закрытии AV не возникает. Если же в design-режиме просто переключиться между всеми закладками и вернуться на первую - проблема снова появляется.


Вложения:
test.zip [20.97 KiB]
Скачиваний: 132
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AV в DBSumLst.pas|TDBSumListProducer|ReturnEvents
СообщениеДобавлено: 24 июн 2013, 19:42 
Не в сети

Зарегистрирован: 20 июн 2013, 12:46
Сообщений: 4
Ответ от FIBPlus. (То, что и ожидал - выделил болдом)

Цитата:
Смотрите. Прописываем

procedure TDM.DataModuleDestroy(Sender: TObject);
begin
quEMPLOYEE.Free;
quSALES.Free;
end;

Сделаем это чисто для наглядности. Чтоб быть на 100% уверенными что после DataModuleDestroy датасеты действительно разрушены.

Ставим на нем бряк.

Запускаем вашу программу. Находим юнит

unit DBSumLst;
метод

procedure TDBSumListProducer.ReturnEvents;

Ставим бряк на первую строку
if Assigned(FDataSet) and (FEventsOverloaded = True) then

На всякий случай ставим еще бряк на
procedure TDBSumListProducer.SetDataSet(Value: TDataSet);

Закрываем вашу программу и.... любуемся.

Сначала попали на procedure TDM.DataModuleDestroy(Sender: TObject);
уничтожили датасеты.
Потом начинаются сюрпризы. На TDBSumListProducer.SetDataSet(Value: TDataSet); не попали вообще. Занулить DBSumListProducer.FDataset некому.
Зато попали на procedure TDBSumListProducer.ReturnEvents;

Причем строка
if Assigned(FDataSet) and (FEventsOverloaded = True) then
вернула True. Мы точно знаем что FDataSet уже разрушен. Сами его разрушили в TDM.DataModuleDestroy(Sender: TObject); Но TDBSumListProducer оказывается об этом не подозревает. И начинает манипулировать с уже разрушенным датасетом. Почему не бьет AV каждый раз, можно только догадываться.
Игры менеджера памяти бывают крайне забавными.

6.1.127 проверяйте сами. Не думаю что там ситуация другая. В любом случае ко всей этой истории FIBPlus никаким боком.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AV в DBSumLst.pas|TDBSumListProducer|ReturnEvents
СообщениеДобавлено: 24 июн 2013, 20:11 
Не в сети
Администратор

Зарегистрирован: 19 дек 2011, 17:40
Сообщений: 837
Добрый день.

Попробуйте добиться деактивации DBGridEh.SumList до уничтожения DBGridEh. Например, в форме Form.OnDestroy
DBGridEh.SumList.Active := False;
или
DBGridEh.DataSource := nil;

_________________
Best regards
Admin


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB