ООП. ООП 2лек. Разработка программного кода приложения. События и обработчики событий
Скачать 26.61 Kb.
|
РАЗРАБОТКА ПРОГРАММНОГО КОДА ПРИЛОЖЕНИЯ. СОБЫТИЯ И ОБРАБОТЧИКИ СОБЫТИЙ Приложения, созданные с помощью C++ Builder, – это приложения для Windows.Одним из основных свойств таких приложений является управлениепо событиям. Это означает, что программа выполняется на основе генерируе-мых сообщений о событиях, которые обрабатываются программным кодом приложения. Такой код необходимо написать для каждого события, на которое должна реагировать программа. Процедура, предназначенная для реагирования на какое-либо событие, называется в С++ Builder функцией обработки собы-тия.Выделяются две категории событий:события,обусловленные действия-ми пользователя, – пользовательские события и обычные события – про-граммно-управляемые события. Функции обработки пользовательских событий составляют главную часть кода приложения. Они обеспечивают интерактивное взаимодействие приложе-ния и пользователя. В C++ Builder для этого применяются предварительно оп-ределенные обработчики событий, которые могут использоваться практиче-ски всеми компонентами. Сюда относятся обработчики событий мыши и кла-виатуры. обычным (программно-управляемым) событиям относятся события ак-тивизации, завершения, события изменения состояния отдельных компонентов прочие события, которые являются косвенным результатом действия пользо-вателя. C++ Builder генерирует функции обработки каждого события и дает имимена в соответствии с именами компонентов, для которых эти процедуры предназначены. Например, если дважды щелкнуть по кнопке Button1, в модуле формы будет сгенерирована пустая функция обработки события, которая вы-глядит следующим образом: void __fastcall TForm1::Button1Click(TObject *Sender) { } Далее необходимо вписать нужный программный код в составной блок. Выделите кнопку «Вычислить», перейдите на страницу «Events» в инспек- торе объектов и дважды щелкните по имени обработчика события OnClick. Система добавит в текст модуля пустую функцию обработки щелчка по кноп-ке. Что должна выполнять эта функция? Во-первых, в ней должно считывать-ся содержимое полей ввода коэффициентов a, b и c; далее считанные значения должны быть превращены в числа, поскольку свойство Text компонента Edit имеет строковый тип; затем должны быть выполнены необходимые вычисления и результат помещен в поля Edit4 и Edit5. 17 Добавьте в функцию программный код, приведенный ниже. void __fastcall TForm1::Button1Click(TObject *Sender) { float a,b,c,d,x1,x2; a=StrToFloat(Edit1->Text); b=StrToFloat(Edit2->Text); c=StrToFloat(Edit3->Text); d=b*b-4*a*c; if (d>=0) { x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); Edit4->Text=FloatToStr(x1); Edit5->Text=FloatToStr(x2); } else ShowMessage("Нет действительных корней"); } разделе директив препроцессора модуля формы добавьте строку #include Данный заголовочный файл позволит воспользоваться библиотекой мате- матических функций (в нашем случае – функцией вычисления квадратного корня). Отметим в тексте следующие моменты. Для вычислений мы использовали только локальные переменные, так как их не надо использовать в других процедурах. Для превращения строки символов в число и обратного преобразования используются функции StrToFloat( ) и FloatToStr( ) соответственно. Для выда-чи сообщения «Нет действительных корней» используется функция Windows вызова диалогового окна ShowMessage( ). Определим функцию обработки щелчка по кнопке «Выход». Щелкните дважды по данной кнопке и в появившемся окне редактора кода добавьте в функцию Button2Click строку 18 Form1->Close( ); (Close( ) – метод, закрывающий окно нашего приложения.) Сохраните проект и запустите его на выполнение. Проверьте его работу при различных исходных данных. Если система обнаружит ошибки, устраните их и снова запустите проект на выполнение. Определим теперь события меню и нажатия кнопок на панели инструмен-тов. Для этого нам не понадобится писать никакого кода. Мы свяжем нужные события с уже определенными событиями – щелчками по кнопкам «Вычис-лить» и «Выход». Щелкните по строке меню и затем выберите первый пункт меню «Вычис-лить». В инспекторе объектов на странице «Events» в строке обработчика On-Click в списке имеющихся функций выберите функцию Button1Click.Щелкнитемышью по форме и то же самое проделайте с пунктом меню «Выход», только теперь свяжите его с функцией Button2Click. Выберите пункт меню «Справка», инспекторе объектов дважды щелкните в строке обработчика OnCliсk, в ре-дакторе кодов в функцию N3Click добавьте команду Form2->ShowModal( ); разделе директив модуля главной формы не забудьте добавить директи-ву подключения заголовочного файла модуля справки #include "имя_модуля_справки.h". Здесь имя_модуля_справки – имя, с которым вы сохранили модуль на дис- ке. Метод ShowModal( ) вызывает окно справки, причем пока оно не будет за-крыто, перейти в главное окно приложения не удастся (модальное состояние окна). Выделите кнопку «Вычислить» на панели инструментов и в инспекторе объектов для обработчика OnClick выберите функцию Button1Click; для кнопки Выход – функцию Button2Click. Для кнопки «Справка» создайте процедуру, об- рабатывающую щелчок аналогично тому, как вы сделали это для пункта ме-ню «Справка». Осталось определить работу строки состояния StatusBar1. Выделите ее на форме, перейдите на страницу «Properties» инспектора объектов, найдите свой-ство SimplePanel и присвойте ему значение true. Щелкните дважды по форме и в теле функции FormCreate поместите сле-дующий код: void __fastcall TForm1::FormCreate(TObject *Sender) { StatusBar1->SimpleText="Введите коэффициенты уравнения"; } Сохраните проект и проверьте работу приложения. 19 ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ ПРОГРАММЕ разработанной программе мы не учли возможные ошибки ввода данных. Во-первых, пользователь может ввести последовательность символов, которая не является числом. Во-вторых, пользователь может ввести значение коэффи-циента a = 0, что приведет к попытке деления на ноль в операторах, вычис-ляющих корни уравнения. Обе ситуации называются исключительными. При-мерами других исключительных ситуаций являются переполнение, попытка от-крыть несуществующий файл и т. п. Для контроля за подобными ситуациями в системе C++ Builder существует так называемый механизм обработки исклю-чительных ситуаций. При возникновении исключительной ситуации программа генерирует так называемое исключение и выполнение дальнейших вычислений данном блоке прекращается. Исключение – это объект специального вида, характеризующий возникшую в программе исключительную ситуацию. Осо-бенностью исключений является то, что они сугубо временные объекты. Как только они обрабатываются каким-либо обработчиком, они разрушаются. Если исключение нигде не перехвачено в программе, то оно обрабатывается стан-дартным методом Tapplication.HandleException. Данный метод обеспечивает выдачу пользователю краткой информации в окне сообщений и уничтожение экземпляра исключения. Наиболее кардинальный способ борьбы с исключениями – обработка их с помощью логических блоков try и catch: try { //операторы, которые могут вызвать возникновение исключительной //ситуации } catch (Тип &e) { команды, обрабатывающие данную исключительную ситуацию } Здесь Тип – это тип (класс) исключения. С++ Builder определен целый ряд классов исключений.Рассмотрим дваиз них, нужных в нашей программе: класс EConvertError, связанный c ошибкой преобразования строк или объектов (в частности, в функции StrToFloat), класс EZeroDivdide,связанный с попыткой деления на нуль числа с плавающей запя-той. 20 Измените текст функции Button1Click в соответствии с приведенным ниже текстом. void __fastcall TForm1::Button1Click(TObject *Sender) { float a,b,c,d,x1,x2; try { a=StrToFloat(Edit1->Text); b=StrToFloat(Edit2->Text); c=StrToFloat(Edit3->Text); } catch(EConvertError &e) { ShowMessage("Ошибочные данные!"); return; } d=b*b-4*a*c; if (d>=0) { try { x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); } catch(EZeroDivide &e) { ShowMessage("Коэффициент а не может быть равен нулю!"); return; } Edit4->Text=FloatToStr(x1); 21 Edit5->Text=FloatToStr(x2); } else ShowMessage("Действительных корней нет"); } Сохраните изменения в тексте модуля и проверьте отсутствие ошибок. |