- •Основы создания оконных приложений Особенности поведения оконных приложений.
- •Первое оконное приложение
- •Элементы управления
- •Событийно-управляемая модель выполнения оконного приложения
- •Принцип распределения ответственности
- •Элемент управления Timer
- •Динамическое управление обработчиками
- •Вопрос 1: Перед тем как оператор
- •Вопрос 2: Можно ли связать с событием несколько обработчиков и что при этом происходит?
- •Вопрос 3: Можно ли выполнить обратную операцию – исключить обработчик из списка?
- •Элемент управления ListBox
- •Параметры событий. Каскад событий
- •Использование визуального дизайнера
- •Редактирование свойств элементов управления
- •Анализ сгенерированного исходного кода
- •Сохранение результатов
- •Управление объектами файловой системы
- •Информация о логических дисках (класс DriveInfo)
- •Работа с каталогами (папками)
- •Работа с файлами
- •Стандартные диалоговые окна
- •Сериализация
- •Объектные графы
- •Формат сериализации
- •Реконструкция объектов
- •Использование SoapFormatter и XmlSerializer
- •Сохранение коллекций объектов
- •Архитектура программных систем
- •Собственные производные классы элементов управления
- •Другие элементы управления
- •Класс Control
- •Использование возможностей класса Control
- •Ответ на события MouseMove
- •Регистрация щелчков кнопок мыши
- •Ответ на события клавиатуры
- •Функциональные возможности класса Form
- •Цикл существования типа Form
- •Form (Форма)
Принцип распределения ответственности
В предложенном варианте программы единственный класс Program отвечал за создание формы и за запуск приложения. Полезно разделить эти обязанности между двумя классами, например MainWindow и Program:
class Program
{ public static void Main()
{ Application.Run(new MainWindow()); }
}
class MainWindow:Form
{ private int FormHeight = 300;
private int FormWidth = 500;
private Button b1;
private Button b2;
public MainWindow()
{
this.ClientSize = new Size(FormWidth, FormHeight);
//создание и настройка первой кнопки
b1 = new Button();
b1.Left = FormWidth / 5; b1.Top = FormHeight / 3;
b1.Width = FormWidth / 5;b1.Height = FormHeight / 3;
b1.Click += ButtonClick;
//создание и настройка второй кнопки
b2 = new Button();
b2.Bounds = new Rectangle(3 * FormWidth / 5, FormHeight / 3, FormWidth / 5, FormHeight / 3);
b2.Click += ButtonClick;
//добавление кнопок на форму
this.Controls.Add(b1);
this.Controls.Add(b2);
}
private void ButtonClick(object sender, EventArgs ea)
{
((Button)sender).Text = DateTime.Now.ToString();
}
}
Прокомментируем изменения.
Самое главное – за создание формы отвечает класс MainWindow, производный от стандартного класса Form. Это значит, что объекты нашего нового класса полностью унаследовали возможности стандартных окон.
Класс программ стал чрезвычайно коротким – его задачей является выполнить при запуске программы (метод Main!) 2 действия – создание объекта класса MainWindow, а затем запуск цикла обработки событий для этого объекта-формы. Это типичная ситуация для оконных приложений, поэтому в дальнейших программах класс Program почти всегда будет оставаться именно таким. Вы даже можете забыть о его существовании ().
Первое, что происходит при запуске программы – создание окна. А за создание объектов классов, как известно, отвечают конструкторы. Основную часть текста программы как раз и составляет конструктор класса MainWindow. Теперь объекты-кнопки представлены переменными класса MainWindow. Переменная f пропала – ее представляет ключевое слово this.
Обработчик щелчка – метод класса MainWindow.
Почему такая структура предпочтительнее. Пока без доказательств (а строгие доказательства здесь вряд ли возможны) повторим заголовок данного параграфа: в такой структуре программа разбита на несколько частей (классов), между которыми правильно распределены ответственности – именно такой подход называют принципом «разделяй и властвуй» в программировании. Следуя этому принципу, мы сможем создавать большие и, в то же время, не слишком сложные программы.
Замечание! Если Вы попытаетесь открыть в VisualStudio файл, содержащий такой исходный код, то получите сообщение об ошибке следующего содержания:
«The class MainWindow can be designed, but is not the first class in the file. Visual Studio requires that designers use the first class in the file. Move the class code so that it is the first class in the file and try loading the designer again.»
В свободном переводе это означает следующее – визуальному дизайнеру «не нравится», что класс формы не первый в файле. Строго говоря, это не ошибка. Но зато если Вы просто переместите класс MainWindow в начало, то сможете и увидеть Вашу форму в режиме дизайна еще до запуска программы.
