Пользовательский интерфейс 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