Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 25:

Пользовательский интерфейс Windows Forms для C#

Применение коллекций для предотвращения повторных запусков формы

В C# под коллекцией понимается группа объектов, возможно, не одинаковых типов. Самым простым примером коллекции является обычный массив. Но в отличие от массива коллекции способны хранить объекты разных типов. Коллекции реализованы в виде классов, сгруппированных в пространстве имен System.Collections библиотеки mscorlib.dll

C# - классы коллекций по сути аналогичны классам стандартной библиотеки шаблонов ( STL - Standard Template Library), определенной в C++. То, что в C++ называется контейнером, в C# именуется коллекцией. Коллекции упрощают программирование, предлагая уже готовые решения для построения структур данных, разработка которых "с нуля" потребовала бы больших затрат.

Основное достоинство коллекций состоит в том, что они упрощают работу с группами объектов в прикладных программах. Все коллекции разработаны на основе набора четко определенных интерфейсов ( ICollection, IComparer, IDictionary и т.д.).

Для контроля за запуском форм упражнений и предотвращения их повторного запуска можно использовать обычный массив, куда при каждом запуске очередной формы сохранять метку на форму и при повторной попытке проверять существование этой метки. Но недостатком использования массива является его фиксированный размер, определяемый однажды при создании массива. Коллекцию использовать удобнее, поскольку механизм автоматического изменения размера в нее уже встроен, и предусмотрен ряд полезных методов для управления коллекцией. Все коллекции предполагают использование цикла foreach (в каждом) для последовательного перебора всех элементов, входящих в коллекцию.

Мы будем использовать класс ArrayList, представляющий собой массив переменной длины ( динамический массив ), элементами которого являются объектные ссылки. Только, для удобства и тренировки мы упакуем этот класс в свой класс, в котором предусмотрим необходимые нам методы и свойства. При этом мы не будем создавать для нового класса отдельный файл, а добавим его в файл Start.cs. Все методы класса и ссылку на коллекцию сделаем статическими, чтобы не создавать экземпляр класса в основном коде программы.

  • Добавьте в конец файла Start.cs после класса Start следующий код
// Класс для предотвращения повторных запусков форм
  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, поместим этот элемент в отдельную вкладку.

В панели Toolbox имеется возможность добавлять свои вкладки и копировать в них нужный набор инструментов из других вкладок. Добавить вкладку можно, щелкнув правой кнопкой мыши в любом месте панели Toolbox и выполнив команду контекстного меню Add Tab. Удалить вкладку можно, щелкнув правой кнопкой мыши на заголовке соответствующей вкладки и выполнив команду Delete Tab. Копировать нужные компоненты из одной вкладки в другую можно выполнением команд контекстного меню Copy и Paste.
  • Через панель Solution Explorer откройте любой файл проекта в режиме дизайна, чтобы стала доступна панель инструментов Toolbox. Щелкните правой кнопкой мыши на любом месте панели Toolbox и через контекстное меню выполните команду Add Tab
  • Присвойте добавленной вкладке имя " Моя вкладка " и раскройте ее

Присоединение COM-объекта к проекту

Прежде всего нужно проследить за тем, чтобы перед функцией Main() в файле Start.cs стоял атрибут [STAThread], который сообщает среде исполнения, что основной программный поток приложения должен использовать однопоточную модель. Это необходимо для правильного взаимодействия с подсистемой 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