Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 18:

Пользовательские компоненты

Добавление в компонент пользовательского события стандартным способом

В этом разделе мы добавим к классу пользовательское событие типовым способом, как это принято в большинстве приложений. Альтернативный способ, позволяющий контролировать добавление и удаление обработчиков из списка объекта-делегата, мы рассмотрим позднее.

  • Добавьте в файл AlarmClock.cs часть класса, содержащую определение собственного события стандартным способом без использования базового поля
// Часть 3
namespace MyCompany.MyComponents
{
    // Часть класса с определением собственного события
    // стандартным способом без использования базового поля
    partial class AlarmClock
    {
        // Объявляем делегат для события. В аргументах делегата
        // нужно указать полное имя вложенного класса
        public delegate void AlarmHandler(object sender, 
		AlarmClock.AlarmEventArgs e);
    
        // Объявляем событие с доступностью не ниже делегата
        public event AlarmHandler Alarm;
    
        // Метод диспетчеризации события. Виртуальный и защищенный
        // для возможности переопределения в будущих потомках
        protected virtual void OnAlarm(AlarmEventArgs args)
        {
            // Проверяем наличие зарегистрированных 
            // обработчиков и генерируем событие
            if (Alarm != null)
                Alarm(this, args);
        }
    }
}
Листинг 18.13 . Определение события стандартным способом в файле AlarmClock.cs
  • Модифицируйте часть класса с обработчиком события Tick системного таймера, который мы создали ранее и который вызовет наше событие при наступлении времени alarmTime срабатывания будильника
// Часть 4
namespace MyCompany.MyComponents
{
    // Часть класса с определением обработчика события Tick 
    // системного таймера System.Windows.Forms.Timer timer1
    partial class AlarmClock
    {
    // Обработчик события срабатывания системного таймера, созданного,
    // настроенного и зарегистрированного через визуальный конструктор.
    // Обработчик выполняется каждую секунду и проверяет, пришла ли пора
    // генерировать наше событие, на которое подпишется клиент компонента
    private void TimerHandler(object sender, EventArgs e)
    {
    DateTime now; // Текущее системное время
    AlarmEventArgs args;
    
    // В режиме разработки не выполнять
    if (!this.DesignMode)
      {
      now = DateTime.Now;
      // Если будильник не запущен и пришла пора запускать
      if (!alarmFired && now >= alarmTime)
        {
        // Создаем объект для передачи аргументов в событии
        args = new AlarmEventArgs();
        // Заполняем объект текущим временем
        args.Time = now;
        // Вызываем метод диспетчеризации события Alarm
        this.OnAlarm(args);
        // Поднимаем флаг "Будильник запущен"
        alarmFired = true;
        }
      }
    }
    }
}
Листинг 18.14 . Обработчик события Tick системного таймера timer1 в файле AlarmClock.cs
  • Откомпилируйте библиотеку наших компонентов, выполнив команду Build/Build MyComponents
  • Перейдите в режим редактирования Form1.cs [Design] и убедитесь, что в панели Toolbox после компиляции появился новый компонент AlarmClock
Тестирование компонента AlarmClock
  • Поместите новый компонент AlarmClock из панели Toolbox на форму Form1 приложения ComponentTest, выделите его экземпляр alarmClock1 и через панель Properties в режиме Events создайте обработчик для события Alarm
  • Обработчик, добавленный в класс Form1 приложения ComponentTest, заполните следующим кодом
private void alarmClock1_Alarm(object sender, 
	AlarmClock.AlarmEventArgs e)
   {
   // Если оператор выключения будильника поставить после
   // вызова модального диалогового окна, то генерация
   // событий прекратиться только после закрытия
   // очередного модального окна, поскольку только тогда
   // управление дойдет до этого оператора
   alarmClock1.Enabled = false;// Останавливаем системный таймер
    
   int hour = alarmClock1.CurrentTime.Hour;
   int minute = alarmClock1.CurrentTime.Minute;
   int second = alarmClock1.CurrentTime.Second;
   MessageBox.Show(String.Format("Сработал будильник!!!\n"
     + "Текущее время: {0} ч. {1} м. {2} с.", 
	hour, minute, second),
   "Доцент Снетков В.М.");
}
Листинг 18.15 . Обработчик события Alarm в тестирующем классе Form1
  • Добавьте в конец конструктора формы Form1 код установки времени срабатывания будильника и запуска системного таймера
// Конструктор формы
   public Form1()
   {
   InitializeComponent();
    
   // Заполнение списка планетами
   for (int i = 0; i <= planets1.MaxIndex; i++)
   {
   listPlanets.Items.Add(String.Format(
     "{0}) {1}", i, planets1[i]));
   }
    
   listPlanets.SelectedIndex = 0;
    
   // Устанавливаем время срабатывания будильника 
   // через 5 сек. после запуска системного таймера
   alarmClock1.AlarmTime = DateTime.Now.AddSeconds(5d);
   alarmClock1.Enabled = true;// Запускаем системный таймер
   }
Листинг 18.16 . Конструктор формы Form1 файла Form1.cs приложения ComponentTest
  • Запустите приложение и убедитесь, что обработчик нашего события Alarm срабатывает через 5 секунд после запуска системного таймера, генерируя окно с примерно следующим сообщением

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974