Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.20;
Скачать: CL | DM;

Вниз

При уничтожении модуля данных возникает AV.   Найти похожие ветки 

 
Drowsy ©   (2011-07-27 23:00) [0]

Написал обработку события 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.

почему?


 
_Юрий   (2011-07-27 23:20) [1]

Не нужно уничтожать компоненты руками. Они уничтожатся автоматически.


 
Drowsy ©   (2011-07-27 23:24) [2]

Автоматическое уничтожение приводило к AV.


 
Германн ©   (2011-07-28 00:35) [3]

Если ты пишешь свой собственный класс, то на кой хрен тут нужно использовать Components и FindComponent?

P.S.
Хотелось бы посмотреть ещё и метод Create класса TdmPutDat.
:)


 
Drowsy ©   (2011-07-28 01:06) [4]

При уничтожении  var dmPutDat: TdmPutDat унаследованным деструктором возникала ошибка AV.  Чтобы выяснить, удаление какого компонента приводит к ошибке, я и написал обработчик события onDestroy.
ошибка при дестрое upOre: TIBUpdateSQL;
И самое странное, что

// если следующая строка закомментирована, то когда Components[0] = upOre,
// Components[0].Free;   - Acess Violation,
// если Раскомментирована, то всё нормально.

FindComponent("upOre").Free;


while ComponentCount > 0  do
   Components[0].Free;

inherited;


 
Германн ©   (2011-07-28 01:23) [5]


> Drowsy ©   (28.07.11 01:06) [4]
>
> При уничтожении  var dmPutDat: TdmPutDat унаследованным
> деструктором возникала ошибка AV.  Чтобы выяснить, удаление
> какого компонента приводит к ошибке, я и написал обработчик
> события onDestroy.

А создавал ты их как? Эти компоненты? Или ты их и не создавал "сам ручками"?


 
Drowsy ©   (2011-07-28 01:42) [6]

В том то и дело, что все компоненты набросал с панели компонент в дизайн-тайме. И конструктор TdmPutDat унаследован ( не перекрывал ).


 
Германн ©   (2011-07-28 01:55) [7]


> И конструктор TdmPutDat унаследован ( не перекрывал ).

И конструктор тоже "набросал" с панели компонентов?


 
Drowsy ©   (2011-07-28 02:01) [8]

нет, я его " из меню набросал "
IDE : FILE->NEW->DATAMODULE

В project source :
 Application.CreateForm(TdmPutDat, dmPutDat);


 
Anatoly Podgoretsky ©   (2011-07-28 11:31) [9]

> Drowsy  (27.07.2011 23:00:00)  [0]

Destroy без Create


 
Anatoly Podgoretsky ©   (2011-07-28 11:32) [10]

> Drowsy  (28.07.2011 01:42:06)  [6]

Так каког черты ты тогда применяешь Destroy здесь


 
SQLEXPRESS   (2011-07-28 13:55) [11]

while ComponentCount > 0  do
begin
 if Components[0] <> nil then
   FreeAndNil(Components[0]);
end;


 
Игорь Шевченко ©   (2011-07-28 15:05) [12]

SQLEXPRESS   (28.07.11 13:55) [11]

Расстрелять. Из ржавого пистолета.


 
SQLEXPRESS   (2011-07-28 15:07) [13]


> Игорь Шевченко ©   (28.07.11 15:05) [12]

дайте мастер-класс.
почему?


 
Игорь Шевченко ©   (2011-07-28 15:11) [14]


> дайте мастер-класс.


destructor TComponent.Destroy;


 
Юрий Зотов ©   (2011-07-28 15:32) [15]

> SQLEXPRESS   (28.07.11 15:07) [13]

Потому что компоненты, имеющие владельца (Owner) автоматически уничтожаются вместе с ним. В данном случае это так и будет, поэтому ЛЮБОЙ код "ручного" уничтожения просто не нужен.


 
Drowsy ©   (2011-07-28 15:55) [16]

Ещё раз :
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:56) [17]


> Почему?


потому что у тебя где-то в другом месте портится память, а проявляется это в виде вот такого забавного эффекта.

Отладчик - рулез фарева


 
SQLEXPRESS   (2011-07-28 17:01) [18]

имхо, один из уничтожаемых как то ссылается на 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 17:19) [19]

> SQLEXPRESS   (28.07.11 17:01) [18]

> if Assigned(FDataSet) and (FDataSet.UpdateObject = Self) then
>   FDataSet.UpdateObject := nil;

> а тут, потенциально, не рванет?

Рванет, если FDataSet начнет что-то делать со своим UpdateObject. Вообще, странный код - обычно для уведомления компонентов об удалении их компонентов-ссылок используется FreeNotification.


 
Игорь Шевченко ©   (2011-07-28 17:53) [20]

SQLEXPRESS   (28.07.11 17:01) [18]

http://lib.ru/LITRA/CHEHOW/r_letter.txt


 
_Юрий   (2011-07-28 19:24) [21]

Ошибка в другом месте, а тут проявляется
Попробуй проверить на пустом дата-модуле с единственным TIBUpdateSQL.
FastMM поможет отладке


 
SQLEXPRESS   (2011-07-28 19:57) [22]


> Игорь Шевченко ©   (28.07.11 17:53) [20]

читал..
а из собственного ничего нет7


 
Игорь Шевченко ©   (2011-07-28 20:20) [23]


> а из собственного ничего нет7


Все уже написано до нас. Но перечитать невредно, чтобы подумать, а стоит все пришедшие в голову мысли торопиться выносить на форум или все-таки погодить.


 
Юрий Зотов ©   (2011-07-28 21:42) [24]

> Сабж

Кинул на форму 2 компонента:

type
 TForm1 = class(TForm)
   IBUpdateSQL1: TIBUpdateSQL;
   IBDataSet1: TIBDataSet; // UpdateObject = IBUpdateSQL1
 private
   { Private declarations }
 public
   { Public declarations }
 end;

и запустил. Форма закрывается нормально. Похоже, где-то Вы перемудрили.


 
Юрий Зотов ©   (2011-07-29 03:23) [25]

Может быть, не установлен Update Pack? Насколько поню, к D6 шли пакеты обновлений и в одном из них как раз правились IB-компоненты.


 
Drowsy ©   (2011-07-29 04:46) [26]

У меня установлено обновление IBX 6.11 для Delphi 6 SP2 . со страницы  http://www.ibase.ru/


 
Anatoly Podgoretsky ©   (2011-07-29 16:32) [27]

> Drowsy  (29.07.2011 04:46:26)  [26]

Врать не хорошо, SP выпускался только для Д3 - единственный


 
Drowsy ©   (2011-07-29 19:20) [28]

Я доверчивый, всем верю, и Вам и им
http://www.ibase.ru/components.htm#components



Страницы: 1 вся ветка

Текущий архив: 2011.11.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1311793235
Drowsy
2011-07-27 23:00
2011.11.20
При уничтожении модуля данных возникает AV.


6-1245392255
SortoVaritu
2009-06-19 10:17
2011.11.20
Вопрос по FtpGetFile


2-1312118983
From4pda
2011-07-31 17:29
2011.11.20
работа с TDriveComboBox


2-1311930662
From4pda
2011-07-29 13:11
2011.11.20
копирование файлов


3-1266501690
Sergey2
2010-02-18 17:01
2011.11.20
переменная в секции From