Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Снова MDI форма Добавлено: 13.07.04 18:11  

Автор вопроса:  danser | ICQ: 299287824 
У меня есть MDI форма (MDIForm) - которая служит контейнером для дочерних форм. С этой формы я создаю другие (дочерние) формы. Перед закритием активной дочерней форми(MDIForm.ActiveMdiChild) я могу отслеживать это собитие(Closed, Closing).Теперь допустим я создал 5 дочерних окон и активное 5-е.
ПРОБЛЕМА: Когда закривается MDIForm(отлавливаю собитие Closing для MDI формы) я хочу как то визывать собития Closing для всех дочерних форм(как например в Word'e где при закритии главного окна выводятся сообщения про закритие всех несохраненных дочерних окон), а у меня в место этого генерируется Closing только для активного дочернего окна :-((. Что делать что б перебрать все дочерние откритые окна?

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 VladDor



Вопросов: 17
Ответов: 47
 Профиль | | #1 Добавлено: 14.07.04 12:40
   Я вызывал msgbox о сохранении только для той Child формы где были сделаны какие-то изменения, остальные закрывались без запроса.

Ответить

Номер ответа: 2
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #2 Добавлено: 14.07.04 17:06
Так я ж и спрашиваю как мне получить доступ допустим к 2-му окну, которое не активно?

Ответить

Номер ответа: 3
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #3 Добавлено: 14.07.04 17:07
Попробовал. Все работает. При закрытии родительского окна, для всех 3-х дочерних окон (не важно какое активное) автоматически вызывается событие Form_QueryUnload(...) :)

Ответить

Номер ответа: 4
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #4 Добавлено: 14.07.04 19:30
Что за собитие? Кто его генерит- дочерняя форма?(то есть как его отловить...)
Я не могу найти это событие ни в событиях главной формы ни в событиях дочерней. Может у меня FW старий(1.0)

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 15.07.04 06:42
Видимо Андрей перепутал .Net и VB6...
Аналог события QueryUnload в .Net - Closing.

Ответить

Номер ответа: 6
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #6 Добавлено: 15.07.04 14:16
Так я ж и говорю(смотри первый вопрос) что через Closing главной формы гененерится только Closing активной дочерней и закривается главная вместе с неактивными дочерними. Наверно нужно как то делать по очереди активними все оставшиеся дочерние окна и вновь генерить Closing главной но как это реализуетсь на практике? Может в 6-м VB и генерится Closing(тобишь QueryUnload) для всех дочерних но в .NET ...

Ответить

Номер ответа: 7
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #7 Добавлено: 16.07.04 17:00
>Павел: Да, действительно, не посмотрел на раздел... :)

>danser: Попробовал в .NET - все работает. Делал так:
1. Создал MDI форму.
2. Создал шаблон Child формы.
3. В событии MDI формы MDIForm1_Load(...) создал 3 экземпляра дочерних форм:
Form f1 = new Form2();
f1.MdiParent=this;
f1.Text="Form1";
f1.Show();
Form f2 = new Form2();
f2.MdiParent=this;
f2.Text="Form2";
f2.Show();
Form f3 = new Form2();
f3.MdiParent=this;
f3.Text="Form3";
f3.Show();
4. Шаблона Child формы подписал на событие Form2_Closing(...)
5. В результате при попытке закрыть MDI форму этот обработчик вызывается 3 раза для каждой дочерней формы.

Ответить

Номер ответа: 8
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #8 Добавлено: 16.07.04 17:04
Вдогонку. Писал на С#, но думаю для VB.NET логика та же.

А чтобы получить массив дочерних окон используй
MDIForm1.MdiChildren

Ответить

Номер ответа: 9
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #9 Добавлено: 16.07.04 17:53
Почему у меня не получалось...
Просто я сначала вылавливал активную дочерню форму делал её копию(каждый раз как только она становилась активной)переменной которая обевлялась так:
Private WithEvents ActiveForm_ As TestForm
где TestForm тип моей дочерней формы.
Потом вылавливал закритие этой копии посредством Closin(-ed). Копия закривалась генерилось исключение (копии) и всё... :(((
Почему я так делал...
Просто надо было управлять окнами с другого класа...

<А чтобы получить массив дочерних окон используй
<MDIForm1.MdiChildren
Что такое MDIForm1.MdiChildren - если колекция то я что то не нашел свойства Items которое она должна иметь...Если можна чуть больше по этому поводу...


Ответить

Номер ответа: 10
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #10 Добавлено: 18.07.04 18:34
Попробуй при внесении изменений "пометить форму" например изменить её Tag, потом в цикле For Each Child In FrmMama проверять Tag. Не очень красиво, но должно сработать.

Ответить

Номер ответа: 11
Автор ответа:
 Андрей Никитин



ICQ: 325172082 

Вопросов: 3
Ответов: 81
 Профиль | | #11 Добавлено: 19.07.04 10:15
Выдержка из MSDN (правда на основе FW 1.1, поэтому не знаю есть ли это всойство в FW 1.0):

Gets an array of forms that represent the multiple document interface (MDI) child forms that are parented to this form - /Возвращает массив дочерних форм MDI приложения/.

Public ReadOnly Property MdiChildren As Form ()

Пример:
The following example demonstrates how to use the MdiChildren property to iterate through the list of MDI child forms and add a Button control to each - /Пример показывает как использовать свойство MdiChildren для перебора всех дочерних форм и добавления на каждую из них контрола типа "Кнопка"/.

Private Sub AddButtonsToMyChildren()
    ' If there are child forms in the parent form, add Button controls to them.
    ;Dim x As Integer
    For x = 0 To (Me.MdiChildren.Length) - 1
        ' Create a temporary Button control to add to the child form.
        ;Dim tempButton As New Button()
        ' Set the location and text of the Button control.
        tempButton.Location = New Point(10, 10)
        tempButton.Text = "OK"
        ' Create a temporary instance of a child form (Form 2 in this case).
        ;Dim tempChild As Form = CType(Me.MdiChildren(x), Form)
        ' Add the Button control to the control collection of the form.
        tempChild.Controls.Add(tempButton)
    Next x
End Sub 'AddButtonsToMyChildren

Думаю, все достаточно наглядно...

Ответить

Номер ответа: 12
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #12 Добавлено: 19.07.04 22:44
Да может в английском я не силен но код понять могу :)

Ответить

Номер ответа: 13
Автор ответа:
 VladDor



Вопросов: 17
Ответов: 47
 Профиль | | #13 Добавлено: 20.07.04 13:48
  Не знаю, я при вызове метода Сlosing проверял изменился ли текст в элементе RTF т.е делал проверку изменений элемента дла которого MDIChild служит контейнером. Ни одна форма не проскакивала не сохраненнной.

Ответить

Номер ответа: 14
Автор ответа:
 danser



ICQ: 299287824 

Вопросов: 76
Ответов: 209
 Профиль | | #14 Добавлено: 20.07.04 22:10
Я понял просто у меня MDI forms служыт не редактором текста, а немножко другим редактором где меняется не просто одно текстовое поле, а набор разних Control'ов :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам