Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_programmirovaniyu_voprosy_21-40.docx
Скачиваний:
5
Добавлен:
25.09.2019
Размер:
90.14 Кб
Скачать

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();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]