Основы работы с Visual Studio. Net

Вид материалаДокументы

Содержание


Класс с событием
События в Windows-приложениях
Windows-приложение FirstForm
Подобный материал:
1   2   3   4   5   6   7   8   9

Класс с событием


Даже в консольных приложениях использование делегатов и событий — необходимый и удобный способ реализации многих идей. Рассмотрим приложение, имитирующее выпадение игральной кости. Если выпадет число 6, сгенерируется событие — max. Создайте новое консольное приложение, назовите его ClasswithEvent и воспользуйтесь следующим кодом:

using System;


namespace ClasswitnEvent

{

//Объявляем делегат по имени EventHandler (Event Handler — oбработчик события)

public delegate void EventHandler();

// Создаем класс "Игральная кость"

class IgralnayaKost

{

Random r;

//Объявляем событие на основе делегата

public event EventHandler max;

//В конструкторе класса объявляем переменную r, генерируемую встроеным объектом Random

public IgralnayaKost()

{

r=new Random();

}

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

public int random()

{

//Случаное число от 1 до 6

int res = r.Next(6)+1;

if(res==6)

{

//Вызываем событие

max();

}

return res;

}

}


class Class1

{

///

/// The main entry point for the application

///


[STAThread]

static void Main(string[] args)

{

//Создаем экземпляр brosok класса IgralnayaKost

IgralnayaKost brosok=new IgralnayaKost();

//Добавляем обработчика события

brosok.max+=new EventHandler(Metodobrabotchik);

//Вызываем метод, в котором вызывается событие

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

{

Console.WriteLine("{0}", brosok.random());

}


}

//Обработчик для события

public static void Metodobrabotchik()

{

Console.WriteLine("Выпало максимальное количество очков");

}

}

}

Листинг 1.7.

В классе Class1 создается новый экземпляр brosok класса IgralnayaKost, затем событию max определяется обработчик Metodobrabotchik и запускается метод random 15 раз. Если выпадет шестерка, то возникнет событие max и сработает обработчик для него. Результат выполнения программы будет каждый раз разный и будет выглядеть примерно так (рис. 1.38):

События в Windows-приложениях


Теперь, когда мы разобрались с синтаксисом и логикой делегатов и событий, настало время приступить к рассмотрению событийной модели Windows-форм.

Откройте снова приложение FirstForm. Из окна Toolbox перетащите элемент управления Button на форму. Дважды щелкните на кнопке button1. В коде найдите область Windows Form Designer generated code. В таблице 1.3 сравниваются листинги приложений Event и FirstForm c кнопкой.

Таблица 1.3.

Консольное приложение Event

Windows-приложение FirstForm

using System;

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace Event

{

//Объявляем делегат Mydelegate

delegate void Mydelegate();

//Создаем класс Button, в котором

//будет находится событие

//и метод для него

class Button

{

// Объявляем событие Sobitie

// на основе делегата

public event Mydelegate Sobitie;

//Cоздаем метод для события,

//который просто будет

//обращаться к событию

public void MetoddlyaSobitiya()

{

//Можно вставить проверку наличия события.

//if (Sobitie !=null)

Sobitie();

}

class Class1

{

namespace FirstForm

{

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

private System.ComponentModel.Container

components = null;

public Form1()

{

InitializeComponent();

}


protected override void Dispose(bool disposing)

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}


#region Windows Form Designer generated code

private void InitializeComponent()

{

// Среда автоматически создает экземпляр

// button1 класса Button при перетаскивании

// элемента управления на форму

this.button1 =

new System.Windows.Forms.Button();

this.SuspendLayout();

//

// button1

//

this.button1.Location =

new System.Drawing.Point(104, 144);

this.button1.Name = "button1";

this.button1.TabIndex = 0;

this.button1.Text = "button1";

// Среда автоматически привязывает

// обработчик для события Click экземпляра

// button1. EventHandler – это делегат.

this.button1.Click +=

new System.EventHandler(this.button1_Click);

//

// Form1

//

this.AutoScaleBaseSize =

new System.Drawing.Size(5, 13);

this.ClientSize =

new System.Drawing.Size(292, 266);

this.Controls.Add(this.button1);

this.Name = "Form1";

this.Text = "Fom1";

this.ResumeLayout(false);


}

#endregion

[STAThread]

static void Main(string[] args)

{

// Создаем экземпляр btn класса Button

Button btn = new Button();

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

//Sobitie экземпляра btn.

//Когда в скобках укажете

//Metodobrabotchik, нажмите

//дважды клавишу Tab

btn.Sobitie +=

new Mydelegate(Metodobrabotchik);

//Развернутая запись строки выше

//btn.Sobitie = btn.Sobitie +

// new Mydelegate(Metoddlyadelegata);

//вызываем метод для события

btn.MetoddlyaSobitiya();

}

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

// Создаем метод-обработчик, если среда

// сгенерировала его сама –

// добавляем строку вывода.

private static void Metodobrabotchik ()

{

Console.WriteLine("Произошло событие");

}

}

}

}

// Метод-обработчик для нажатия на кнопку;

// когда мы щелкаем по элементу управления

// в режиме дизайна, среда генерирует этот

//метод и курсор оказывается уже здесь

private void button1_Click(object sender,

System.EventArgs e)

{

MessageBox.Show("Произошло событие");

}

}

}

Сравнивая листинги, замечаем, что для Windows-приложения First Form не нужно объявлять делегат, событие, метод для обращения к событию и затем вызывать этот метод. Почему же это тогда работает? Дело в том, что среда .NET содержит огромное количество встроенных событий, доступ к которым осуществляется по их названиям. Более того, среда сама привязывает обработчика для события Click (нажатие на кнопку) и нужный метод, используя встроенный делегат EventHandler:

this.button1.Click += new System.EventHandler(this.button1_Click);

Платформа .NET требует точной сигнатуры для любого обработчика событий. button1_Click () и все остальные обработчики событий обязаны выглядеть следующим образом:

void button1_Click (object sender, EventArgs e)//е также может быть производным от EventArgs

{

// код для обработки события

}

Обработчики событий не могут возвращать ничего, кроме void. В них отсутствует точка, которая могла бы служить для возврата значения. Обработчики должны принимать два параметра. Первый параметр является ссылкой на объект, который сгенерировал событие. Второй параметр должен быть ссылкой либо на базовый класс .NET System.EventArgs, либо на производный класс. Класс EventArgs представляет собой общий базовый класс для всех уведомлений о произошедших событиях.

В окне свойств каждого элемента управления на вкладке событий перечислены все доступные события для этого элемента (рис. 1.39).
Рис. 1.39.  Вкладка событий элемента button в окне свойств Properties

Двойной щелчок в поле выбранного свойства перемещает нас в режим дизайна, где уже сгенерированы все объекты для обработки данного события и нам остается только написать код для метода-обработчика. На рис. рис. 1.39 выбрано событие Click, это же событие выбирается по умолчанию при двойном щелчке на элементе управления "кнопка".