ИНСТРУКЦИОННАЯ
КАРТА
ТЕМА:
Разработки приложения, использующего процедуры на основе событий
Цель: отработать
умения по созданию формы, код которой будет содержать события в классах.
Знать:
события
в классе с помощью ключевого слова event; события:
Withdrawn и Added; прикрепление обработчика события к определенному событию
(операция +=)
,
для открепления – (операция -=
:
событие +=
метод_обработчика_события)
.
Уметь: создавать форму, код которой содержит
процедуры на основе событий
Оснащение: ПК, мультимедиа, ресурсы
Интернета, ИК.
Литература: https://metanit.com/sharp/
Полное руководство по языку программирования С# и платформе .NET 4.7
!Электронный отчет по работе должен
содержать:
1. Проект,
созданный в Visual Studio.
2. Текстовый
файл, содержащий ответы на вопросы и вывод.
Теоретический материал
Консольное приложение реализует концепцию императивного (процедурного)
программирования, а управление Windows-приложением основано на понятии события (event).
События могут создаваться как пользователем, так и возникать в процессе
выполнения приложения. Начнем с простых вещей.
Создадим оконное приложение и запустим его на выполнение. С пустой
формой мы можем выполнить только несколько стандартных действий: изменить
размер, свернуть, свернуть в окно/развернуть и закрыть приложение.
Для изменения размеров формы подведем указатель мыши (1 событие) к
любой ее границе (указатель изменит свою форму), перетянем ее в нужном
направлении (2 событие) и отпустим кнопку (3 событие). Последние три действия с
формой выполняются после клика мышью (событие 4) на кнопках формы.
Ясно, что такое приложение нам не слишком интересно, тем не менее,
очевидна связь между событиями и действиями.
Перенесем с Панели элементов на форму объект «Кнопка» (по умолчанию
– button1 класса Button). На вкладке «Конструктор»
кнопка видна, на вкладке «Код» о ней нет никакой информации. Однако раскрыв
файл Form1.Designer.cs, мы увидим в описании класса Form1поле:
private
System.Windows.Forms.Button button1;
которое задает этот объект, а в методе private void
InitializeComponent()обнаружим описание его свойств (имя, местоположение,
размер, надпись и т.п.).
Запустим программу снова на выполнение. Нажатие на кнопку (событие)
не влечет за собой никаких действий (кроме того, что между нажатием и
отпусканием кнопки она подсвечивается).
Смотрим книгу «для чайников». В ней написано: чтобы связать это событие
с каким-либо действием необходимо всего лишь выполнить двойной клик на кнопке,
в окне кода появится заготовка для метода – обработчика события Click:
private void
button1_Click(object sender, EventArgs e)
{
…
}
Увеличим ширину кнопки примерно в три раза. Вставим в тело метода между
фигурными скобками оператор:
button1.Text = DateTime.Now.ToString();
Теперь при нажатии кнопки непосредственно на ней мы можем прочитать текущие
дату и время нажатия на кнопку.
«Выдающийся» результат! Есть событие, есть реакция на него (обработка
события).
Заметим, что в панели Свойства для объекта button1 на закладке События
(щелчок на «желтой молнии») напротив события Click появился
метод button1_Click. В окне кода добавили всего один метод с
одним оператором в его теле. Что же еще изменилось? Посмотрим содержимое
файла Form1.Designer.cs. В нем добавилась строка:
this.button1.Click
+= new System.EventHandler(this.button1_Click);
Расшифруем ее. Ключевое слово this – это ссылка на
текущий объект Form1 (забавно, что имя объекта совпадает с
именем класса). Объект button1 размещен на форме Form1.
А Click – очевидно это событие, клик на кнопке. EventHandler – делегат
(delegate), представляет метод, который будет обрабатывать
событие, не имеющее данных (объявлен в библиотеке System). Тип
события обязательно должен совпадать с типом делегата. В скобках указывается
имя этого метода button1_Click. Переведем смысл оператора на
русский язык:
Объект.Событие += new Делегат(Метод_обработки);
Символ + определяет подписку обработчика события.Очевидный вывод:
Подписка на событие с использованием делегата приводит к вызову метода при
возникновении события.
Возможен ли разрыв связи между событием и методом его обработки? И нет
ли у вас ощущения статичности таких связей? Можно ли то же самое достичь
программным путем?
Реализуем второй вариант действий:
1) поместим кнопку button1 на форме Form1;
2) в конструктор формы добавим один оператор, тогда:
public Form1()
{
InitializeComponent();
button1.Click += new System.EventHandler(button1_Click);
}
3) в описание класса добавим метод:
private void button1_Click(object sender, EventArgs e)
{
button1.Text = DateTime.Now.ToString();
}
4) запустим программу на выполнение, сравним результаты;
5) появился ли оператор подключения в файле FormDesigner.cs ?
Заметим, что этот файл Form1.Designer.cs является текстовым описанием
формы и размещенных на ней элементов после запуска программы, что позволяет
отобразить ее в режиме конструктора.
Далее многое можно изменять программным путем.
Итак, событие – это сообщение другим объектам программы, что произошло
какое-то действие. Действие может быть инициировано пользователем (нажатие
клавиши) или же в результате выполнения какого-то фрагмента программы (по
условию).
Объект, который вызывает событие, называется отправителем (sender)
сообщения, а объект, который сообщение получает – получателем. Роль
«почтальона» выполняет делегат. Получатель сообщения имеет метод, который
автоматически выполняется в ответ на исходное событие. В нашем примере
отправителем и получателем сообщения является объект button1 («makes himself»).
Платформа .NET Framework поддерживает простое программирование событий,
из-за чего начинающие программисты часто не вникают в работу событий.
Событием в языке C# называется сущность,
предоставляющая две возможности: сообщать об изменениях, а для его
пользователей — реагировать на них. В объявлениях классов визуальных
компонентов мы найдем большое количество событий, которые могут быть вам
полезны. Подсчитайте, сколько событий связано с формой? У меня получилось – 76.
А для кнопки – 58, не мало? Если же вам необходимо создать собственное событие,
то вы можете его просто объявить:
public event EventHandler myEvent;
Рассмотрим, из чего состоит объявление. Сначала идут модификаторы
события, затем ключевое слово event, после него — тип
события, который обязательно должен быть типом-делегатом, и идентификатор
события, то есть его имя myEvent. Ключевое слово event сообщает
компилятору о том, что это не публичное поле, а специальным образом
раскрывающаяся конструкция, скрывающая от программиста детали реализации
механизма событий (пока это замечание пропустите).
В C# разрешается формировать какие угодно разновидности событий. Но
ради совместимости программных компонентов со средой .NET Framework следует
придерживаться рекомендаций, которые по существу, сводятся к следующему
требованию: у обработчиков событий должны быть два параметра. Первый из них —
ссылка на объект, формирующий событие, второй — параметр типа EventArgs,
содержащий любую дополнительную информацию о событии, которая требуется
обработчику. То есть:
void обработчик(object отправитель, EventArgs е) {//…}
Как правило, отправитель — это параметр, передаваемый вызывающим кодом
с помощью ключевого слова this. Параметр е типа EventArgsсодержит
дополнительную информацию о событии и может быть проигнорирован, если он не
нужен.
Отметим, что и в первом примере с кнопкой автоматически сгенерировался
заголовок метода, обеспечивающего обработку клика мышкой:
private void button1_Click(object sender,
EventArgs e)
Сам класс EventArgs не содержит полей, которые
могут быть использованы для передачи дополнительных данных обработчику, он
служит в качестве базового класса, от которого получается
производный класс, содержащий все необходимые поля. Тем не менее, в классе
EventArgs имеется одно поле Empty типа static,
которое представляет собой объект типа EventArgs без
данных.
В среде .NET Framework предоставляется встроенный обобщенный
делегат под названием EventHandler<TEventArgs>. В
данном случае тип TEventArgs обозначает тип
аргумента, передаваемого параметру EventArgs события.
Для обработки многих событий параметр типа EventArgs оказывается
ненужным. Поэтому с целью упрощения создания кода в подобных ситуациях в среду
.NET Framework и был внедрен необобщенный делегат типа EventHandler,
используемый для объявления обработчиков событий, которым не требуется дополнительная
информация о событиях (см. наш первый пример).
Пример использования обобщенного делегата
EventHandler<TEventArgs>
Обобщенный делегат EventHandler<MyEA> используется для
объявления события Ez:
public
event EventHandler<MyEA> Ez;
Аргументы, передаваемые в метод, задаются в классе MyEA, который
наследуется от класса EventArgs.
Практическая часть
УПРАЖНЕНИЕ
Постановка задачи «Управление размерами и цветом формы»
Набор цветов: Red, Green, Blue, Yellow +
исходный (добавляйте любые!)
Размеры: 500х150, 550×200, 600×250, 650×300
Элементы управления:
Кнопка button1 — Разрешение/Запрет изменение свойств
формы
Кнопка button2 — Перекраска формы в желтый цвет без
ограничений
Элемент comboBox1 — для выбора цвета: Red, Green,
Blue, прежний
Метка label1 — подсказка: «Выберите цвет закраски
формы» к comboBox1.
Начальная форма может выглядеть так:
Самостоятельная работа
Задания (по вариантам):
1.
Создать абстрактный класс Figure с методами вычисления
площади и периметра, а также методом, выводящим информацию о фигуре на экран.
Создать производные классы: Rectangle (прямоугольник), Circle (круг),
Triangle (треугольник) со своими методами вычисления площади и
периметра.Создать массив n фигур и вывести полную информацию о
фигурах на экран.
2.
Класс Покупатель: Фамилия, Имя, Отчество, Адрес, Номер
кредитной карточки, Номер банковского счета; Конструктор; Методы: установка значений
атрибутов, получение значений атрибутов, вывод информации. Создать массив
объектов данного класса. Вывести список покупателей в алфавитном порядке
и список покупателей, у
которых номер кредитной карточки находится в заданном диапазоне.
3.
Класс Абонент: Идентификационный номер, Фамилия, Имя,
Отчество, Адрес, Номер кредитной карточки, Дебет, Кредит, Время междугородных и
городских переговоров; Конструктор; Методы: установка значений атрибутов, получение значений
атрибутов, вывод информации. Создать массив объектов данного класса.
Вывести сведения относительно абонентов, у которых время городских переговоров
превышает заданное. Сведения относительно абонентов, которые
пользовались междугородной связью. Список абонентов в алфавитном порядке.
Вопросы
для контроля знаний
1. В чем отличие C# от других языков программирования?
2. Какую парадигму программирования поддерживает С#?
3.
Что такое Microsoft .NET Framework?
4. Какие бывают формы?
5.
Основные свойства формы?
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.