5.1. Разработка оконных приложений
Создание любого оконного приложения осуществляется, как правило, в три этапа:
- Создание интерфейса приложения, т. е. средств взаимодействия пользователя с программой.
- Разработка сценария работы будущего приложения. На этом этапе определяют, какая информация будет выводиться на экран, какие события будут происходить при использовании различных компонентов, как приложение должно завершить работу, какие результаты и в каком виде сохранить и т. д.
- Разработка алгоритма решения поставленной задачи.
Большинство приложений в операционной системе Windows выглядят и ведут себя сходным образом. Компания Microsoft предложила рекомендации для разработки программного обеспечения, направленные на то, чтобы пользователь не тратил время на освоение нюансов пользовательского интерфейса новой программы, а сразу начал продуктивно ее использовать. Эти рекомендации основаны на психофизиологических особенностях человека и существенно облегчат жизнь будущим пользователям вашей программы.
Приведем некоторые рекомендации по разработке графического интерфейса оконных приложений (пример 5.1).
5.2. Стандартные диалоги
Практически любое приложение Windows использует стандартные диалоги, встроенные в операционную систему, для открытия и сохранения файлов, выбора атрибутов шрифта или установки цвета, поиска текста, печати. В библиотеку VCL включены компоненты, реализующие соответствующие окна Windows. Они размещены на панели Диалоговые окна (пример 5.2). В примере 5.3 приведен перечень компонентов для реализации стандартных диалогов.
Объекты на странице Диалоговые окна невидимы во время выполнения, поэтому они размещаются в специальной области под формой (пример 5.4). Внешний вид окна диалога зависит от версии Windows.
Вызов и обработка диалогов происходит программно. Для всех диалогов определен метод ShowDialog() (пример 5.5). С помощью этого метода происходит открытие окна соответствующего диалога. В свойствах компонента-диалога запоминается выбор пользователя, который затем можно обработать.
Диалоги для открытия и сохранения файлов используются в различных приложениях. Основное свойство компонентов OpenDialog и SaveDialog, в котором возвращается в виде строки имя файла, — это свойство FileName. Если задать данное свойство на этапе конструирования в окне инспектора объектов, то при открытии диалога
может выбрать имя шрифта, его стиль, размер. Основное свойство компонента — Font.
Для вызова стандартного окна установки цвета используется компонент ColorDialog (пример 5.8). В нем можно выбрать цвет из базовой палитры. Основное свойство компонента ColorDialog — Color. Это свойство соответствует тому цвету, который пользователь выбрал в диалоге.
5.3. Создание меню
Практически любое приложение должно иметь меню, которое дает удобный доступ к функциям программы. Существует несколько типов меню:
- главное меню с выпадающими списками разделов;
- каскадные меню, в которых разделу первичного меню ставится в соответствие список подразделов;
- контекстные меню, появляющиеся при нажатии правой клавишей мыши на объекте.
В PascalABC.Net меню создаются компонентами (главное меню) и (контекстное меню), расположенными на панели Меню и панели инструментов. Во время выполнения программы сами компоненты не видны, поэтому размещаются в специальной области под формой (пример 5.9). На этапе выполнения программы главное меню будет помещено на свое стандартное место — наверху формы, контекстное меню появится только после нажатия правой кнопки мыши по тому компоненту, к которому оно относится.
Для добавления новых пунктов меню нужно кликнуть левой клавишей мыши в верхней части формы (там, где обычно располагается меню). Затем заполнить ячейки, соответствующие пунктам меню (пример 5.10).
Каждый пункт меню является отдельным объектом. Список всех компонентов, относящихся к меню, можно увидеть в выпадающем списке в инспекторе объектов. Названия пунктов меню прописываются в свойстве Text в окне инспектора объектов (пример 5.11).
Для каждого пункта меню основным событием является событие Click.
Создание контекстных меню аналогично созданию главного меню. Сначала нужно выбрать компонент на нижней панели, а затем заполнить ячейки. Для того чтобы при щелчке правой кнопкой мыши на некотором компоненте появлялось контекстное меню, нужно написать имя контекстного меню в свойстве ContextMenuStrip для выбранного компонента (пример 5.12).
Написание обработчиков для меню и диалогов будет рассмотрено в следующих пунктах.
5.4. Создание приложения «Блокнот»
Программа Блокнот должна давать возможность открыть и сохранить текстовый файл, выбрать цвет текста и цвет фона.
Разместить на форме (пример 5.13) следующие компоненты:
- рабочая область для текста — TextBox1;
- диалоги работы с файлами — OpenFileDialog1, SaveFileDialog1;
- диалоги для настройки внешнего вида приложения — FontDialog1, ColorDialog1;
- главное меню —
Компонент TextBox1 предназначен для набора и редактирования текста. Текст может набираться в несколько строк, поэтому нужно установить значение true для свойства MiltiLine. Для того чтобы компонент занимал всю клиентскую часть формы, необходимо установить у свойства Dock значение Fill (пример 5.14). Установить значение Vertical для свойства ScrollBars (вертикальная полоса прокрутки).
Структура меню представлена в примере 5.15. Для написания обработчиков пунктов меню нужно в инспекторе объектов выбрать соответствующий пункт меню, перейти на вкладку Events и выбрать событие Click. Поскольку событие Click является событием по умолчанию, то двойной клик по пункту в редакторе меню создаст процедуру-обработчик.
Окно работающего приложения показано в примере 5.16.
Обработчики событий для каждого из пунктов меню представлены в примере 5.17.
Для сохранения и загрузки файлов опишем глобальную переменную F_N: var F _ N: String;
Обработчик пункта меню Новый (StripMenuItem4) очищает строки компонента TextBox1 от введенного ранее текста.
Обработчики пунктов меню Открыть (StripMenuItem5) и Сохранить (StripMenuItem6) работают с файлом. Имя файла добавляется к заголовку окна.
Обработчик пункта меню Выход (StripMenuItem8) закрывает главную форму проекта.
Обработчик пункта меню Шрифт (StripMenuItem9) приписывает шрифту, связанному с компонентом TextBox1, свойства, выбранные пользователем.
Обработчики пунктов меню Цвет текста (StripMenuItem10) и Цвет фона (StripMenuItem11) устанавливают для TextBox1 цвета текста и фона, выбранные пользователем.
Для компонента TextBox определены следующие действия: Копировать (Ctrl + C), Вырезать (Ctrl + X), Вставить (Ctrl + V), Отменить (Ctrl + Z).
5.5. Создание приложения «Графический редактор»
Программа «Графический редактор» должна давать возможность открыть и сохранить файл, выбрать цвет линии и цвет фона, установить толщину линии. Рисование производится выбранным цветом линии при нажатой левой клавише мыши. Клик правой клавишей мыши внутри замкнутой области используется для заливки ограниченной области выбранным цветом фона.
Сначала спроектируем форму, разместив на ней следующие компоненты (пример 5.18):
- область для рисования — PictureBox;
- компоненты, отображающие выбранный цвет для рисования и цвет фона — Panel1, Panel2;
- кнопки для смены цвета;
- компонент выбора цвета — ColorDialog1;
- компонент для выбора толщины линии — numericUpDown1 (панель компонентов Стандартные элементы управления);
- главное меню — menuStripl и компоненты для работы с файлами — OpenFileDialog1, SaveFileDialog
На этапе конструирования установить значение свойства BackColor у компонентов Panel1 и Panel2 — Black и White соответственно.
У свойств Value и Minimum для компонента numericUpDown1 установить значение 1.
Структура меню показана в примере 5.19. Создание рисунка и загрузка файла в приложение приведены в примере 5.20.
В обработчике события Load для формы прописаны первоначальные установки для создания графического объекта, заданы параметры кисти и карандаша.
В обработчике события MouseDown для компонента PaintBox1 задаем переменной m_d значение true — кнопка нажата. Здесь же запоминаем координаты точки, поскольку от этой точки начнем строить линию. В обработчике MouseUp — значение переменной m_d = false — кнопка не нажата.
Для отслеживания траектории движения мыши по компоненту PaintBox1 создаем обработчик события MouseMove. Если кнопка нажата, то можем строить линию. Параметры e.x, e.y возвращают координаты точки, в которой произошло нажатие кнопки.
Для перемещения мыши нужно использовать метод DrawLine (x1, y1, e.x, e.y) — рисование линии, соединяющей две точки. После прорисовки обновляем координаты.
Толщина линии определяется значением свойства Value для компонента numericUpDown1. Обработчик события — ValueChanged.
Обработчики событий для компонентов OpenFileDialog1, SaveFileDialog1 вызываются из соответствующих пунктов меню и аналогичны обработчикам, описанным для программы Блокнот. Для сохранения и загрузки файлов нужно описать глобальную строковую переменную FileName. Приложение может сохранять и загружать файлы формата BMP.
С помощью компонента ColorDialog1 можно выбрать цвет линии или заливки. Пункты меню Цвет позволяют выбрать цвет линии или заливки соответственно.
В примере 5.21 приведено описание глобальных переменных, которые используются для создания приложения «Графический редактор». Обработчики всех описанных событий приведены в приложении.
5.6. Создание приложения «Калькулятор»
Создание калькулятора начнем с конструирования формы. На ней нужно разместить: поле TextBox для ввода/ вывода чисел, 10 кнопок с цифрами, 4 кнопки с арифметическими действиями, кнопку «=» и кнопку «С» — очистить (пример 5.22).
При нажатии на кнопку с цифрой программа должна дописать эту цифру к числу в поле TextBox. При нажатии на кнопку с арифметическим действием нужно запомнить число, которое в данный момент находится в поле TextBox, и очистить поле для ввода второго числа. Числа будем хранить в двух переменных n1, n2 типа integer. Знак операции будем хранить в переменной znak типа char. Переменные описываются как глобальные. При нажатии на кнопку «=» выполняется арифметическое действие и выводится результат.
Кнопки могут содержать рисунок на поверхности (например, изображения с цифрами). Свойство для размещения рисунка — BackgroundImage.
Установить значение FixedSingle для свойства FormBorderStyle формы. В этом случае граница формы не позволит менять ее размеры.
Коды процедур-обработчиков приведены в примере 5.23.
Для каждой кнопки на форме нужно создать обработчик события Click.
Обработчики событий для всех цифровых кнопок будут идентичны.
Обработчики для кнопок арифметических действий будут отличаться
только значением запоминаемой операции.
Основные вычисления происходят в обработчике кнопки «=». Преобразуем в число n2 значение поля Edit и выполняем арифметическую операцию в зависимости от значения переменной znak. После этого обнуляем переменные.
В обработчике кнопки «С» (от англ. clear — очистить) происходит обнуление переменных и очистка поля Edit.
Созданный калькулятор имеет большое количество ограничений в своей работе, поскольку рассчитан на вычисления только с натуральными числами.