![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При уничтожении модуля данных возникает AV. [D6, XP]
Drowsy © (2011-07-27 23:00:00)Написал обработку события onDestroy.
отладчик показал, что AV при уничтожении upORE
type
TdmPutDat = class(TDataModule)
dsMainPutDat: TDataSource;
ibMainPutDat: TIBDataSet;
upMainPutDat: TIBUpdateSQL;
ibOre: TIBDataSet;
dsOre: TDataSource;
ibGrinding: TIBDataSet;
dsGrinding: TDataSource;
ibEtalon: TIBDataSet;
dsEtalon: TDataSource;
upOre: TIBUpdateSQL;
upGrinding: TIBUpdateSQL;
upEtalon: TIBUpdateSQL;
procedure DataModuleDestroy(Sender: TObject); // onDestroy
private
public
end;
implementation
procedure TdmPutDat.DataModuleDestroy(Sender: TObject);
begin
// если следующая строка закомментирована, то когда Components[0] = upOre,
// Components[0].Free; - Acess Violation,
// если Раскомментирована, то всё нормально.
FindComponent('upOre').Free;
while ComponentCount > 0 do
Components[0].Free;
inherited;
end;
end.
почему?
Drowsy (2011-07-29 19:20:00) [1]Я доверчивый, всем верю, и Вам и им
http://www.ibase.ru/components.htm#components
Anatoly Podgoretsky (2011-07-29 16:32:00) [2]> Drowsy (29.07.2011 04:46:26) [26]
Врать не хорошо, SP выпускался только для Д3 - единственный
Drowsy (2011-07-29 04:46:00) [3]У меня установлено обновление IBX 6.11 для Delphi 6 SP2 . со страницы http://www.ibase.ru/
Юрий Зотов (2011-07-29 03:23:00) [4]Может быть, не установлен Update Pack? Насколько поню, к D6 шли пакеты обновлений и в одном из них как раз правились IB-компоненты.
Юрий Зотов (2011-07-28 21:42:00) [5]> Сабж
Кинул на форму 2 компонента:
type
TForm1 = class(TForm)
IBUpdateSQL1: TIBUpdateSQL;
IBDataSet1: TIBDataSet; // UpdateObject = IBUpdateSQL1
private
{ Private declarations }
public
{ Public declarations }
end;
и запустил. Форма закрывается нормально. Похоже, где-то Вы перемудрили.
Игорь Шевченко (2011-07-28 20:20:00) [6]
> а из собственного ничего нет7
Все уже написано до нас. Но перечитать невредно, чтобы подумать, а стоит все пришедшие в голову мысли торопиться выносить на форум или все-таки погодить.
SQLEXPRESS (2011-07-28 19:57:00) [7]
> Игорь Шевченко © (28.07.11 17:53) [20]
читал..
а из собственного ничего нет7
_Юрий (2011-07-28 19:24:00) [8]Ошибка в другом месте, а тут проявляется
Попробуй проверить на пустом дата-модуле с единственным TIBUpdateSQL.
FastMM поможет отладке
Игорь Шевченко (2011-07-28 17:53:00) [9]SQLEXPRESS (28.07.11 17:01) [18]
http://lib.ru/LITRA/CHEHOW/r_letter.txt
Юрий Зотов (2011-07-28 17:19:00) [10]> SQLEXPRESS (28.07.11 17:01) [18]
> if Assigned(FDataSet) and (FDataSet.UpdateObject = Self) then
> FDataSet.UpdateObject := nil;
> а тут, потенциально, не рванет?
Рванет, если FDataSet начнет что-то делать со своим UpdateObject. Вообще, странный код - обычно для уведомления компонентов об удалении их компонентов-ссылок используется FreeNotification.
SQLEXPRESS (2011-07-28 17:01:00) [11]имхо, один из уничтожаемых как то ссылается на upOre,
и если его разрушить первым, что, видимо происходит в destructor datamodule,
то при последующем разрушении upOre происходит какое-то обращение к нему, уже порушенному.
destructor TIBUpdateSQL.Destroy;
var
UpdateKind: TUpdateKind;
begin
if Assigned(FDataSet) and (FDataSet.UpdateObject = Self) then
FDataSet.UpdateObject := nil;
for UpdateKind := Low(TUpdateKind) to High(TUpdateKind) do
FSQLText[UpdateKind].Free;
inherited Destroy;
end;
а тут, потенциально, не рванет?
Игорь Шевченко (2011-07-28 15:56:00) [12]
> Почему?
потому что у тебя где-то в другом месте портится память, а проявляется это в виде вот такого забавного эффекта.
Отладчик - рулез фарева
Drowsy (2011-07-28 15:55:00) [13]Ещё раз :
1 ) при автоматическом уничтожении дата модуля возникала AV.
Обработчик onDestroy, дл "ручного" удаления, написан для того, чтобы найти компонент, уничтожение которого вызывало AV.
2) Оказалось, что это upOre: TIBUpdateSQL; (добавлен, как и другие в дизайн-тайм, с панели компонент).
3) если так:
FindComponent('upOre').Free;
while ComponentCount > 0 do
Components[0].Free;
inherited;
-- то ошибка не появляется.
а если
// FindComponent('upOre').Free;
while ComponentCount > 0 do
Components[0].Free;
inherited;
-- то AV
Почему?
Юрий Зотов (2011-07-28 15:32:00) [14]> SQLEXPRESS (28.07.11 15:07) [13]
Потому что компоненты, имеющие владельца (Owner) автоматически уничтожаются вместе с ним. В данном случае это так и будет, поэтому ЛЮБОЙ код "ручного" уничтожения просто не нужен.
Игорь Шевченко (2011-07-28 15:11:00) [15]
> дайте мастер-класс.
destructor TComponent.Destroy;
SQLEXPRESS (2011-07-28 15:07:00) [16]
> Игорь Шевченко © (28.07.11 15:05) [12]
дайте мастер-класс.
почему?
Игорь Шевченко (2011-07-28 15:05:00) [17]SQLEXPRESS (28.07.11 13:55) [11]
Расстрелять. Из ржавого пистолета.
SQLEXPRESS (2011-07-28 13:55:00) [18]while ComponentCount > 0 do
begin
if Components[0] <> nil then
FreeAndNil(Components[0]);
end;
Anatoly Podgoretsky (2011-07-28 11:32:00) [19]> Drowsy (28.07.2011 01:42:06) [6]
Так каког черты ты тогда применяешь Destroy здесь
Anatoly Podgoretsky (2011-07-28 11:31:00) [20]> Drowsy (27.07.2011 23:00:00) [0]
Destroy без Create