Добрый день!
Скажите, пожалуйста,планируется ли продолжение курсов по нанотехнологиям? Спасибо, Евгений
|
Особенности использования программных инструментальных платформ параллельных вычислительных систем общего назначения
Класс служит типом для создания объекта - источника рассылки извещений о событии. Обратите внимание, что при объявлении события " Месяц " имя делегата " Расчет " расширяется именем класса " Человек ", в котором определен этот делегат. Метод " Разослать " будет вызываться источником сообщений (в данном примере это будет метод Main ) и вызывать через событие " Месяц " все делегаты, подписавшиеся на это событие. Генерации события предшествует проверка наличия подписки.
class Program { static void Main(string[] args) { Человек чел = new Человек("Иванов", 100.0, 200.0); Предприятие пр1 = new Предприятие(), пр2 = new Предприятие(); Банк бнк = new Банк(); //Создаем объект, который будет выполнять //рассылку извещений о событии Извещение изв = new Извещение(чел); //Подписываемся на рассылку изв.Месяц += new Человек.Расчет(бнк.Пересчитать); изв.Месяц += new Человек.Расчет(пр1.Начислить); изв.Месяц += new Человек.Расчет(пр1.Вычесть); изв.Месяц += new Человек.Расчет(бнк.Внести); изв.Месяц += new Человек.Расчет(пр2.Начислить); изв.Месяц += new Человек.Расчет(пр2.Вычесть); изв.Месяц += new Человек.Расчет(бнк.Внести); изв.Месяц += new Человек.Расчет(бнк.Сообщить); //Генерируем сообщение - "Конец месяца" for(int i=0; i<3; i++) изв.Разослать(); } }
При запуске программы в методе Main создается объект типа " Человек ". Этот объект будет использоваться в качестве аргумента во всех обработчиках.
В качестве объекта - источника для рассылки извещений создается объект c именем изв и три объекта - приемника извещений: два предприятия ( пр1 и пр2 ) и один банк ( бнк ). Объекты производят подписку на события, регистрируя в событии изв.Месяц делегаты типа " Расчет ", которым поручено представлять методы - обработчики событий. Обратите внимание, что имя делегата " Расчет " расширено именем класса "Человек". Необходимость такого расширения вызвана тем, что определение делегата локализовано в классе " Человек ".
Выполнение программы завершается трехкратной генерацией сообщения об окончании месяца, которое реализовано как вызов метода рассылки извещений " изв.Разослать() ".На каждое сообщение об окончании месяца будут разосланы извещения и вызваны обравботчики событий в следующей последовательности:
бнк.Пересчитать(чел); пр1.Начислить(чел); пр1.Вычесть(чел); бнк.Внести(чел); пр2.Начислить(чел); пр2.Вычесть(чел); бнк.Внести(чел); бнк.Сообщить(чел);
В результате клиент получит три справки о состоянии вклада:
Вклад Иванов: 390,00 Вклад Иванов: 589,50 Вклад Иванов: 798,98
По рассмотренной схеме реализуются приложения с графическим интерфейсом пользователя, например, приложения, создаваемые в среде Visual Studio.Net по шаблону Windows Application (рис. 2.6).
Стандартизация элементов пользовательского интерфейса и схемы организации программы создает основу для разработки программы на основе предопределенных классов. Интегрированные инструментальные среды имеют встроенные средства, переводящие использование предопределенных классов в плоскость конструирования структуры программы и пользовательского интерфейса, оставляя за разработчиком программную реализацию обработчиков событий, в которых собственно концентрируется функциональность приложения.
Технологически разработка программы в этом случае сводится к следующим процессам:
- Автоматическая генерация каркаса программы по заданному разработчиком шаблону.
- Конструирование формы пользовательского интерфейса в визуальном режиме, сводящееся к размещению на форме элементов из имеющегося набора и настройка их свойств.
- Связывание элементов интерфейса в визуальном режиме с обработчиками событий.
- Ручная разработка кода, необходимого для обработки событий.
На рис. 2.7 приведена форма приложения, выполняющего вывод сообщения в окно и очистку этого окна.
Пример носит тривиальный характер с точки зрения функциональности приложения и приведен для демонстрации возможностей среды по генерации кода, реализующего объемные, но рутинные по характеру операции.
using System; using System.Collections.Generic; using System.Windows.Forms; namespace Начало { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1();форма); } } }
В классе Program определен метод Main, с которого начинается выполнение программы. Статический метод Run класса Application принимает ссылку на объект-приемник и организует цикл опроса очереди сообщений.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Начало { public partial class Form1 : Form { //Конструктор формы public Form1() { InitializeComponent(); } //Обработчик щелчка мышью на кнопке Выдать (имя объекта //button1) private void button1_Click(object sender, EventArgs e) { textBox1.Text = "Привет"; } //Обработчик щелчка мышью на кнопке Очистить(имя объекта //button2) private void button2_Click(object sender, EventArgs e) { textBox1.Text = ""; } //Обработчик щелчка мышью на кнопке Выход(имя объекта //button3) private void button3_Click(object sender, EventArgs e) { Close(); } } } using System.Drawing; using System.Windows.Forms; using System.ComponentModel; using System; namespace Начало { partial class Form1 { //Поля - ссылки на объекты private Button button1; private Button button2; private Button button3; private TextBox textBox1; private IContainer components = null; //Освобождение ресурсов при закрытии формы //(метод вызывается автоматически при закрытии формы) protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } //Инициализация полей формы и самой формы private void InitializeComponent() { //Создание объектов интерфейса button1 = new Button(); button2 = new Button(); button3 = new Button(); textBox1 = new TextBox(); //Запрещение приема извещений о событиях на время установки //свойств объектов интерфейса и формы SuspendLayout(); //1.Установка свойств объекта button1 (кнопка Выдать) //1.1.Расположение элемента на форме (левый верхний угол) button1.Location = new Point(12, 57); //1.2.Имя объекта button1.Name = "button1"; //1.3.Размер объекта button1.Size = new Size(75, 23); //1.4.Очередность передачи фокуса управления клавишей //табуляции button1.TabIndex = 0; //1.5.Текст, отображаемый на изображении объекта button1.Text = "Выдать"; //1.6.Режим использования фонового цвета для элемента //(использовать фоновый цвет данного элемента) button1.UseVisualStyleBackColor = true; //1.7.Подписка на событие button1.Click += new EventHandler(button1_Click); //2.Установка свойств объекта button2 (кнопка Очистить) //2.1.Расположение элемента на форме (левый верхний угол) button2.Location = new Point(110, 57); //2.2.Имя объекта button2.Name = "button2"; //2.3.Размер объекта button2.Size = new Size(75, 23); //2.4.Очередность передачи фокуса управления клавишей //табуляции button2.TabIndex = 1; //2.5.Текст, отображаемый на изображении объекта button2.Text = "Очистить"; //2.6.Режим использования фонового цвета для элемента //(использовать фоновый цвет данного элемента) button2.UseVisualStyleBackColor = true; //2.7.Подписка на событие button2.Click += new EventHandler(button2_Click); //3.Установка свойств объекта button3 (кнопка Выход) //3.1.Расположение элемента на форме (левый верхний угол) button3.Location = new Point(205, 57); //3.2.Имя объекта button3.Name = "button3"; //3.3.Размер объекта button3.Size = new Size(75, 23); //3.4.Очередность передачи фокуса управления клавишей //табуляции button3.TabIndex = 2; //3.5.Текст, отображаемый на изображении объекта button3.Text = "Выход"; //3.6.Режим использования фонового цвета для элемента //(использовать фоновый цвет данного элемента) button3.UseVisualStyleBackColor = true; //3.7.Подписка на событие button3.Click += new EventHandler(button3_Click); //4.Установка свойств объекта textBox1 (отображение текстового //сообщения) //4.1.Расположение элемента на форме (левый верхний угол) textBox1.Location = new Point(52, 12); //4.2.Имя объекта textBox1.Name = "textBox1"; //4.3.Размер объекта textBox1.Size = new Size(167, 20); //4.4.Очередность передачи фокуса управления клавишей //табуляции textBox1.TabIndex = 3; //5.Установка свойств объекта Form1 //5.1.Установка единиц измерения и режима изменения размеров //в зависимости от выбранного шрифта AutoScaleDimensions = new SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; //5.2.Имя объекта Name = "Form1"; //5.3.Текст, отображаемый на изображении объекта Text = "Form1"; //5.4.Размер клиентской части формы (без учета заголовка) ClientSize = new Size(292, 104); //5.5.Запоминание ссылок на элементы управления //в динамическом массиве Controls Controls.Add( textBox1); Controls.Add( button3); Controls.Add( button2); Controls.Add( button1); //Разрешение приема извещений о событиях ResumeLayout(false); PerformLayout(); } } }
Жирным шрифтом выделен код обработчиков событий, который необходимо ввести вручную.