Выбрать главу

ется массив mi объектов класса MenuItem. Аргументом конструктору

класса  MenuItem  передаются  текстовые  названия  команд.  Добав-

ление команды меню в пункт меню выполняется через коллекцию

MenuItems с помощью метода Add().

Кроме этого, для команд разных пунктов меню выполняется регистрация

обработчиков событий. Здесь есть два важных момента. Во-первых, ко-

манда вида mainMI[k].MenuItems[m] означает m+1-ю команду в k+1-м пункте

главного меню, а событие Click для команды меню означает выбор пользо-

вателем этой команды. Во-вторых, для всех пунктов меню, кроме началь-

ного, для всех команд пункта меню в качестве обработчика регистрируется

один и тот же метод. Поэтому такой метод должен уметь как-то различать

разные команды в пределах пункта меню. В каждом методе-обработчике

эта задача решается по-разному.

Метод setType() вызывается для обработки выбора пункта меню, свя-

занного с определением типа шрифта. В теле метода объект obj (аргу-

мент), вызвавший событие, командой obj as MenuItem приводится к типу

MenuItem и для этого объекта считывается свойство Text (название ко-

манды). Затем с помощью оператора цикла ищется совпадение названия

команды и названия кнопки-переключателя. Если совпадение найдено, устанавливается соответствующий переключатель. В результате для пе-

реключателя происходит событие CheckedChanged, а на этот случай уже

имеется обработчик.

Метод setStyle() используется в качестве обработчика события выбора

пункта меню, связанного с определением стиля шрифта. В этом случае

определяется индекс команды пункта меню (свойство Index) и для опции

в окне формы с таким же индексом статус меняется на противополож-

ный — выделенная опция становится невыделенной, и наоборот.

Метод setSize() используется для обработки события выбора пункта

меню, связанного с определением размера шрифта. Здесь мы считываем

название команды (свойство Text) и присваиваем его в качестве значения

(свойство Text) текстовому полю (объект tsize-поле класса MyForm).

Важную роль в программном коде играет свойство SFont. У свойства име-

ется только get-аксессор, в котором на основе положения переключателей

типа шрифта, состояния опций стиля шрифта и значения текстового поля

304

Глава 8. Приложение с графическим интерфейсом: учебный проект

с размером шрифта формируется объект класса Font, который и возвраща-

ется в качестве результата (значения свойства). При этом размер шрифта

не просто считывается из текстового поля, но и обрабатывается. Для этого

в программе предусмотрено свойство FSize. В единственном get-аксессоре

этого свойства выполняется попытка преобразовать число в текст. За счет

try­catch блока, если такая попытка неудачна, в качестве значения разме-

ра шрифта используется минимально допустимое. Также отслеживаются

случаи выхода значения размера шрифта за допустимые пределы. В случае

если размер шрифта меньше минимально допустимого, искусственно ге-

нерируется ошибка, которая перехватывается блоком try­catch. Слишком

большие числовые значения отлавливаются с помощью условного опера-

тора. В любом случае применяемый шрифт, если он не совпадает с перво-

начально введенным пользователем, отображается в текстовом поле.

ВМЕСТО ЗАКЛЮЧЕНИЯ Графический

конструктор

Пока это лекция. И даже скучная лекция.

Из к/ф «В поисках капитана Гранта»

В книгах Вступление и Заключение играют очень важную роль. Во Всту-

плении обычно автор пытается убедить читателя, что именно эта книга чи-

тателю нужна больше всего и именно из этой книги читатель почерпнет

столько знаний, что прочие книги ему уже и не понадобятся. В Заключе-

нии обычно дается краткое пояснение по поводу того, почему чуда не слу-

чилось. Короче говоря, без Вступления и Заключения не обойтись никак.

Мы постараемся отойти от канонов и употребить Заключение во благо, а не

в наущение. Но мистическую связь Вступления и Заключения разрывать

не будем. Во Вступлении мы самонадеянно утверждали, что к помощи гра-

фического конструктора, встроенного в среду Visual C# Express, прибегать

не будем. Здесь мы очень кратко покажем, как в графическом редакторе

можно создать простенькое функциональное окно. Ну а пытливый чита-

тель легко сможет экстраполировать подход и для создания более сложных