Лабораторная работа №4.
Создание и обработка событий. Создание форм.
Создание событий и их обработка.
Объекты могут создавать и получать события в процессе своей работы. Используя события можно создавать управляемые приложения. В качестве примера можно упомянуть, что большинство приложений Windows целиком построено на событиях. Также, примером события может служить зажим некоторого файла на рабочем столе и последующим перетаскиванием его в другую область. Здесь вообще налицо целый набор событий. Одним словом, событие – все что угодно, что может произойти с чем-либо.
Рассмотрим принцип создания события в C#. Для начала создайте консольное приложение. Далее в нем опишем некоторый пользовательский класс (например MyClass) и в нём единственное поле (например name). Функция нашего события будет заключаться в том, чтобы уведомлять пользователя об изменении значения в поле name путём вывода сообщения на экран (к примеру такого: «Значение поля name было изменено.»), а само событие будет генерироваться в момент изменения этого поля.
Первое с чего мы начнём – описания обработчика для события MyEvent:
static void Handler()
{
Console.WriteLine("Значение поля name было изменено.");
}
Следующим шагом мы анализируем сигнатуру (передаваемые и возвращаемые параметры) данного обработчика, – видим, что он без возвращаемых и без принимаемых параметров. Забегая наперёд скажу, что вызовом данного обработчика будет заниматься делегат. Почему делегат, а не прямой вызов данной функции (обработчика)? Дело в том, что вся соль событий заключается в том, что само событие не знает ничего об обработчиках, которые будут обрабатывать событие. Поэтому и используется делегат. Мы подошли к созданию делегата. Сигнатура делегата уже известна, она всегда одинакова с обработчиком (взгляните на сигнатуру обработчика):
|
delegate void MyDel(); //описание делегата
Делегат описывается с помощью ключевого слова delegate, далее идёт тип возвращаемого параметра и имя делегата.
Теперь опишем пользовательский класс:
class MyClass
{
string name; //поле класса, которое будем изменять
public event MyDel MyEvent; //событие, которое объявляется с помощью ключевого слова event и указанием типа делегата
public MyClass(string name) //конструктор класса, в который передаётся один параметр
{
this.name = name;
}
}
Обратите внимание, класс имеет поле (переменную) name, изменение значения которого мы будем отслеживать с помощью события и само событие MyEvent. Событие объявляется с помощью ключевого слова event и указанием типа делегата. Далее в класс добавим некоторый метод, с помощью которого будут вноситься изменения в поле name:
public void ChangeName(string name) //метод для редактирования поля name
{
this.name = name;
if (MyEvent!= null) //генерирование события
MyEvent();
}
Здесь следует обратить внимание на вызов события. В условии проверяется факт подписавшихся обработчиков на данное событие. Если ни один метод не подписан в качестве обработчика на данное событие, то мы получим исключение при попытке вызова события. Поэтому, вызывая пользовательские события всегда следует выполнять проверку на null. Для подписки на событие используется оператор "+=", а снятие метода с регистрации – "-=".
Следующим шагом является создание объекта класса (т.е. экземпляра класса) MyClass, далее подпись на его событие и вызов его метода, после чего наступит событие, которое мы обработаем в методе Handler().
|
Задание:
1.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab4
{
delegate void MyDel();//пользовательский делегат
class MyClass
{
string name; //поле
public event MyDel MyEvent; //событие
public MyClass(string name) //конструктор
{
this.name = name;
}
public void ChangeName(string name) //метод для редактирования поля name
{
this.name = name;
if (MyEvent!= null) //(проверка, есть ли подписчики на это событие)
MyEvent(); //генерирование (вызов) события
}
}
class Program
{
.........
}
}
Создайте полное рабочее приложение для данной лабораторной работы, используя код выше (в классе Program опишите обработчик для события MyEvent, в функции Main создайте экземпляр класса MyClass, подпишитесь на событие MyEvent, далее вызовите метод ChangeName). Недостающий код должен находиться в классе Program.
2. Создайте ещё один обработчик для события MyEvent, который будет подсчитывать квадрат числа 9 и выводить его на экран.
Создание форм.
Для разработки полноценного Windows-приложения понадобится то, что в программировании для Windows называется окном, а в.NET – формой. Форма, используемая в качестве главного окна, обычно состоит из заголовка (caption bar, title bar) с именем приложения, меню (menu bar), расположенного под заголовком, и внутренней области – клиентской области (client area). Форма обычно окружается рамкой, позволяющей изменять её размеры.
Рассмотрим один из вариантов создания формы. Создайте консольное приложение. В обозревателе решений, который находится справой стороны, найдите пункт «Ссылки», выделите его. Вызвав меню правой клавишей, выберите пункт «Добавить ссылку». В появившемся окне выберите из списка «Имя компонента» пункт System.Windows.Forms и нажмите «Ok».
|
Далее опишите класс NewForm, который будет содержать функцию Main и обработчик для события Click. Используя класс Form, который находится в пространстве имён System.Windows.Forms создайте экземпляр класса:
Form MainForm = new Form();
Т.к. MainForm является экземпляром класса Form, то он наследует все его свойства, события и методы. Используйте свойство Text, для задания текста заголовка формы, например «Главная форма». Опишите в созданном Вами классе NewForm обработчик с названием MainForm_Click для события Click объекта MainForm:
static void MainForm_Click(object sender, EventArgs e)
{
MessageBox.Show("сработал обработчик для события Click.");
}
Используя делегат EventHandler, подпишитесь на событие Click. В конце функции Main для запуска формы используйте оператор:
Application.Run(MainForm);
Запустите приложение Ctrl+F5.
Создание Windows-приложения.
Создайте проект WindowsApplication (Файл – Создать – Проект). В появившемся окне выберите «Приложение Windows Forms».
Укажите путь сохранения Вашего проекта и нажмите «Ok». После этого откроется сам проект с пустой формой. Зайдите в меню «Вид» и выберите пункт «Панель элементов». Откроется панель элементов со списком элементов. Перенесите на форму две кнопки (button) и пропишите в обработчике события Click (сделать двойной клик на самой кнопке) для них программный код, который будет в заголовке формы изменять текст «Кнопка 1» и «Кнопка 2»:
private void button1_Click(object sender, EventArgs e)
{
this.Text = "Кнопка 1";
}