![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение родительской формы [D7, WinXP]
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
Это как ?