![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access violation достал.... [D5, D6, Win95/98, Win2k]
Sirus © (2004-06-23 06:51:00)Привет Мастера...
Есть проблемка... Непостоянно возникает Access violation...
if HistoryForm<>Nil Then Begin
History.NormalClose:=True;
HistoryForm.Close;
FreeAndNil(HistoryForm);
Show;
End;
Подозреваю, что HistoryForm не успевает закрываться при Close и ошибка возникает на FreeAndNil...
Как можно вылечить???
younghacker (2004-06-24 10:03:00) [1]Роман!
Чем отличается для форм использование Release вместо Free?
Откройте исходники TForm и посмотрите!
Дело в том что часто под BDE форма с открытыми запросами
на которую отправили CM_Release не закрывается сразу, а остается
невидимой но с открытым запросом, и при подтверждении транзакции
запрос переоткрывается как будто форма активна.
Суть в том, что Release помещает в очередь событий окна сообщение на освобождение формы. И обработано оно будет когда будет сделано Application.ProcessMessage; тоесть после возврата из всех обработчиков формы.
Проблема именно в том что форма дает сообщение освободить себя
и метод сразуже отваливает. А сообщение ждет своей очереди. И когда она приходит. Нужно это понимать. :)
Феномен вызывает именно нестабильное поведение форм в приложении. И периодическое появление всяких глюков связанных с реальным _НЕ_освобождением формы. В том числе ощибки доступа когда форма принудительно освобождена, а кто-то думает что она еще живет на том же месте.
Так что я делал всегда так.
Free вместо Release.
А указатели на форму сбрасываю в деструкторе формы.
Естественно что при создании формы я передаю указатели на указатели формы и также автоматически их инициализирую в конструкторе формы.
Удачи!
ЮЮ (2004-06-24 09:32:00) [2]> А вышеуказанная процедура вызывается самой формой HistopryForm
> при нажатии кнопки...
Тогда чей метод Show вызывается? Самоуничтожаемой HistoryForm ???
И что там за History присоседилась к процессу самоубийства ???
if HistoryForm<>Nil Then Begin
History.NormalClose:=True;
HistoryForm.Close;
FreeAndNil(HistoryForm);
Show;
End;
TUser (2004-06-24 09:22:00) [3]
> А вышеуказанная процедура вызывается самой формой HistopryForm
> при нажатии кнопки...
Лучше ее не здесь вызывай.
Sirus (2004-06-24 07:58:00) [4]Форма создается главной формой...
А вышеуказанная процедура вызывается самой формой HistopryForm при нажатии кнопки...
В OnCloseQuery формы HistoryForm:
CanClose:=NormalClose;
Ошибка возникает не всегда... примерно один раз за 10 закрытий формы HistoryForm...
Роман (23.06.04 08:59) [5] > Таймера нигде нет...
В OnClose ничего нет...
Anatoly Podgoretsky (2004-06-23 11:41:00) [5]Так как здесь у тебя повтороное использование перенных, то можно предполагать, что это не единственное место где форма разрушается и создается, отсбда количество мест для ошибки гораздо больше.
Роман (2004-06-23 08:59:00) [6]Если ты делаешь то что написал в таймере, то скорее всего ты попадаешь в ситуацию, когра сообщение от таймера обрабатывается чуть раньше сообщения, посланного HistoryForm. Поэтому надо делать Release вместо Free, а затем просто присвоить HistoryForm:=nil;
Роман (2004-06-23 08:53:00) [7]Сделай в обработчике THistoryForm.OnClose присвоение action:=cafree вместо того, что ты делаешь.
И вообще, форма разрушается не через Free, а через Release.
TUser (2004-06-23 07:36:00) [8]
> Подозреваю, что ... ошибка возникает на FreeAndNil...
Надо посмотреть отладчиком.
А в OnClose формы что прописано. Я к тому, что м.б. Action = caFree (default), тогда на Free&Nil действительно будет AV.
Думкин (2004-06-23 07:11:00) [9]HistoryForm создан?
Sirus (2004-06-23 07:02:00) [10]TForm.Close ждет закрытия формы или нет???