|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Опубликован: 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
