Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Дочерние формы в MDI-приложении


Автор: VladCSharp 27.10.2005, 07:25
как проконтролировать и недопустить повторного запуска такого же окна, а еще лучше активизировать его?

Автор: mr.DUDA 27.10.2005, 09:06
Завести в родительской форме переменную с типом ChildForm. При добавлении дочерней MDI-формы, проверять переменную, и если не null - то не создавать новую форму, а активировать существующую. При закрытии дочерней MDI-формы сбрасывать переменную в null.

Автор: nikf 27.10.2005, 09:44
Непонятно тогда зачем создавать MDI проект если там будет всего одна форма - есть проект SDI
Цитата(mr @ 27.10.2005, 09:06)
Завести в родительской форме переменную с типом ChildForm.
- всегда была и не одна, и наз-ся : MdiChildren[int]. Нужно тока привести ее кнужному типу

Автор: arilou 27.10.2005, 15:18
VladCSharp

Если ты имел ввиду "как проконтролировать и недопустить повторного запуска child-формы, если одна такая форма уже открыта", то:

Добавь такой метод в класс MDI формы.

Код

bool childFormPresent(Type childFormType)
{
   foreach(Form frm in this.MdiChildren)
     if(childFormType == frm.GetType())
        return true;

  return false;
}


юзаешь так

Код

if(!childFormPresent(typeof(MyChildFormClass))
  // вставляешь новое окно типа MyChildFormClass в parent форму



Автор: VladCSharp 28.10.2005, 04:36
всем большое спасибо, все получилось, все работает

Автор: mal 30.5.2007, 08:15
Можно по подробней как можно проконтролировать и не допустить повторного запуска child-формы smile 

Автор: arilou 30.5.2007, 17:09
Цитата(mal @  30.5.2007,  08:15 Найти цитируемый пост)
Можно по подробней как можно проконтролировать и не допустить повторного запуска child-формы

Пример парой постов выше.

Автор: mal 31.5.2007, 09:34
Приведенный код только проверяет открыта ли child-форма. Я бы хотел создать процедуру, в которую передаем тип формы, а она уже либо открывает новую, либо активирует открытую. smile 

Автор: SpaceSpace 31.5.2007, 10:44
Код

// это твоя будущая child форма
 Form2 frm2 = new Form2();

        public Form1()
        {
           
            InitializeComponent();
            // это ты говоришь кто её парэнт
            frm2.MdiParent = this;
            frm2.Show();
            
        }
       // малость измененная функция, показанная выше
       void childFormPresent(Type childFormType)
        {
            // инициализирована ли форма?
            bool flag = false;
            foreach (Form frm in this.MdiChildren)
                if (childFormType == frm.GetType())
                { 
                    // на всякий случай указываем родителя
                    frm2.MdiParent = this;
                    // открываем
                    frm.Show();
                    flag = true;
                }
            // если форма не инициализирована
            if (!flag)
            {
                // создаем заново форму
                frm2 = new Form2();
                // прописываем родителя
                frm2.MdiParent = this;
                // отображаем
                frm2.Show();
            }

        }

        // у тебя кнопочка должна быть, соотыетственно
        private void button1_Click(object sender, EventArgs e)
        {
            // при щелчке по кнопке, вызываем волшебную функцию
            childFormPresent(typeof(Form2));
        }

Автор: mal 31.5.2007, 12:36
Спасибо за помощь. 
На сколько я понял из кода, не получилось создать универсальную процедуру для вызова новой child-формы или активации открытой. В моём проекте предполагается у основной формы порядка 20 дочерних. smile 

Автор: arilou 31.5.2007, 12:55
mal, помоему решение как раз универсальное.

Автор: mal 31.5.2007, 14:30
arilou, Ваше решение - универсальное, но оно может только определить открыта ли child-форма. А я бы хотел открыть или активировать child-форму.

Не универсальное - это я на счет решения SpaceSpace

Или я чего-то не до понимаю? smile 

Автор: stab 31.5.2007, 14:42
Цитата(mal @  31.5.2007,  18:30 Найти цитируемый пост)
Не универсальное - это я на счет решения SpaceSpace


в чём же проявляется его не универсальность? как по мне, так там единственное чего не хватает так это вызова Form.Activate, в случае того, если форма уже существует, и то, может быть, вполне и без него можно обойтись.

Автор: mal 31.5.2007, 15:07
Цитата

Код

 Form2 frm2 = new Form2();


Что за Form2? Как быть если у меня 20 child-форм?

Автор: Exception 31.5.2007, 17:39
http://forum.vingrad.ru/sources/act-ST/f-201/t-154181/unread-1.html (только что написал).

Автор: stab 31.5.2007, 23:26
Цитата(mal @  31.5.2007,  19:07 Найти цитируемый пост)
Что за Form2? Как быть если у меня 20 child-форм?


не думал, что тебя это напугает. можно сделать так:

Код
Form form = (Form) Activator.CreateInstance(childFormType);

Автор: Exception 2.6.2007, 19:41
ИМХО, мой способ лучше, т.к. он типизированный и поддерживает создание формы по требованию и последующее хранение в кэше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)