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

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

Уничтожение родительской формы [D7, WinXP]


Страницы:   1 2

Alex Kryuchkov ©   (2006-10-09 14:19:00) 

Добрый день!

Есть МДИ-приложение. Пусть его главная форма называется ФОРМА1.
В нём имеется ФОРМА2, которая вяляется МДИ-потомком ФОРМЫ1.

А на ФОРМЕ2 расположена ФОРМА3, то есть ФОРМА3.parent=ФОРМА2,
ФОРМА3.owner=ФОРМА2,

Пусть на ФОРМЕ3 есть КНОПКА.
По нажатию этой кнопки выполняется уничтожение ФОРМЫ2, т.е
FORM2.Free;

Так вот, если так делать, то получим Access Violation, что естественно, так как ФОРМА2 пытается уничтожить ФОРМУ3, а та как раз выполняет обработку сообщения нажатия на кнопку.
В документации по Делфи написано, что так делать нельзя.

НО!

Если мы перед уничтожением ФОРМЫ3 покажем какой-нибудь месседж, то ошибки не увидим:

procedure TForm3.Button1Click(Sender: TObject);
begin
 Showmessage('сообщение');
 Form2.Free;
end;

Аналогичный эффект будет, если соответствующим образом переопределить деструктор ФОРМЫ2.

Внимание вопрос
Почему так происходит? И как избежать ошибки без отображения сообщения?

Проблема состоит в том, что имеется достаточно большое приложение, в котором есть похожий код и отказаться от такой схемы нельзя.


Alex Kryuchkov   (2006-10-09 16:52:00) [21]

Уважаемый Shirson!
Спасибо за ответ.

К сожалению, предложенный Вами способ реализовать нельзя.
Дело в том, что приведенный мною здесь пример иллюстрирует работу очень сложного и большого приложения, в котором (возможно) была допущена ошибка проектирования в части обработки сообщений.
Реализация Вашего способа очень трудоемка.

Именно поэтому хотелось бы узнать, как можно решить проблему каким-нибудь "обходным путем"


Shirson   (2006-10-09 16:11:00) [22]

Alex Kryuchkov, организуйте "очередь" команд для этого случая, которая обрабатывается в процедурах Form1. При нажатии на кнопку удаления Form2, не происходит именно удаления, а генерится событие, которое обрабатывается в Form1 и из неё удаляется Form2.
Надеюсь, я достаточно наглядно описал свою мысль?


Сергей М.   (2006-10-09 16:11:00) [23]


> обработка сообщений и код ВЦЛ (а по сути проблема в нём)


Если так, то в "Начинающие" ты попал совершенно закономерно.


Сергей М.   (2006-10-09 16:10:00) [24]


> Alex Kryuchkov   (09.10.06 16:07) [11]


> ничего конструктивного в ваших ответах я не заметил


Пока не ответишь на вопрос [1], "конструктивного" не жди.

Потому что "MDI-потомок" - это не понятно что.


Alex Kryuchkov   (2006-10-09 16:08:00) [25]

Кроме того, я категорически не согласен с переводом вопроса в категорию "для начинающих".
По-моему, обработка сообщений и код ВЦЛ (а по сути проблема в нём) - это не вопрос для начинающих


Alex Kryuchkov   (2006-10-09 16:07:00) [26]

Что ж господа, кроме абстрактых обсуждений ничего конструктивного в ваших ответах я не заметил.
Но всё равно спасибо за участие


Shirson   (2006-10-09 15:58:00) [27]

Что в нём идиотского?
Автор написал "ФОРМА2, которая вяляется МДИ-потомком ФОРМЫ1"
Вы спросили "Как это?"
Я вам перевёл "MDIChild = МДИ-потомок"

Что идиотского в моём ответе?


Сергей М.   (2006-10-09 15:54:00) [28]


> Shirson ©   (09.10.06 15:51) [8]


Идиотский ответ на вполне резонный вопрос к автору"что такое MDI-потомок"


Shirson   (2006-10-09 15:51:00) [29]

Эот был ответ на твой вопрос.


Сергей М.   (2006-10-09 15:30:00) [30]


> Shirson ©   (09.10.06 15:23) [6]


У автора непонимание.
А галиматья именно у тебя.


Shirson   (2006-10-09 15:23:00) [31]

Сергей М. ты это не мне говори, а автору.


Плохиш   (2006-10-09 15:18:00) [32]


> Alex Kryuchkov   (09.10.06 14:19)  


> Пусть на ФОРМЕ3 есть КНОПКА.
> По нажатию этой кнопки выполняется уничтожение ФОРМЫ2, т.
> е
> FORM2.Free;

Ужасть, вот дети пошли так и наровят родителей топором прибить.

> А на ФОРМЕ2 расположена ФОРМА3, то есть ФОРМА3.parent=ФОРМА2,
> ФОРМА3.owner=ФОРМА2,

тогда уж, TForm(self.Parent).Release;

> Проблема состоит в том, что имеется достаточно большое приложение,
>  в котором есть похожий код и отказаться от такой схемы
> нельзя.

Тогда это не код, а сплошной глюкодром.


clickmaker   (2006-10-09 15:17:00) [33]

Потомок - это некто, наследующий что-то от родителя.
MDI-child ничего от главной формы не наследует. Он сам по себе, но находится внутри нее. Разные понятия.


Сергей М.   (2006-10-09 14:51:00) [34]


> Shirson ©   (09.10.06 14:44) [2]


Галиматья.


Shirson   (2006-10-09 14:44:00) [35]

Child можно перевести как "потомок". Получите и распишитесь MDIChild = МДИ-потомок.(а CD-ROM = КД-ПЗУ)


Сергей М.   (2006-10-09 14:35:00) [36]


> ФОРМА2, которая вяляется МДИ-потомком ФОРМЫ1


Это как ?


Страницы:   1 2

Наверх

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