Лабораторные работы МИРЭА 2014 (1017113), страница 15
Текст из файла (страница 15)
Завершив работу над формой, можно приступить к созданию программы. Но перед этим рассмотрим два важных понятия: событие и функцию обработки события.
Таблица 8. Значения свойств компонентов Button1 и Button2
Свойство | Компонент | |
Button1 | Button2 | |
Caption | Вычислить | Завершить |
Top | 144 | 144 |
Left | 16 | 104 |
Height | 25 | 25 |
Width | 75 |
Событие и функция обработки события
Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести в поля редактирования исходные данные и щелкнуть мышью на кнопке Вычислить. Щелчок на изображении командной кнопки — это пример того, что в Windows называется событием. Событие (Event) — это то, что происходит во время работы программы. В C++ Builder каждому событию присвоено имя. Например, щелчок кнопкой мыши — это событие Onclick, двойной щелчок мышью — событие OnDb1Click.
В табл. 9 приведены некоторые события Windows.
Таблица 9. События
Событие | Происходит |
OnClick | При щелчке кнопкой мыши |
OnDb1Click | При двойном щелчке кнопкой мыши |
OnMouseDown | При нажатии кнопки мыши |
OnMouseUp | При отпускании кнопки мыши |
OnMouseMove | При перемещении мыши |
OnKeyPress | При нажатии клавиши клавиатуры |
OnKeyDown | При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress — это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp) |
OnKeyUp | При отпускании нажатой клавиши клавиатуры |
OnCreate | При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий |
On Paint | При появлении окна на экране в начале работы программы; во время работы программы после появления окна (или его части), которое было закрыто другим окном или свернуто |
OnEnter | При получении элементом управления фокуса |
OnExit | При потере элементом управления фокуса |
Реакцией на событие должно быть какое-либо действие. В C++ Builder реакция на событие реализуется как функция обработки события. Таким образом, для того чтобы программа выполняла некоторую работу в ответ на действия пользователя, программист должен написать функцию обработки соответствующего события. Следует обратить внимание на то, что значительную часть обработки событий берет на себя компонент. Поэтому программист должен разрабатывать функцию обработки события только в том случае, если реакция на событие отличается от стандартной или не определена. Например, если по условию задачи ограничений на символы, вводимые в поле Edit, нет, то процедуру обработки события onKeypress писать не надо, т. к. во время работы программы будет использована стандартная (скрытая от программиста) процедура обработки этого события.
Методику создания функций обработки событий рассмотрим на примере функции обработки события onclick для командной кнопки Вычислить.
Чтобы приступить к созданию функции обработки события, сначала надо выбрать компонент, для которого создается функция обработки события. Выбрать компонент можно в окне Object Inspector или щелчком на изображении компонента в форме. После этого в окне Object Inspector нужно выбрать вкладку Events (События).
В левой колонке вкладки Events (рис. 22) перечислены события, которые может воспринимать выбранный компонент (имя и тип компонента указаны в верхней части окна). Если для события определена функция обработки, то в правой колонке рядом с именем события будет выведено имя этой функции.
Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в окне Object Inspector, в поле функции обработки соответствующего события (рис. 19). В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector рядом с именем события появится сгенерированное C++ Builder имя функции обработки события (рис. 23).
Рис. 18. На вкладке Events перечислены события, которые может воспринимать компонент (в данном случае — командная кнопка)
Рис. 19. Шаблон функции обработки события, сгенерированный C++ Builder
C++ Builder присваивает функции обработки события имя, которое состоит из двух частей. Первая часть имени идентифицирует форму, содержащую объект (компонент), для которого создана процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем примере имя формы — Form1, имя командной кнопки — Button1, а имя события — Click.
В окне редактора кода между фигурными скобками можно набирать инструкции, реализующие функцию обработки события.
В листинге 2.1 приведен текст функции обработки события OnClick для командной кнопки Вычислить. Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным шрифтом, комментарии — курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами в соответствии с принятыми в среде программистов правилами хорошего стиля.
Листинг 1. Простейшая обработка события OnClick на кнопке Вычислить
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
u = StrToFloat(Editl->Text);
r = StrToFloat(Edit2->Text);
// вычислить ток
i = u/r;
// вывести результат в поле метки
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + "А";
}
Функция Button1Click выполняет расчет силы тока и выводит результат расчета в поле Label4. Исходные данные вводятся из полей редактирования Edit1 и Edit2 путем обращения к свойству Text. Свойство Text содержит строку символов, которую ввел пользователь. Чтобы программа работала правильно, пользователь должен ввести в каждое поле редактирования целое или дробное число в правильном формате (при вводе дробного числа для разделения целой и дробной частей надо использовать запятую). Так как поле редактирования содержит текст (свойство Text строкового типа), необходимо выполнить преобразование строки в число. Эту задачу решает функция strToFloat, которой в качестве параметра передается содержимое поля редактирования — значение свойства Text (Edit1->Text — это содержимое поля Edit1). Функция strToFloat проверяет символы строки, переданной ей в качестве параметра, на допустимость и, если все символы верные, возвращает значение, соответствующее строке, полученной в качестве параметра.
После того как исходные данные будут помещены в переменные u и r, выполняется расчет.
Вычисленная величина силы тока выводится в поле Label4 путем присваивания значения свойству Caption. Для преобразования числа в строку символов (свойство Caption - строкового типа) используется функция FloatToStrF.
В листинге 2 приведена процедура обработки события OnClick на командной кнопке Завершить. Создается она точно так же, как и процедура обработки события OnClick для командной кнопки Вычислить. В результате щелчка на кнопке Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть окно программы. Делает это метод close.
Листинг 2. Процедура обработки события Onclick на кнопке Завершить
void __fastcall TForml::Button2Click(TObject*Sender)
{
Forml->Close();
}
Редактор кода
Во время набора текста программы редактор кода автоматически выделяет элементы программы: полужирным шрифтом — ключевые слова языка программирования (if, else, int, float и др.), курсивом — комментарии. Это делает текст программы более выразительным, что облегчает восприятие структуры программы.
В процессе разработки программы часто возникает необходимость переключения между окном редактора кода и окном формы. Сделать это можно при помощи командной кнопки Toggle Form/Unit, которая находится на панели инструментов View (рис. 20), или нажав клавишу <F12>. На панели инструментов View находятся командные кнопки View Unit и View Form, используя которые можно выбрать нужный модуль или форму в случае, если проект состоит из нескольких модулей или форм.
Рис. 20. Кнопка Toggle Form/Unit позволяет быстро переключаться между формой и кодом
Система подсказок
Редактор кода поддерживает функцию контекстно-зависимой подсказки, которая во время набора текста программы автоматически выводит краткую справочную информацию о свойствах и методах объектов, о параметрах функций. Например, после того как будет набрано имя объекта (компонента) и символы ->, редактор кода автоматически выведет список свойств и методов объекта (рис. 2.25). Программисту останется только выбрать из списка нужный элемент и нажать клавишу <Enter> (быстро перейти к нужному элементу списка или к области, где этот элемент находится, можно, нажав клавишу, соответствующую первому символу этого элемента).
Рис. 2.25. Редактор кода автоматически выводит список свойств и методов объекта (компонента)
Следует обратить внимание, что если список свойств и методов не появляется, то это значит, что в программе обнаружена ошибка (C++ Builder контролирует правильность набираемого программистом текста в "фоновом" режиме). Например, если в окне редактора кода набрать if Edit1->, то список свойств и методов объекта Edit1 не появится, т. к. инструкция if в данном случае записана с ошибкой (не поставлена открывающая скобка после if). C++ Builder информирует программиста об обнаруженной ошибке сообщением Unable to invoke Code Completion due to errors in source code, которое появляется в нижней части окна редактора кода.
После набора имени встроенной или объявленной программистом функции редактор кода также выводит подсказку: список параметров. Параметр, который в данный момент вводит программист, в подсказке выделен полужирным. Например, если набрать слово FloatToStrF, которое является именем функции преобразования дробного числа в строку символов, и открывающую скобку, то на экране появится окно, в котором будет указан список параметров функции (рис. 26).
Рис. 22. Пример подсказки
Навигатор классов
Окно редактора кода разделено на две части (рис. 27). В правой части находится текст программы. Левая часть, которая называется навигатор классов (ClassExplorer), облегчает навигацию по тексту (коду) программы.
Рис. 27. Окно ClassExplorer облегчает навигацию по тексту программы
В иерархическом списке, структура которого зависит от проекта, над которым идет работа, перечислены объекты проекта (формы и компоненты) и функции обработки событий. Выбрав элемент списка, можно быстро перейти к нужному фрагменту кода, например к функции обработки события.
Окно навигатора классов можно закрыть обычным образом. Если окно навигатора классов не доступно, то для того чтобы оно появилось на экране, нужно в меню View выбрать команду ClassExplorer.
Шаблоны кода
В процессе набора текста удобно использовать шаблоны кода (Code Templates). Шаблон кода — это инструкция программы, записанная в общем виде. Например, шаблон для инструкции if выглядит так: