| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Наследуемым формам задать nil в родителе при закры |
| Автор: Злоумышленник 27.3.2007, 23:46 |
| В программе использую много MDI-форм внешне схожих, поэтому наследую их от одной формы. При закрытии в родителе ставлю Action := caFree; Но мне нужно также на переменную-указатель "имя формы" при закрытии ставить nil. Сейчас я это делаю в наследниках при закрытии (одно и то же практически при разных именах форм). Как это можно делать в родительской форме один раз? Self := nil не проходит. |
| Автор: yus 28.3.2007, 06:02 | ||||||||
Если я правильно понял вопрос, то можно при закрытии дочернего окна посылать главной форме сообщение, WM_USER что окно закрывается с передачей указателя дочерней формы и уже из родительской формы освобождать дочернее. Примерно так: Родительское:
Дочернее:
|
| Автор: ama_kid 28.3.2007, 07:20 |
| Вариант yus достаточно неплох (при условии, что и он, и я правильно поняли вопрос), но может правильней переопределить деструктор MDI-формы? |
| Автор: Злоумышленник 28.3.2007, 10:23 | ||||
| Вы меня не так поняли. Не главная форма, а родительская, она даже не создаётся, просто инкапсулирует общие для всех форм действия. А переопределение деструкторОВ MDI-форМ ничего нового, кроме лишнего кода, не даст. Вот определение формы, наследуемой от TfmLabxForm:
Я сейчас делаю примерно так в КАЖДОЙ наследуемой форме:
Хочется fmLabxForm1 := nil; и все остальные (fmLabxForm2, 3, ... ,35) один раз при закрытии в nil ставить в РОДИТЕЛЕ |
| Автор: Rennigth 28.3.2007, 11:35 |
| Злоумышленник, Что ты хочешь сделать, так нельзя. Я как понимаю это тебе нужно для анализа существования формы(аля создавать или нет)? Нужно писать отдельный менеджер который и будет создавать формы, хранить на них указатели, и анализировать их уничножение. |
| Автор: ama_kid 28.3.2007, 11:38 |
| Да позволено мне будет спросить: а откуда родитель может знать о своих потомках? По-моему, в принципах ООП такой связи не предусмотрено... Это потомок знает своего предка в лицо, а наоборот - это нонсенс какой-то... |
| Автор: Злоумышленник 28.3.2007, 11:52 |
| решено другим способом http://expert.delphi.int.ru/question_440 "Ответ эксперта: Задача осложняется тем, что на одну форму может быть не одна переменная-указатель. Что и есть в вашем случае. Self и FormXXX. И форма не сможет обнулить их всех. это даже в теории сложно звучит. Что делать. Есть два варианта. Один, в формкрейте передавать ссылку на переменную, которую нужно обнулить по выходу. Второе решение заключается в том, (я его часто применяю) что когда форма пропадает, то она пропадает с глобального маасива Screen.Forms. Тоесть, когда создаёте новую форму, вам нужно проверить, а нет ли её ещё. И с помощю банального цикла for i:=0 to Screen.FormCount-1 do if TForm(Screen.Forms).XXXXX = XXXXX then {наша форма найдена!} мы по какомуто критерию ищем нашу форму. Нашли - указатель на неё валиден. нет - звиняйте. Можно обнулять и создавать новую форму. Пожалуйста, не забывайте оценивать ответы экспертов! Нам важно Ваше непредвзятое мнение! Ответ отправил(а): Вадим К Дата и время отправки ответа: 28.03.2007, 11:31" Правда, проверить смогу только через 2 недели на работе - сейчас отпуск |