Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение заголовков форм приложения... ...находящихся в произвольных иерархиях 
:(
    Опции темы
CyraxZ
Дата 1.8.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Ситуация следующая. Имеется главная форма приложения, на которой (а вернее, на панели) отображается главная схема, и произвольное число подчинённых (под "подчинённых" я понимаю, что при закрытии формы каскадно закрываются все дочерние формы) форм, на каждой из которых (также на панельках) отображается соответствующая подсхема главной схемы. Каждая из подчинённых форм также может иметь произвольное число своих подчинённых форм с подсхемами.
Заголовок каждой формы состоит из заголовков всех родительских форм + число (номер). Это число характеризует количество данных схем, открытых в в данном приложении (одну и ту же подсхему можно открывать в отдельном окне сколько угодно раз).
При закрытии одной из форм необходимо изменить заголовки всех форм, которые связаны с данной формой, т.е. отображают ту же схему, что и данная форма, либо являются потомками формы, отображающей данную схему.
При этом нужно исключить из процесса обновления заголовков те формы, которые являются потомками закрываемой формы, поскольку они также будут закрыты. Это нужно, чтобы не тратить процессорное время на лишнее обновление заголовков.

Вопрос следующий:
Каким образом проще всего исключить из процесса обновления заголовков дочерние формы ?
Пока я обновляю заголовки в обработчике события формы Disposed (посредством Application.OpenForms), которое генерируется после закрытия формы. Вследствие чего, получаю null'евое поле Owned закрываемой формы (память уже освобождена). Если обновлять заголовки в обаботчике какого-то события, генерируемого до закрытия формы, то можно было бы вычислить всех потомков закрываемой формы через свойства Owned...

PM MAIL   Вверх
tdebugger
Дата 3.8.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

Репутация: 2
Всего: 4



Нельзя ли визуально показать, как это все выглядит.
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 4.8.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Визуально ?!  Довольно трудоёмко...

Перефразирую текст вопроса:
Имеется форма F, у неё есть дочерняя форма F1, у которой в свою очередь тоже есть дочерняя форма F11. При закрытии формы F предварительно каскадно закрываются формы F1 и F11. Т.е. вначале генерируется событие OnDisposed формы F11, затем OnDisposed формы F1 и, наконец, OnDisposed формы F.
В обработчике OnDisposed я изменяю заголовки всех форм. Для исключения из кандидатов на изменение заголовка форм F11, F1 и F необходимо при первом вызове обработчика OnDisposed (когда освобождается форма F11) определить идентификаторы (например, handle'ы) форм F1 и F, которые сейчас закроются.
Но событие OnDisposed формы F11 генерируется, когда эта форма уже освобождена, т.е. её поле Owner = null. И мы не сможем получить никакой информации о её владельцах F1 и F...

Наилучшим решением будет использование события, которое генерируется перед физическим закрытием формы (сразу же после нажатия на крестик, F4 или через системное меню) и только для закрываемой формы (для дочерних форм не генерируется, как в случае с OnDisposed).

з.ы. Собственно, вариант с OnDisposed не совсем приемлем, поскольку для данного примера (при закрытии формы F) процедура обновления заголовков будет выполняться 3 раза (OnDisposed формы F11, OnDisposed формы F1 и OnDisposed формы F) вместо одного...

PM MAIL   Вверх
tdebugger
Дата 6.8.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

Репутация: 2
Всего: 4



Цитата

Каким образом проще всего исключить из процесса обновления заголовков дочерние формы ?

а если так:
Код

        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
                обновляемЗаголовкиРодительскихОкон;
        }

с помощью этого CloseReason можно определить, кто инициализировал закрытие окна: система, юзверь, либо было ЗАКРЫТО РОДИТЕЛЬСКОЕ ОКНО- кажется об этом и идет речь.

Цитата

Это нужно, чтобы не тратить процессорное время на лишнее обновление заголовков.

В программе на .NET о какой-либо экономии как правило можно забыть...
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 14.8.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Проблема следующая. CloseReson равен UserClosing и для всех дочерних (по отношению к закрываемому окну) окон...

Добавлено через 27 секунд
А мне как раз нужно отбросить из обработки дочерние окна...
PM MAIL   Вверх
tdebugger
Дата 16.8.2007, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

Репутация: 2
Всего: 4



Как это? Как у тебя создаются дочерние окна?
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 16.8.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

Как это? Как у тебя создаются дочерние окна?

Имеется окно (форма 1). Тыкаю мышой на подсхему. В обработчике тыкания мышой этой формы создаю новыю форму. Причём при закрытии формы 1 предварительно каскадно закрывается дочернее окно...
PM MAIL   Вверх
tdebugger
Дата 17.8.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

Репутация: 2
Всего: 4



Я не о том, я код имел в виду, ибо не понятно, почему у дочернего окна CloseReason не равен FormOwnerClosing.
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
CyraxZ
Дата 27.8.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Нет, всё-таки у дочерних окон CloseReason равен OwnerClosing. Как-то не так смотрел...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.