Форум: "Начинающим";
Текущий архив: 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