![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access Violation in ibXpress63.bpl [D6, XP]
Drowsy © (2014-10-30 22:46:00)Возникает при уничтожении модуля данных.
Посмотрел по адресу ошибки в CPU, при уничтожении объекта типа TIBUpdateSQL.
type
TdmMain = class(TDataModule)
....................
qrDryBarCalc: TIBQuery;
uoDryBarCalc: TIBUpdateSQL;
....................
end;
implementation
procedure TdmMain.DataModuleDestroy(Sender: TObject);
begin
а если так, то ошибки нет
qrDryBarCalc.UpdateObject := nil;
end;
В чём причина такой странности? (причём, на модуле несколько пар TIBQuery-TIBUpdateSQL, но остальные нормально уничтожаются.)
Inovet (2014-10-31 05:48:00) [1]> [6] Drowsy © (31.10.14 05:02)
Правильно, лучше ходить на костылях, чем на ногах.
Drowsy (2014-10-31 05:02:00) [2]
> Германн © (31.10.14 04:03) [4]
Ошибка то при уничтожении модуля происходит, вот я и пытаюсь перед этим найти,что не так с компонентами внутри..
> Inovet © (31.10.14 04:31) [5]
а я , напротив, где-то в сети статью читал, что TibDataSet - плохо, а надо использовать связку TIBQuery - TIBUpdateSQL
Inovet (2014-10-31 04:31:00) [3]И вообще TIBUpdateSQL - зло. Подробности искать надо, забыл. И TIBQuery туда же. Но! Эту ошибку не они создают, они своими занимаются.
Германн (2014-10-31 04:03:00) [4]А зачем ты пишешь свой обработчик TDataModule.OnDestroy?
Drowsy (2014-10-31 00:30:00) [5]procedure TdmMain.DataModuleDestroy(Sender: TObject);
begin
а если так, то ошибки нет
qrDryBarCalc.UpdateObject := nil;
end;
Вот я ставлю точку останова здесь на end;
Нажимаю F7, и сразу возникает исключение.
Т.е., при уничтожении модуля данных.
Как я понимаю, происходит уничтожение uoDryBarCalc: TIBUpdateSQL;
но ссылка на него у объекта qrDryBarCalc (qrDryBarCalc.UpdateObject) не обнуляется почему - то (это же вроде должна делать процедура FreeNotificаtion). Поэтому, происходит повторная попытка уничтожить uoDryBarCalc.
А если их разделить( qrDryBarCalc.UpdateObject := nil;) , то они уничтожаются нормально.
Rouse_ (2014-10-30 23:16:00) [6]Пардон, не выше - а ниже, по коду исполнения, ибо qrDryBarCalc.UpdateObject ранее был уже разрушен. Ищи второй вызов Free над разрушенным экземпляром UpdateObject или обращение к полям этого обьекта.
Rouse_ (2014-10-30 23:12:00) [7]
> qrDryBarCalc.UpdateObject := nil;
Этим ты нивелировал генерацию исключения, при вызове деструктора уже разрушенного ранее объекта. Только и всего.
Ошибка не здесь, а выше по коду.