![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AV при Destroy [D6, Win2k]
}|{yk © (2004-08-09 14:52:00)Такой вот код, во фрейме
destructor TFrameReportByMonth.Destroy;
begin
OpExcelRep.Visible := false;
OpExcelRep.Connected := false;
DataModuleMain.OraQueryMonthes.Active := false;
DataModuleMain.SmartQueryPlat.Active := false;
inherited Destroy;
end;
Получаю AV на
DataModuleMain.OraQueryMonthes.Active := false;
GuAV (2004-08-09 15:25:00) [1]
> Как узнать, что м.д. не существует?
попробуй FreeNotification method (TComponent)
Гаврила (2004-08-09 15:19:00) [2]Твой Дата модуль наверняка был создан с параметром Owner = Application.
При закрытии приложения сам Application отвечает за разрушение дата модуля. Видимо, это происходит до того ,как ты пытаешься им манипулировать из деструктора фрейма
Anatoly Podgoretsky (2004-08-09 15:17:00) [3]}|{yk © (09.08.04 15:11) [11]
Проводить уничтожение, там где создание, в модуле данных.
Узнать верность указателя нельзя.
Sandman25 (2004-08-09 15:17:00) [4][16] }|{yk © (09.08.04 15:16)
Обнулить переменную, ссылающуюся на него, в том месте, где она уничтожается
}|{yk (2004-08-09 15:16:00) [5]2Sandman25
О том, как я я использую фреймы, я сейчас пишу статью. Потом будешь критиковать. Сейчас вопрос в другом. Как узнать, что м.д. не существует?
---
Жук - наш президент
}|{yk (2004-08-09 15:14:00) [6]>Если OraQueryMonthes и TFrameReportByMonth вставлені в одну форму
В какую одну форму? Да у меня вообще одна форма на приложение
GuAV (2004-08-09 15:12:00) [7]
> форму
дата модуль, то есть
---
GuAV - наш Жук
Sandman25 (2004-08-09 15:12:00) [8][9] }|{yk © (09.08.04 15:06)
Из описания паттерна "Слабое связывание"
Проблема
Как обеспечить зависимость, незначительное влияние изменений и повысить возможность повторного использования?
Степень связанности (coupling) — это мера, определяющая насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает. Элемент с низкой степенью связанности (или слабым связыванием) зависит от не очень большого числа других элементов. Выражение "очень много" зависит от контекста, однако необходимо провести его оценку.
Класс с высокой степенью связанности (или жестко связанный) зависит от множества других классов. Однако наличие таких классов нежелательно, поскольку оно приводит к возникновению следующих проблем.
Изменения в связанных классах приводят к локальным изменениям в данном классе.
Затрудняется понимание каждого класса в отдельности.
Усложняется повторное использование, поскольку для этого требуется дополнительный анализ классов, с которыми связан данный класс.
}|{yk (2004-08-09 15:11:00) [9]А как узнать, имеет ли модуль данных допустимое значение? Потому как ошибка возникает при закрытии приложения. Т.е. м.д. уже уничтожен, но не равен nil
GuAV (2004-08-09 15:11:00) [10]Если OraQueryMonthes и TFrameReportByMonth вставлені в одну форму, то трудно сделать какие либо предположения, кого убьют первым (по крайней мере мне трудно).
---
GuAV - наш Жук
Гаврила (2004-08-09 15:09:00) [11]
> >Не должен фрейм обращаться к датамодулям.
>
> Да ну? Вот это прикол. С какой такой радости?
Обращаться может. Но не должен ими управлять, как то создавать \ разрушать объекты, устанавливать connected
просто Стиль
}|{yk (2004-08-09 15:06:00) [12]>Не должен фрейм обращаться к датамодулям.
Да ну? Вот это прикол. С какой такой радости?
---
Жук - наш президент
Anatoly Podgoretsky (2004-08-09 15:06:00) [13]Проверка на nil не означает, что они имеют допустимое значение.
Гаврила (2004-08-09 15:06:00) [14]в этот момент DataModuleMain уже разрушен
GuAV (2004-08-09 15:06:00) [15]
> if DataModuleMain<>nil then
> if DataModuleMain.OraQueryMonthes<>nil then
OraQueryMonthes уничтожен, но никто его не обниливал
GuAV (2004-08-09 15:04:00) [16]
> DataModuleMain.OraQueryMonthes.Active := false;
with DataModuleMain do
OraQueryMonthes.Active := false;
имхо будет понятнее что [1]
Попробую применить телепатию: OraQueryMonthes уже уничтожен на момент вызова деструктора.
}|{yk (2004-08-09 15:04:00) [17]Делаю вот так
destructor TFrameReportByMonth.Destroy;
begin
if DataModuleMain<>nil then
if DataModuleMain.OraQueryMonthes<>nil then
DataModuleMain.OraQueryMonthes.Active := false;
OpExcelRep.Visible := false;
OpExcelRep.Connected := false;
inherited Destroy;
end;
Всё равно AV
---
Жук - наш президент
Sandman25 (2004-08-09 15:03:00) [18]Структура неверная. Не должен фрейм обращаться к датамодулям.
Ega23 (2004-08-09 15:00:00) [19]С
Connected:=falseместами поменять?
Anatoly Podgoretsky (2004-08-09 14:58:00) [20]Или DataModuleMain или OraQueryMonthes имеют недопустимое значение