Пользовательский интерфейс Windows Forms для C#
Применение коллекций для предотвращения повторных запусков формы
В C# под коллекцией понимается группа объектов, возможно, не одинаковых типов. Самым простым примером коллекции является обычный массив. Но в отличие от массива коллекции способны хранить объекты разных типов. Коллекции реализованы в виде классов, сгруппированных в пространстве имен System.Collections библиотеки mscorlib.dll
C# - классы коллекций по сути аналогичны классам стандартной библиотеки шаблонов ( STL - Standard Template Library), определенной в C++. То, что в C++ называется контейнером, в C# именуется коллекцией. Коллекции упрощают программирование, предлагая уже готовые решения для построения структур данных, разработка которых "с нуля" потребовала бы больших затрат.
Основное достоинство коллекций состоит в том, что они упрощают работу с группами объектов в прикладных программах. Все коллекции разработаны на основе набора четко определенных интерфейсов ( ICollection, IComparer, IDictionary и т.д.).
Для контроля за запуском форм упражнений и предотвращения их повторного запуска можно использовать обычный массив, куда при каждом запуске очередной формы сохранять метку на форму и при повторной попытке проверять существование этой метки. Но недостатком использования массива является его фиксированный размер, определяемый однажды при создании массива. Коллекцию использовать удобнее, поскольку механизм автоматического изменения размера в нее уже встроен, и предусмотрен ряд полезных методов для управления коллекцией. Все коллекции предполагают использование цикла foreach (в каждом) для последовательного перебора всех элементов, входящих в коллекцию.
Мы будем использовать класс ArrayList, представляющий собой массив переменной длины ( динамический массив ), элементами которого являются объектные ссылки. Только, для удобства и тренировки мы упакуем этот класс в свой класс, в котором предусмотрим необходимые нам методы и свойства. При этом мы не будем создавать для нового класса отдельный файл, а добавим его в файл Start.cs. Все методы класса и ссылку на коллекцию сделаем статическими, чтобы не создавать экземпляр класса в основном коде программы.
// Класс для предотвращения повторных запусков форм
public class Restart
{
// Создали коллекцию
private static System.Collections.ArrayList frmList =
new System.Collections.ArrayList();
// Метод для добавления метки в коллекцию
public static void Add(Object frm)
{
frmList.Add(frm);
}
// Метод для удаления метки из коллекции
public static void Remove(String str)
{
frmList.Remove(str);
}
// Метод, который отвечает на вопрос - запущена ли форма
public static bool IsPresent(Object frm)
{
bool flag = false;
foreach(Object x in frmList)
{
if(Object.Equals(x.ToString(), frm.ToString()))
flag = true;
}
return flag;
}
}
Листинг
25.18.
Добавление класса для поддержки коллекции в файле Start.cs
-
Найдите
в файле Start.cs обработчик generalList_SelectedIndexChanged() и
замените его тело на следующий код
private void generalList_SelectedIndexChanged(object sender, System.EventArgs e)
{
switch(generalList.SelectedIndex + 1)
{
case 1:
Smiles frm1 = new Smiles();
if(!Restart.IsPresent(frm1))
{
Restart.Add(frm1);
frm1.Show();
}
break;
case 2:
Calculate frm2 = new Calculate();
if(!Restart.IsPresent(frm2))
{
Restart.Add(frm2);
frm2.Show();
}
break;
}
}
Листинг
25.19.
Измененное тело обработчика generalList_SelectedIndexChanged()
-
В
режиме дизайна форм Smiles и Calculate создайте
обработчики для события FormClosed, которые
заполните кодом удаления метки из коллекции при закрытии
формы
private void Smiles_FormClosed(object sender, FormClosedEventArgs e)
{
Restart.Remove(this.ToString());
}
Листинг
25.20.
Обработчик события FormClosed формы в файле Smiles.cs
private void Calculate_FormClosed(object sender, FormClosedEventArgs e)
{
Restart.Remove(this.ToString());
}
Листинг
25.21.
Обработчик события FormClosed формы в файле Calculate.cs
-
Запустите
приложение и проверьте, что повторный запуск уже запущенной
дочерней формы блокируется
В реализациях следующих упражнений этой лабораторной работы нам необходимо соблюдать введенную нами технологию предотвращения повторных запусков дочерних форм. Для этого в переключателе switch обработчика generalList_SelectedIndexChanged() нужно добавлять метку запущенной формы в коллекцию нашего класса Restart, а при закрытии дочерней формы необходимо удалять эту метку из коллекции в обработчике события FormClosed.
Упражнение 3. Встраивание COM-объекта "Windows Media Player" в свое приложение
В этом упражнении мы встроим мультимедиа - проигрыватель в наше приложение и создадим пользовательские элементы для управления им. Прежде всего нужно добавить этот COM -объект ( COM - Component Object Model - объектная модель компонентов) к панели инструментов Toolbox оболочки.
Добавление своей вкладки в панель Toolbox оболочки
Чтобы не смешивать набор элементов стандартных вкладок панели Toolbox, поместим этот элемент в отдельную вкладку.
-
Через
панель Solution Explorer откройте любой
файл проекта в режиме дизайна, чтобы стала доступна панель
инструментов Toolbox. Щелкните правой
кнопкой мыши на любом месте панели Toolbox и
через контекстное меню выполните команду Add
Tab
-
Присвойте
добавленной вкладке имя " Моя
вкладка " и раскройте ее
Присоединение COM-объекта к проекту
-
Щелкните
на новой вкладке правой кнопкой мыши и выполните команду
контекстного меню Choose Items
-
В
появившемся окне выберите вкладку COM Components,
найдите в списке Windows
Media Player, отметьте его и щелкните на
кнопке OK
После этого в новой вкладке панели Toolbox появится пиктограмма выбранного компонента
и его можно размещать на форме обычным образом.
Замечание. Возможно, что оболочка на Вашем компьютере по умолчанию настроена на другой тип COM -компонента, который будет иметь другие свойства и события, чем используемый в этой работе. В этом случае щелкните на кнопке Browse вкладки COM Components окна выбора элементов Choose Toolboxs Items и в системном каталоге Windows/System32 выберите компонент msdxm.ocx. Это и будет интересующий нас компонент мультимедиа - проигрывателя.
Добавление к приложению новой формы и ее разработка
-
Через
меню оболочки выполните команду Project/Add Windows
Form ,
чтобы добавить к проекту новую форму, и в появившемся диалоговом
окне задайте имя файла формы MediaPlayer.cs


