Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизПроверка на существование MDI-Child Найти похожие ветки
← →
Zlodey © (2004-05-07 11:49) [0]Доброго времени суток!
Ситуация такая:
- проект состоит из главной формы и кучи дочерних
- все дочерние вызываются из главной с помощью меню
Всё дело в том что можно запустить много копий одной и той же формы. Раньше я решал эту проблему путём блокировки определённых пунктов меню, но сейчас слишком много форм в проекте, и обходится блокировкой, пусть даже по "бит-маске" не очень-то хочется.
Можно ли как-нибудь проверять запущена ли форма?
← →
Digitman © (2004-05-07 11:55) [1]with MyMDIForm do
for I := 0 to MDIChildCount-1 do
if MDIChildren[I] is TSomeMDIChildForm then
ShowMessage("Как минимум один экз-р формы класса TSomeMDIChildForm создан !");
← →
BAYES © (2004-05-07 12:32) [2]if not Assigned(form5) then
form5:= Tform5.Create(Application);
form5.Show;
← →
Семен Сорокин © (2004-05-07 12:54) [3]BAYES © (07.05.04 12:32) [2]
if not Assigned(form5) then
form5:= Tform5.Create(Application);
form5.Show;
ага, а ничего что ссылка на память после удаления остается, если явно не выставлять в nil. И использование явных имен (form5) -плохой тон.
Zlodey © (07.05.04 11:49)
см. [1]
← →
Курдль © (2004-05-07 13:06) [4]
> Семен Сорокин © (07.05.04 12:54) [3]
> ага, а ничего что ссылка на память после удаления остается,
> если явно не выставлять в nil.
Надо выставлять по onDestroy
> И использование явных имен (form5) -плохой тон.
Кто это сказал? Разве хуже создать глобальную переменную, чем всегда искать в цикле по имени класса?
← →
Семен Сорокин © (2004-05-07 14:20) [5]Курдль © (07.05.04 13:06) [4]
Кто это сказал? Разве хуже создать глобальную переменную, чем всегда искать в цикле по имени класса?
для многократно создаваемых MDIChild?
А если таких окон несколько?
← →
Курдль © (2004-05-07 14:59) [6]
> для многократно создаваемых MDIChild?
> А если таких окон несколько?
Так задача, кажется, в том и состояла (как я понял из сумбурного топика автора), чтобы не открыть более 1-го!
← →
WebErr © (2004-05-07 15:23) [7]Не знаю как вы, но я, когда мне нужно открыть не более одного MDIChild окна использую
а) Assigned(SomeForm)
б) SomeForm := nil; в обработчике OnClose
Цикл из [1] тоже хорош пока окон мало... :)
← →
Семен Сорокин © (2004-05-07 15:30) [8]Курдль © (07.05.04 14:59) [6]
Так задача, кажется, в том и состояла (как я понял из сумбурного топика автора), чтобы не открыть более 1-го!
а мне показалось что более 1-ой копии:
... Всё дело в том что можно запустить много копий одной и той же формы. ...
:)
← →
Курдль © (2004-05-07 15:32) [9]Повторяю, что метод, рекомендованный самим Борландом (и присутствующий в его сэмплах):
procedure TMDIChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
А по onDestroy -MDIChildForm := nil;
← →
Курдль © (2004-05-07 15:37) [10]
> а мне показалось что более 1-ой копии:
Ну тогда можно согласиться на компромисс - "не более 10" и утвердить АднАзнАчнА [1]
> и обходится блокировкой, пусть даже по "бит-маске"
А это что бы значило?
← →
WebErr © (2004-05-07 16:16) [11]
> Курдль © (07.05.04 15:32) [9]
Вы не дождётесь OnDestroy до тех пор, пока не уничтожится MDIParent даже если укажите Action := caFree;
← →
Digitman © (2004-05-07 16:24) [12]давайте не будем уже мудрить !
свойство-список MDIForm.MDIChildren[] УЖЕ хранит ВСЕ ссылки на ВСЕ экземпляры ЛБЫХ наследников child-форм, КОГДА-ЛИБО созданных в ходе работы приложения и СУЩЕСТВУЮЩИХ на момент обращения к свойству-списку ... ВНЕ зависимости, фиксировались ли еще в разное время где-либо ссылки на создаваемые доч.формы программером ...
посему итеративно сканируя этот список в произв.момент времени, мы можем получить ссылку на ВСЕ СУЩЕСТВУЮЩИЕ экз-ры форм, явл-ся дочерними по отн-ю к указанной MDI-форме и ПОСЧИТАТЬ, стколько экз-ров того или иного класса УЖЕ созданы
← →
Mim1 © (2004-05-07 16:25) [13]WebErr © (07.05.04 16:16) [11]
> Вы не дождётесь OnDestroy до тех пор, пока не уничтожится
> MDIParent даже если укажите Action := caFree;
Можеш привести аргумент в зашиту своих слов? Или пример.
← →
ASMiD © (2004-05-07 16:41) [14]Я решил эту задачу так:
Перекрыл Create (не OnCreate), где в качестве дополнительного параметра передал ссылку на пункт меню. Там же сделал его Disabled, а в OnDestroy Enabled.
Работает замечательно, и перебирать ничего не надо и флаги не нужны.
← →
WebErr © (2004-05-07 16:43) [15]
> Mim1 © (07.05.04 16:25) [13]
Проверьте!
← →
Digitman © (2004-05-07 16:46) [16]
> ASMiD © (07.05.04 16:41) [14]
ты-то , может, в соответствии со своими КОНКРЕТНЫМИ условиями и решил .. а вот автор НИ СЛОВОМ не обмолвился о том, что ему требуется контроль создания ЕДИНТСВЕННОГО экз-ра каждого класса доч.формы ... скачи тут с бубном и гадай, что там ему нужно))))
"много" - это вполне м.б. и 2, и 3, и 1000, и ....)
к вопросу о ТЗ)
← →
Mim1 © (2004-05-07 16:50) [17]WebErr © (07.05.04 16:43) [15]
Проверил (хотя и без проверки был уверен).
← →
ASMiD © (2004-05-07 16:51) [18]Кстати, у меня еще количество пунктов меню может меняться в процессе работы, и это тоже ловится.
← →
Mim1 © (2004-05-07 16:52) [19]ASMiD © (07.05.04 16:41) [14]
ИМХО не совсем красиво mdichild знать о mdiparent. Усложняет разработку этих самых чайлдов, всесто того чтобы одноразово усложнить parent.
← →
WebErr © (2004-05-07 16:55) [20]
> Digitman © (07.05.04 16:46) [16]
Всё дело в том, что применимость [1] обусловлена наличием цила, что влечёт проблемы при реализациях с большим числом классов дочерних MDI окон. В случае, когда окно данного класса может быть только одно ИМХО выгоднее действовать через Assigned. (Хотя это логически не совсем верно, так как переменная одна на весь Unit).
> Mim1 © (07.05.04 16:50) [17]
А они у Вас точно MDIChild? ^^
← →
Mim1 © (2004-05-07 16:58) [21]WebErr © (07.05.04 16:55) [20]
А ты сам проверь.
← →
WebErr © (2004-05-07 16:58) [22]
> Mim1 © (07.05.04 16:50) [17]
Sorry, действительно достигается OnDestroy. :/
← →
Mim1 © (2004-05-07 17:00) [23]WebErr :)))
бывает ...
← →
ASMiD © (2004-05-07 17:08) [24]
> ИМХО не совсем красиво mdichild
Да класс-то создается один раз, а от него - все остальные.
Чего тут плохого или сложного?
← →
Mim1 © (2004-05-07 17:18) [25]ASMiD © (07.05.04 17:08) [24]
> а от него - все остальные.
Наследоваться чтоли? Хотя спорить смысла не вижу, решений море.
← →
ASMiD © (2004-05-07 17:34) [26]
> Хотя спорить смысла не вижу, решений море
Абсолютно согласен
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.037 c