Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

При уничтожении модуля данных возникает AV. [D6, XP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо