Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сучасні технології програмув.(C#)_5-6.docx
Скачиваний:
22
Добавлен:
05.03.2016
Размер:
63.54 Кб
Скачать

События.

Понятие события вам уже известно из курса программирования под Windows. В контексте C# событие - это способ, с помощью которого один класс оповещает другой (другие) класс о чем-то произошедшем. Иногда говоря, что механизм событий использует идеологию “публикация/подписка”. Какой-то класс публикует свои события, а другие классы подписываются на те события, которые им интересны. Кроме этой модели события, безусловно, используются при программировании на C# с использованием Windows Forms. Для работы с событием нужно выполнить следующие действия:1) Создать делегат, который будет использоваться для вызова нужного метода при срабатывании события 2) Определить само событие при помощи ключевого слова event. Слова словами давайте рассмотрим пример на события:

using System;

using System.Collections;

class Human{

// Делегат для реакции на событие

public delegate void HumanHandler(string info);

// События, которые могут возникать

public static event HumanHandler Run;

public static event HumanHandler Stop;

// Методы из которых могут генерироваться события

public void MayBeStart(){

Random rand = new Random();

if(rand.Next(0,2)==0)

Run("Беги, Лола, Беги");// Генерируем событие и передаём ему параметры!!!

}

public void MayBeStop(){

Random rand = new Random();

if(rand.Next(0,2)==0)

Stop("Стоп,Машина");// Генерируем событие и передаём ему параметры!!!

}

public enum Sex{Male,Female};

private Sex p;

private string name;

private string surname;

private int age;

public Human(){

name = surname = "Нет Данных";

age = 0;

p = Sex.Male;

}

public Human(string name,string surname,int age,Sex p){

this.name = name;

this.surname = surname;

this.age = age;

this.p = p;

}

public string Name{

get{

return name;

}

set{

name = value;

}

}

public string Surname{

get{

return name;

}

set{

name = value;

}

}

public int Age{

get{

return age;

}

set{

age = value;

}

}

public Sex RealSex{

get{

return p;

}

set{

p = value;

}

}

}

// Класс с Main, и обработчиками

class Sample{

// Обработчики событий

// Обработчик Run

public static void OnRun(string msg){

Console.WriteLine("В OnRun:"+msg);

}

// Обработчик Stop

public static void OnStop(string msg){

Console.WriteLine("В OnStop:"+msg);

}

// Обработчик Run

public static void OnRun2(string msg){

Console.WriteLine("В OnRun2:"+msg);

}

public static void Main(){

Human obj = new Human();

// Добавление к событиям обработчиков используя делегаты

Human.Run += new Human.HumanHandler(OnRun);

Human.Stop += new Human.HumanHandler(OnStop);

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStart();

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStop();

// Добавляем ещё один обработчик для Run

Human.Run += new Human.HumanHandler(OnRun2);

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStart();

// Удаляем обработчик события Run под названием OnRun2

Human.Run -= new Human.HumanHandler(OnRun2);

Console.Read();

}

}

Обратите внимание, как переплетаются между собой события и делегаты в нашем примере. Например, мы указываем какие методы будут, в ответ, на приход события вызываться при помощи делегата (то есть, указываем названия обработчиков). В терминологии С# указание обработчика для события – это подключение приёмника для прослушивания события. Вот так гордо называются строки приведенные ниже:

// Добавление к событиям обработчиков используя делегаты

Human.Run += new Human.HumanHandler(OnRun);

Human.Stop += new Human.HumanHandler(OnStop);

Отсоединение обработчика называется отключением от прослушивания. Например, этот процесс указывается ниже ещё раз:

// Удаляем обработчик события Run под названием OnRun2

Human.Run -= new Human.HumanHandler(OnRun2);

Обработчики событий можно также поместить в отдельный класс. Например:

using System;

using System.Collections;

class Human{

// Делегат

public delegate void HumanHandler(string info);

// События

public static event HumanHandler Run;

public static event HumanHandler Stop;

// Генерация событий

public void MayBeStart(){

Random rand = new Random();

if(rand.Next(0,2)==0)

Run("Беги, Лола, Беги");

}

public void MayBeStop(){

Random rand = new Random();

if(rand.Next(0,2)==0)

Stop("Стоп,Машина");

}

public enum Sex{Male,Female};

private Sex p;

private string name;

private string surname;

private int age;

public Human(){

name = surname = "Нет Данных";

age = 0;

p = Sex.Male;

}

public Human(string name,string surname,int age,Sex p){

this.name = name;

this.surname = surname;

this.age = age;

this.p = p;

}

public string Name{

get{

return name;

}

set{

name = value;

}

}

public string Surname{

get{

return name;

}

set{

name = value;

}

}

public int Age{

get{

return age;

}

set{

age = value;

}

}

public Sex RealSex{

get{

return p;

}

set{

p = value;

}

}

}

//=======================================================

// Класс для обработчиков событий

//=======================================================

class HumanEventSink{

// Обработчики событий

public void OnRun(string msg){

Console.WriteLine("В HumanEventSink OnRun:"+msg);

}

public void OnStop(string msg){

Console.WriteLine("В HumanEventSink OnStop:"+msg);

}

public void OnRun2(string msg){

Console.WriteLine("В HumanEventSink OnRun2:"+msg);

}

}

//=======================================================

class Sample{

public static void Main(){

HumanEventSink envs = new HumanEventSink();

Human obj = new Human();

//=======================================================

Human.Run += new Human.HumanHandler(envs.OnRun);

Human.Stop += new Human.HumanHandler(envs.OnStop);

//=======================================================

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStart();

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStop();

//=======================================================

Human.Run += new Human.HumanHandler(envs.OnRun2);

Console.WriteLine("\n*****************************************\n");

for(int i = 0;i<5;i++)

obj.MayBeStart();

//=======================================================

Human.Run -= new Human.HumanHandler(envs.OnRun2);

Console.Read();

}

}

Windows Forms.

Итак, мы подошли к волнующему и ответственному моменту - программированию Windows приложений. Перед тем как написать хотя бы одну строку кода определимся, как мы будем создавать Windows приложение. Тип проекта у нас останется Empty Project.После создания пустого каркаса зайдите в опции проекта (Project->имя_проекта properties).Должна быть выбрана вкладкаGeneral. В пункте Output Type надо поставить Windows Application(это означает, что приложение является Windows – приложением).Это и демонстрируется на рисунке.

Также нужно подключить 2 библиотеки динамической линковки(System.dll,System.Windows.Forms.dll). Для этого нужно выбрать Project->Add Refernce. И через кнопку select при активной закладки .NET выбрать указанные dll. Это показывается на рисунке ниже:

Выполнив всё это вы готовы к написанию программы. Теперь пришло время подковаться теоретически для взятия новых высот.

<тема>Пространство имен System.Windows.Forms

Это пространство предназначено для создания Windows - приложений с графическим интерфейсом. В этом пространстве есть много нужных и полезных классов.Первая программа:

using System.Windows.Forms;

using System;

class Sample

{

public static void Main()

{

// Создание формы

Form frm = new Form();

// Задание заголовка

frm.Text = "Tell me a secret";

Application.Run(frm);

}

}

Данная программа отображает на экран форму ( аналог диалога в терминологии Visual C++). Данная программа отображает на экран форму (аналог диалога в терминологии Visual C++).Form – это класс, который находится в пространстве System.Windows.Forms отвечает за создание форм. Вот его иерархия наследования:

Object

MarshalByRefObject

Component

Control

ScrollableControl

ContainerControl

Form

Естественно у этого класса есть свойства и методы, например в нашем примере с помощью свойства Text мы изменили заголовок окна. Application – это класс, который отвечает за запуск, остановку приложения и т.п.. Метод Run() – это статический метод класса Application.Он запускает стандартный цикл работы с сообщениями для текущего потока. Форма, чья ссылка была передана в метод Run становится видимой и главной формой в приложении. Вообще в приложении может быть много форм, но главная будет только одна и когда она закрывается, все подчиненные формы закрываются тоже. Примеры работы с Windows.Forms смотрите в следующих разделах урока.

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