- •21. Графы, основные понятия теории графов, представление графов.
- •22. Алгоритмы обхода графа: обход в глубину.
- •23. Алгоритмы обхода графа: обход в ширину.
- •24. Деревья, бинарные деревья, дерево двоичного поиска.
- •25. Алгоритмы обхода дерева.
- •26. Обработка исключений, оператор try.
- •27. Обработка исключений, операторы checked, unchecked.
- •28. Генерация собственных исключений
- •29. Работа с файловой системой: классы File и FileInfo.
- •30. Работа с файловой системой: классы Directory и DirectoryInfo.
- •31. Механизм сборки мусора, жизненный цикл объекта, поколения объектов.
- •32. Программирование под Windows, событийно-управляемая модель.
- •33. Архитектура приложений Windows Forms
- •34. Стандартные элементы управления: текстовые поля, кнопки, переключатели.
- •35. Стандартные элементы управления: списки, окна диалога.
- •36. Динамическое создание и удаление элементов управления.
- •37. Обработка событий мыши.
- •39. Делегаты. Определение и использование делегатов.
- •40. События. Событийная модель “publisher/subscribers”
- •38. Обработка событий клавиатуры.
40. События. Событийная модель “publisher/subscribers”
Events = Специальное поле класса (типа делегата).
Событие в .Net - это возможность класса уведомить клиента класса о том, что что-то произошло с объектом.
Publisher – класс, предоставляющий события другим классам и способный уведомить их о наступлении события.
Subscriber – класс, желающий получать уведомление о событии, зарегистрированный на это событие и передающий издателю делегата (обработчик события).
События основаны на делегатах.
Любой объект, имеющий доступ к делегату, может ссылаться на такой делегат, однако только тип, определяющий событие, может вызвать это событие.
Когда тип определяет событие, другие типы могут определить метод, соответствующий сигнатуре делегата, связанного с событием, и подписаться на событие, указав, что их метод должен быть запущен при возникновении события.
Publisher:
using System;
// Введем собственный делегат
delegate void MyDelegate();
// Тестовый класс (гипотетическая кнопка)
class Button
{
// Введем общедоступное событие
public event MyDelegate Click;
// Функция, которая симулирует нажатие кнопки
public void SimulateClick()
{
if (Click != null) Click();
}
}
Subscribers:
class App
{
static void Main()
{
// Создаем экземпляр конпки
Button sc = new Button();
// Добавляем обработчик к ее событию
sc.Click += new MyDelegate(Handler);
// Вызовем функцию, которая инициирует возникновение события
sc.SimulateClick();
}
// А это функция-обработчик события нажатия на кнопку.
static void Handler()
{
Console.WriteLine("Hello, World!");
}
}
После того как событие определено, его можно использовать в приложении, для этого на событие нужно подписаться в использующих типах и приложениях и генерировать событие в типе.
Для подписки на событие используется составная операция присваивания «+=».
Отказаться от подписки на событие можно с помощью составной операции присваивания «-=».
При вызове события необходимо сначала проверить, что оно не является нулевым.
38. Обработка событий клавиатуры.
Для обработки сообщений с клавиатуры в Windows Forms приложениях предусмотрены три события: KeyUp, Keypress, KeyDown.
Событие KeyUp посылается при отпускании кнопки на клавиатуре.
Событие KeyPress посылается первый раз при нажатии кнопки на клавиатуре вместе с событием KeyDown и затем может посылаться неограниченное число раз, если пользователь удерживает клавишу в нажатом состоянии. Частота посылки события KeyPress зависит от настроек операционной системы. Событие KeyDown посылается при нажатии кнопки на клавиатуре.
Для примера создадим приложение, которое будет обрабатывать нажатие клавиш и выводить на экран информацию о том, какая клавиша была нажата (установите свойство формы KeyPreview — True). Свойство KeyPreview определяет свойство, позволяющее форме улавливать сообщения клавиатуры от дочерних элементов управления формы. Если свойство KeyPreview формы устанавлено в False, то форма не будет получать сообщения от клавиатуры, если активизирован один из элементов формы. Другими словами, если на форме присутствует компонент TextBox и курсор мыши находится в его поле, то при нажатии клавиши на клавиатуре форма об этом узнать не сможет. Поэтому, если вы собираетесь обрабатыватьклавиатуру в классе формы, вам необходимо выставлять свойство KeyPreview в true.
Класс KeyEventArgs содержит всю информацию о нажатой клавише. Вот свойства, которые обычно используются при обработке нажатия кнопки:
Alt — True, если нажата клавиша Alt;
Control — True, если нажата клавиша Ctrl;
Shift —True, если нажата клавиша Shift;
KeyCode — код нажатой клавиши;
KeyData — совокупность кодов нажатых клавиш;
KeyValue — десятичное значение свойства KeyData;
Handled — флаг, указывающий, было ли сообщение обработано. По умолчанию, значение Handled равно false. Если вы не хотите дальнейшей обработки нажатия кнопки, выставьте флаг Handled в true.
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.Control) this.textBox1.Text+="CTRL+";
else
if (e.Shift) this.textBox1.Text+="SHIFT+";
else this.textBox1.Text+=e.KeyValue.ToString();
else this.textBox1.Text+=e.KeyData.ToString();
}