Добрый день ув. форумцы!
Вопрос касается собственно WinForms и меню.
Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm();
Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???
12.02.08 18:45: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, 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;
}
}
Здравствуйте, AlSer, Вы писали:
AS>Здравствуйте, Allaire, Вы писали:
A>>Добрый день ув. форумцы! A>>Вопрос касается собственно WinForms и меню. A>>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm(); A>>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???
AS>самый простой вариант использовать property:
AS>
Здравствуйте, Allaire, Вы писали:
A>Добрый день ув. форумцы! A>Вопрос касается собственно WinForms и меню. A>Т.е. есть менюшка при клике на кот. создается форма — frmForm myForm = new frmForm(); A>Но! при таком подходе сколько раз я кликну на меню — столько создасться форм, что не есть хорошо, ведь нужно только одна. Поэтому вопрос в сабже — как проконтроллировать, чтобы создался именно один экземпляр формы или как проверить, что если форма уже открыта/используется, то не создавать новую???
Дизабли пункт меню, на который нажал. Форму подпиши на события Load\FormClosed и обрабатывай там доступность пункта меню.
Всё заканчивается плохо. Если что-то закончилось хорошо — значит оно еще не закончилось.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Codechanger, Вы писали:
C>>Вообще, обычно юзаются мьютексы для подобного рода проверок. Но это так, к слову....
L>мьютексы? ничего не напутал?
При запуске(скажем, в конструкторе формы) создаеться мьютекс(именованный).При каждом запуске форма должна проверять, а есть ли мьютекс в памяти. Если есть, то экземпляр формы точно в памяти есть(запущенный). про мьютексы можно почитать здесь: здесь. Я подобную технику применял для предотвращения запуска больше одного экземпляра предложения. В общем, мьютекс — не только объект синхронизации.
Здравствуйте, 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();
}
}