- •Лабораторная работа 5-6
- •Теоретические сведения
- •События.
- •Элементы управления. Кнопки и надписи.
- •Некоторые общие методы и свойства
- •Некоторые свойства кнопки
- •Некоторые свойства надписи
- •Прелюдия к практическому примеру.
- •Меню верхнего уровня
- •Некоторые методы и свойства
- •Лабораторная работа 5-6
- •Литература
События.
Понятие события вам уже известно из курса программирования под 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 смотрите в следующих разделах урока.