Основы работы с Visual Studio. Net
Вид материала | Документы |
СодержаниеКласс с событием События в Windows-приложениях Windows-приложение FirstForm |
- Лекция Visual Studio. Net, Framework. Net, 158.46kb.
- Первая программа на C# и основные приемы работы в системе ms visual Studio 3 Структура, 1180.89kb.
- Visual Basic Основы работы с базами данных, 1336.88kb.
- Лекція Механізми доступу додатків С++ до баз даних. Створення у середовищі Borland, 46.7kb.
- Лекция 23. Отладка и обработка исключительных ситуаций Корректность и устойчивость., 391.81kb.
- Microsoft Visual Studio 2008. Она позволяет оптимизировать области Дирихле для двумерных, 9.71kb.
- Методические указания к выполнению курсового проекта Цель работы, 69.15kb.
- Лекции в формате pdf (9 лекций с вопросами для самопроверки по каждой лекции). Проекты, 18.64kb.
- Цели и задачи учебного курса, 202.31kb.
- Краткий курс по изучению языка программирования Visual Basic, 357.37kb.
Класс с событием
Даже в консольных приложениях использование делегатов и событий — необходимый и удобный способ реализации многих идей. Рассмотрим приложение, имитирующее выпадение игральной кости. Если выпадет число 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
{
// код для обработки события
}
О

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