Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MDI, как из дочерней формы достучаться до меню родительской формы? / 15 сообщений из 15, страница 1 из 1
06.12.2004, 11:51
    #32814050
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Ситуация простая. Есть родительская форма и кучка дочерних. Когда я открываю дочернюю из меню родительской формы , то я блокирую пункт меню. Ну чтоб юзер не открыл дочернюю форму еще раз.

Теперь.

Мне надо после закрытия дочерней формы в меню главной сбросить enable.
Т.е в событии закрытия дочерней формы разрешить в меню главной ее открывать.
...
Рейтинг: 0 / 0
06.12.2004, 12:06
    #32814110
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Есть способ гораздо проще.
Добавь в свою дочернюю форму главное меню, содержащее пункт, который надо отключить. Установи его свойство "отключено".
Для наложения меню дочерней формы на меню главной формы надо обоим присвоить свойство MenuItem.MergeType и одинаковый MergeOrder

--
Успехов,
Роман С. Голубин
...
Рейтинг: 0 / 0
06.12.2004, 12:17
    #32814152
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Роман!

Я тут наваротил блин...

Ну вот

На родительской форме такое меню

ИмяМеню
Итем1

На дочерней мне тоже надо сделать такое же меню?
У меня на дочерней вообще нет меню. Сделать меню с одним итемом как на родительской форме?

Запутался в конец...
...
Рейтинг: 0 / 0
06.12.2004, 12:39
    #32814208
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Пример:

На родительской форме создаем меню:

File
NewChild
- (separator)
Exit

Допустим, при открытии дочерней формы надо прикрыть пункт NewChild.
Для этого в дочерней форме создаем меню

File
NewChild (disabled)

Далее у всех пунктов меню (и родительских и дочерних), включая сепараторы, устанавливаем свойство MenuItem.MergeType в MergeItems, и указываем порядок объединения (свойство MenuItem.MergeOrder):

В родительской форме:
Код: plaintext
1.
2.
3.
4.
mnuFile.MergeOrder = 100;
mnuNewChild.MergeOrder = 101;
mnuFileSeparator9.MergeOrder = 190
mnuExit.MergeOrder = 191
В дочерней форме:
Код: plaintext
1.
2.
3.
mnuFile.MergeOrder = 100;
mnuNewChild.MergeOrder = 101;
mnuNewChild.Enabled = false;
--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
06.12.2004, 12:49
    #32814242
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Спасибо. Получилось. Но только есть одна пакость, меню которое было первым в родительской форме улетело последним... Как с этим быть?
...
Рейтинг: 0 / 0
06.12.2004, 12:56
    #32814252
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Установить MergeOrder у всех пунктов родительского меню. В том порядке, как ты хочешь что бы они располагались. (см. мой пост выше)
...
Рейтинг: 0 / 0
06.12.2004, 13:15
    #32814297
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Спасибо,Роман.

Все таки хотелось бы знать как обратиться к итему меню родительской формы из дочерней, теперь мне придется в каждой из 30 дочерних менюхи лепить...
...
Рейтинг: 0 / 0
06.12.2004, 14:52
    #32814595
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Ну, это я не считаю минусом, так как в любом случае, имхо, почти у каждой дочерней формы должно быть что добавить в главное меню при ее активизации. Например - пункт меню Close. :-)

А если уж так приспичило обратиться напрямую - из дочернего окна вызывай родительское. Например, если родительское окно класса MDIClient, то
Код: plaintext
1.
((MDIClient)this.MdiParent).mainMenu.MenuItems[ItemID].Enabled = true;
Только mainMenu родителя надо объявлять как public.
...
Рейтинг: 0 / 0
06.12.2004, 15:16
    #32814647
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Сделал в родительской форме меню public.

Родительское окно класса MDIClient ???

Оно у меня MdiContainer

Родительская форма называется FrmMain меню на ней MainMenu1 в меню надо разрешить команду для итема с индексом 1.

((MDIClient)this.MdiParent).

Как это понимать?
...
Рейтинг: 0 / 0
06.12.2004, 15:35
    #32814695
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
EternalСделал в родительской форме меню public.

Родительское окно класса MDIClient ???

Да. Стандартный контейнер MDI в MFC.
Eternal
Родительская форма называется FrmMain меню на ней MainMenu1 в меню надо разрешить команду для итема с индексом 1.

((MDIClient)this.MdiParent).

Как это понимать?
В данном конкретном случае так:
((FrmMain)this.MdiParent).MainMenu1.MenuItems[1].Disabled = false;
...
Рейтинг: 0 / 0
06.12.2004, 15:48
    #32814735
