Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
1-1083924175
kull
2004-05-07 14:02
2004.05.23
Как избавиться от goto?


14-1083298298
Delphi X PRO
2004-04-30 08:11
2004.05.23
На канве рисунки


3-1083182282
Курдль
2004-04-28 23:58
2004.05.23
Удаление записей из одной таблицы по ключам другой таблицы


3-1083079941
Kein
2004-04-27 19:32
2004.05.23
как открыть InterBase базу


1-1084300717
NataliaC
2004-05-11 22:38
2004.05.23
Шифрование (REDOC)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский