Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Вниз

При уничтожении модуля данных возникает 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.003 c
3-1266323284
Mike Kouzmine
2010-02-16 15:28
2011.11.20
Беда с двойной точностью


1-1273589288
guest
2010-05-11 18:48
2011.11.20
Закорючки в Excel


15-1311249647
Scott Storch
2011-07-21 16:00
2011.11.20
запрос на удаление


15-1311210934
fzt
2011-07-21 05:15
2011.11.20
Окно подсказок по исходникам


2-1311708454
Lamer6666
2011-07-26 23:27
2011.11.20
Правильно ли работаю с потоками?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский