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

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

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 имеют недопустимое значение


Наверх

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