Открытие одного экземпляра формы...
От: Allaire Украина  
Дата: 12.02.08 14:35
Оценка:
Добрый день ув. форумцы!
Вопрос касается собственно WinForms и меню.
Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???

12.02.08 18:45: Перенесено модератором из '.NET' — AndrewVK
Re: Открытие одного экземпляра формы...
От: AlSer Беларусь  
Дата: 12.02.08 14:51
Оценка:
Здравствуйте, Allaire, Вы писали:

A>Добрый день ув. форумцы!

A>Вопрос касается собственно WinForms и меню.
A>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
A>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???

самый простой вариант использовать property:

private FormXXX m_frmXXX;

private FormXXX FrmXXX
{
    get
  {
        if (m_frmXXX == null)
        {
            m_frmXXX = new FormXXX();
        }
        return m_frmXXX;
    }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Открытие одного экземпляра формы...
От: Codechanger Россия  
Дата: 12.02.08 14:56
Оценка: -2
Здравствуйте, AlSer, Вы писали:

AS>Здравствуйте, Allaire, Вы писали:


A>>Добрый день ув. форумцы!

A>>Вопрос касается собственно WinForms и меню.
A>>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
A>>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???

AS>самый простой вариант использовать property:


AS>
AS>private FormXXX m_frmXXX;

AS>private FormXXX FrmXXX
AS>{
AS>    get
AS>  {
AS>        if (m_frmXXX == null)
AS>        {
AS>            m_frmXXX = new FormXXX();
AS>        }
AS>        return m_frmXXX;
AS>    }
AS>}
AS>


Вообще, обычно юзаются мьютексы для подобного рода проверок. Но это так, к слову....
Re: Открытие одного экземпляра формы...
От: Unforgiver Россия  
Дата: 12.02.08 15:02
Оценка:
Здравствуйте, Allaire, Вы писали:

A>Добрый день ув. форумцы!

A>Вопрос касается собственно WinForms и меню.
A>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
A>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???

Дизабли пункт меню, на который нажал. Форму подпиши на события Load\FormClosed и обрабатывай там доступность пункта меню.
Всё заканчивается плохо. Если что-то закончилось хорошо — значит оно еще не закончилось.
Re[3]: Открытие одного экземпляра формы...
От: Lloyd Россия  
Дата: 12.02.08 15:35
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Вообще, обычно юзаются мьютексы для подобного рода проверок. Но это так, к слову....


мьютексы? ничего не напутал?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[3]: Открытие одного экземпляра формы...
От: meerius Канада  
Дата: 12.02.08 18:47
Оценка:
C>Вообще, обычно юзаются мьютексы для подобного рода проверок. Но это так, к слову....

Из пушки по воробъям. На уровне процессов, соглашусь, но в данном случае — черезчур.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re[4]: Открытие одного экземпляра формы...
От: Codechanger Россия  
Дата: 12.02.08 18:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Codechanger, Вы писали:


C>>Вообще, обычно юзаются мьютексы для подобного рода проверок. Но это так, к слову....


L>мьютексы? ничего не напутал?


При запуске(скажем, в конструкторе формы) создаеться мьютекс(именованный).При каждом запуске форма должна проверять, а есть ли мьютекс в памяти. Если есть, то экземпляр формы точно в памяти есть(запущенный). про мьютексы можно почитать здесь: здесь. Я подобную технику применял для предотвращения запуска больше одного экземпляра предложения. В общем, мьютекс — не только объект синхронизации.
Re[5]: Открытие одного экземпляра формы...
От: Spiceman  
Дата: 13.02.08 08:03
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>При запуске(скажем, в конструкторе формы) создаеться мьютекс(именованный).... Я подобную технику применял для предотвращения запуска больше одного экземпляра предложения.


Вот для одного экземпляра приложения мьютексы это нормально. Но для одного экземпляра формы и правда перебор.

Может лучше форму сделать синглтоном? Если же форму править нельзя, то я за вариант, который дал AlSer.
Re: Открытие одного экземпляра формы...
От: Аноним  
Дата: 13.02.08 08:20
Оценка:
Здравствуйте, Allaire, Вы писали:

A>Добрый день ув. форумцы!

A>Вопрос касается собственно WinForms и меню.
A>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
A>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???

Самое простое — использовать что-то вроде синглтона с проверкой на Disposed (если форма разрушается по завершении работы) или на Visible (если форма просто прячется).


    partial class SomeForm : Form
    {
        // собственно, реализация синглтона
        private static SomeForm _instance = new SomeForm();

        public static SomeForm Instance
        {
            get
            {
                // Разрушен ли объект
                if (_instance.IsDisposed)
                {
                    _instance = new SomeForm();
                }

                // Видна ли форма
                if (!_instance.Visible)
                {
                    _instance.Show();
                }

                return _instance;
            }
        }

        private SomeForm()
        {
            InitializeComponent();
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.