Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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