Sirios
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
А не проще функции нажатия итема написать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private void menuItem1_Click(object sender, System.EventArgs e)
		{
			
			Child chForm = new Child();
                         // запретить все что нуна
			chForm.ShowDialog(this); 
			// разрешить все что нуна
			chForm.Dispose();
			
		}
...
Рейтинг: 0 / 0
06.12.2004, 16:09
    #32814796
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Рома , респект и спасибо за терпение.


((FrmMain)this.MdiParent).mainMenu1.MenuItems[0].MenuItems[2].Enabled=true;

Работает же !

Sirios

Я же разрешаю / запрещаю выбор команды из родительской формы?
...
Рейтинг: 0 / 0
06.12.2004, 16:26
    #32814833
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
EternalРома , респект и спасибо за терпение.

((FrmMain)this.MdiParent).mainMenu1.MenuItems[0].MenuItems[2].Enabled=true;

Работает же !

имхо, замечательно, но это не правильный подход :-))
Проблемы возникнут сразу, как только в меню попытаешься добавить еще один пункт - придется переписывать все дочерние формы :-)
Можно, конечно, затолкать это в родительской форме в отдельную процедуру... но, опять таки, имхо, - не правильно это... :-)
Ибо ту же форму можно открыть и не как MDI и тогда опять возникнут проблемы...

Самый правильный вариант, опять же, имхо, с добавлением собственного меню в каждую форму и дальнейшем объединении этого меню с родительской формой.
...
Рейтинг: 0 / 0
06.12.2004, 16:50
    #32814914
# Darth Vader #
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
Roman S. Golubin EternalРома , респект и спасибо за терпение.

((FrmMain)this.MdiParent).mainMenu1.MenuItems[0].MenuItems[2].Enabled=true;

Работает же !

имхо, замечательно, но это не правильный подход :-))
Проблемы возникнут сразу, как только в меню попытаешься добавить еще один пункт - придется переписывать все дочерние формы :-)
Можно, конечно, затолкать это в родительской форме в отдельную процедуру... но, опять таки, имхо, - не правильно это... :-)
Ибо ту же форму можно открыть и не как MDI и тогда опять возникнут проблемы...

Самый правильный вариант, опять же, имхо, с добавлением собственного меню в каждую форму и дальнейшем объединении этого меню с родительской формой.

Я не сомневаюсь в том, что ты говоришь верно. Просто быстрей мне показалось вторым способом.

Ну тогды подскажи. Допустим в родительской форме такое меню

Меню1

подменю_1
подменю_2
подменю_3

Меню2

подменю_1
подменю_2
подменю_3

И так далее.

Я уже столкнулся со сложностями реализации эти способом.

ну например...

В дочернюю запиндюрил
меню и подменюшками и там enable поствил в false , вроде при открытии всепроходит хорошо, срабатывает блокировка, но стоит открыть другую дочернюю форму и снова в родительской форме доступен пункт меню, хоть и merge выбирал и числа в order совпадают.

и еще тут проблемс..Как бы командой из меню родительской формы свернуть все дочерние формы...
...
Рейтинг: 0 / 0
06.12.2004, 17:37
    #32815063
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MDI, как из дочерней формы достучаться до меню родительской формы?
EternalВ дочернюю запиндюрил
меню и подменюшками и там enable поствил в false , вроде при открытии всепроходит хорошо, срабатывает блокировка, но стоит открыть другую дочернюю форму и снова в родительской форме доступен пункт меню, хоть и merge выбирал и числа в order совпадают.

А, ну тогда все верно. Тогда пункт меню надо гасить в родительской форме, привязывать обработчик к событию Closed каждого дочернего окна и в ней снова включать пункт меню. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class MdiClient : Form {
  /// ....
  private void mnuCreateChild_Click(object sender, EventArgs e) {
    mnuCreateChild.Enabled = false;
    Form child = new FormChild();
    child.Closed += new System.EventHandler(child_Closed)
    child.MdiParent = this;
    child.Visible = true;
  }

  private void child_Closed(object sender, EventArgs e) {
    mnuCreateChild.Enabled = true;
  }
  /// ...
}

Eternal
и еще тут проблемс..Как бы командой из меню родительской формы свернуть все дочерние формы...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
class MdiClient : Form {
  /// ... 
  private void mnuMinimizeAll_Click(object sender, EventArgs e) {
    foreach(Form frm in MdiChildren) {
      frm.WindowState = FormWindowState.Minimized;
    }
  }
  /// ...
}

--
Удачи,
Роман С. Голубин
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MDI, как из дочерней формы достучаться до меню родительской формы? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]