Основы программирования (947332), страница 65
Текст из файла (страница 65)
Начинаем с объектной декомпозиции интерфейсной и предметной частей приложения. Интерфейсная часть включает только Окно приложения. Предметная - объект Число, который отвечает за инициализациючисла и возведение его в квадрат (рис. П5.3).При анализе реализуемыхСозда1ь ^^ функций учтем, что при вводе чиВычислить J^^^ ВОЗМОЖНЫ ошибки. СлсдоваI"^^^тельно, необходим интерфейс сУничтожить-('VРис.
П5.3. Объектная декомпозиция396IJтремя основными состояниями:Ввод числа, Демонстрация результата и Демонстрация сообще-ПриложениеOKДемонстрация]сообщенияВвод Enter[Число введеноневерно]Нормальное выполнениеВводчислаСледующееВвод Enter[Число введеноверно]Демонстрация]результатаВыходРис.
П5.4. Диаграмма переходов состояний интерфейсания об ошибке (рис. П5.4). Из двух первых состояний необходимо обеспечить возможность выхода, поэтому объединим их в дополнительное состояние - Нормальное выполнение.П р о е к т и р о в а н и е и н т е р ф е й с а . Основное окно приложения проектируем, используя средства визуальной среды Delphi (рис. П5.5),аналогично тому, как это было сделано в предыдущем примере.
Затем уточняем внешний вид приложения в каждом из состояний интерфейса (рис.П5.6): определение жестких ограничений на действия пользователя позволяет избежать некорректной работы программы в условиях событийного программирования.Используя Инспектор объектов, определяем имена объектов (по умолчанию Delphi, как было показано в предыдущем примере, называет объекты,используя имя компонента и номер объекта, что неудобно, если разных компонентов включается в форму много) и значения некоторых свойств:»1Я»^^^||^ш^яешTButtonTLabelTEditTBevelРис. П5.5.
Проектирование формы основного окна приложения397ПриложениеРяИИМ^ИшШ^ШЯИнЁз!яЮйЯШшвИШ!^3]^^ЙГ^'-ЧИ€;йО>;:.-:/"*:-1Г^ iii»ii»>w»>it>'^>ijiiii>^;^i./Ir^>.l...>..-l;l.'>:'.S'.J:..^...^....'^I;I-''5^;<[ij 625^'лЖШШ^:|й!Яу:|РвшШШШшШМШвиЕ!•;B^«fte-4MCif10^Рис. П5.6.
Интерфейс приложения «Возведение числа в квадрат»:а - ввод числа (исходное состояние); б - демонстрация результата;в - демонстрации сообщения об ошибкеForml - главная форма приложения:Name: MainForm ~ имя объекта-формы;Caption: 'Возведение числа в квадрат' - заголовок окна;Labell ~ первая метка:Name: InputLabel - имя объекта-метки;Caption: 'Введите значение' ~ текст метки;Label2 - вторая метка:Name: OutPutLabel - имя объекта-метки;Caption: 'Квадрат значения равен:' - текст метки;Editl - первый однострочный редактор:Name: InputEdit ~ имя объекта-редактора;Edit2 - второй однострочный редактор:Name: OutPutEdit - имя объекта-редактора;398ПрилоэюениеEnable: false - запрет активизации редактора пользователем;Readonly: true - запрет ввода текста в редактор;Button 1 - первая кнопка:Name: NextButton ~ имя объекта-кнопки;Caption: 'Следующее' - название кнопки;Button2 - вторая кнопка:Name: ExitButton - имя объекта-кнопки;Caption: 'Выход' - название кнопки.Проектирование объекта предметной области.Анализ взаимодействия объектов, полученных в процессе объектнойдекомпозиции показывает, что класс TNumber для реализации объекта Число должен включать поле Num для хранения введенного значения, конструктор и метод определения квадрата числа.
Деструктор он может наследоватьот класса TObject. Полная диаграмма классов приложения показана нарис. П5.7 (серым выделены стандартные классы Delphi). Классы TMainFormи TNumber связаны отношением ассоциации, так как класс формы посылаетклассу объекта сообщения.Р е а л и з а ц и я . Описание класса TNumber и его методов целесообразно поместить в специальном модуле:Unit UnitNumber;InterfaceTypeTNumber=class(TObject)private Num:single;public Constructor Create(aNum:single);Function SqrNumber:single;end;-;-'.-^'.';jV 'Sp¥0^- 1^ATMainFormШш^^:;М,—-оЩ^ШШ:ТТРодаMainFormActivateInputEditKeyPressedNextButtonClickExitButtonClickTNumber 1Управляет •NumCreate()Sqr( )Destroy()11Ш1Ши11Рис.
П5Л. Ди?1грамма классов приложения399ПриложениеVar N: TNumber;ImplementationConstructor TNumber. Create(aNum:single);begininherited Create;Num:=aNum;end;Function TNumber.SqrNumber:single;begin Result: ^Sqr(Num);end;end.В секции реализации модуля MainForm указываем использованиемодуля UnitNumber.О б р а б о т ч и к и с о б ы т и й . Привязываем проектируемые события,указанные на диаграмме переходов состояний интерфейса, к событиям, обрабатываемым визуальными компонентами, и описываем необходимые действия приложения (табл. П5.1).Т а б л и ц а П5.1РеальныесобытияЗапускприложенияСобытия компонентовДействияНастройка интерфейсаMainForm: On Activate получение окном управления ввод числа (рис. П5.6, а)Ввод цифрнаОбрабатывается компонентомTEdit автоматическиЕсли введено не число, то выВвод Enter IInputEdit: OnKeyPressedводсообщенияоб ошибке (рис.j ввод алфавитно-цифровой инП5.6,б),иначесоздание объекта1 формации в окно компонентаЧисло,генерациязапросао квадраредактированияте числа, вывод результата (рис.П5.6, в) и уничтожение объектаjЩелчок поI кнопке ОКОбрабатывается окном сообщения автоматически1 Щелчок поNextButton: OnClick:кнопке Следу- щелчок мышью по кнопкеI ющееНастройка интерфейсаввод числа (рис.
П5.6, а)IЩелчок поExitButton: OnClicki кнопке Выход щелчок мышью по кнопке400Завершение приложениянаПриложениеПоследовательно выделяем компоненты, выбираем в списке событийEvents Инспектора объектов нужные события и дважды щелкаем мышью начистом поле рядом с ними. В результате создаются заготовки обработчиковсобытий, в которые необходимо вписать соответствующие фрагменты программы. В конечном итоге получаем полный текст модуля MainForm, приведенный ниже (операторы, вводимые программистом, выделены полужирнымшрифтом).Unit MainForm;InterfaceUses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls; {модули Delphi}TypeTMainForm= class(TForm){oimcdLUHQ формы - создано автоматически}InputLabel: TLabel; OutputLabel: TLabel; {метки}Input Edit: TEdit;Output Edit: TEdit;{редакторы}NextButton: TButton; ExitButton: TButton; {кнопки}Bevell: TBevel;{рамка}procedure FormActivatefSender: TObject);procedure InputEditKey Press (Sender: TObject; var Key: Char);procedure NextButtonClick(Sender: TObject);procedure ExitButtonClick(Sender: TObject);end;Var MainForm: TMainForm; {объект-создано автоматически }Implementationuses UnitNumber; {описание класса TNumber}{$R \DFM}Procedure TMainForm.FormActivate(Sender: TObject);beginOutputEdit Visible:=false; {сделать редактор вывода невидимым}OutputLabeLVisible:=false; {сделать метку вывода невидимой}NextButton.Enabled:=false; {слипать кнопку Следующийнедоступной}InputEdit.
Clear;{очистить редактор ввода}InputEdit.ReadOnfy:=false; {разрешить ввод}InputEditSetFocus;{установить фокус ввода на редактор ввода}end;Procedure TMainForm.InputEditKeyPress(Sender: TObject; var Key: Char);Var k:single; Codennteger;beginifKey-=#13 thenbeginKey:=#0; {чтобы не выдавался звуковой сигнал}401ПрилоэюениеVal(InputEdit. Text,k,Code);if Code-0 thenbeginN:-TNumber.Create(strtofloat(InputEdit.Text)); {создать объект}OutPutEditText:'=floattostr(N.SqrNumber); {вывести результат}KDestroy; {уничтожить объект - деструктор TObject}OutPutEditVisible:-true; {сделать редактор вывода видимым}OutputLabel,Visible:=true; {сделать метку вывода видимой}InputEdit.ReadOnly:-true; {запретить ввод}NextButton.Enabled:=true; {сделать кнопку Следующийдоступной}NextButtonSetFocus; {установить фокус ввода на кнопкуСледующий}endelse {вывести сообщение об ошибке}MessageDlgCCmpoKu codep:>/€um недопустимые символы',mtErrorJmbOkJyO)end;end;Procedure TMainForm.NextButtonClick(Sender: TObject);beginFormActivate(NextButton); end; {вызываем метод}Procedure TMainForm,ExitButtonClick(Sender: TObject);begin Close; end; {закрываем окно и завершаем приложение}End,Основную программу приложения - проект Delphi формирует автоматически:Program ProectXQ;UsesForms,MainFormUnit in 'MainFormUnit.pas', {Mainform}UnitNumber in 'UnitNumber.pas';{$R *.RES}BeginApplication.Initialize; {инициализация объекта Приложение}Application.CreateFormfTMainForm, MamForw);{создание формы}Application,Run;{запуск цикла обработки сообщений}End.Чтобы лучше показать возможности среды, в качестве третьего примерарассмотрим, как можно реализовать в Delphi уже знакомый нам пример сзаписной книжкой (см.