Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Проверка на существование 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
7-1081528573
Sur
2004-04-09 20:36
2004.05.23
тип микропроцессора


14-1083747350
Maxim Vetera
2004-05-05 12:55
2004.05.23
Google нас обманывает?


3-1082531575
Wild
2004-04-21 11:12
2004.05.23
Компонент TDbf


9-1073815765
cyborg
2004-01-11 13:09
2004.05.23
Получение симфолов DirectIput


1-1084260941
Mameluke
2004-05-11 11:35
2004.05.23
Управление работой MS Word из Delphi