Проектирование объекта предметной области.

Анализ взаимодействия объектов, полученных в процессе объектной декомпозиции показывает, что класс TNumber для реализации объекта «Число» должен включать поле Num для хранения введенного значения, конструктор и метод определения квадрата числа. Деструктор он может наследовать от класса тоь j ect. Полная диаграмма классов приложения показана на рис. 12.4 (серым выделены стандартные классы Delphi). Классы TMainForm и TNumber связаны отношением ассоциации, так как класс формы посылает классу объекта сообщения.

Описание класса TNumber и его методов целесообразно поместить в специальном модуле:

Unit UnitNumber;

Interface

Type

TNumber=class(TObject) private Num:single;

public Constructor Create(aNum:single);

Function SqrNum:single;

end;

Var N:TNumber;

Implementation

Constructor TNumber.Create(aNum:single); begin

inherited Create;

Num:=aNum;

end;

Function TNumber.SqrNum:single; begin

Result:=Sqr(Num); end; end.

В секции реализации модуля MainForm указываем использование модуля UnitNumber, в котором описан класс TNumber.

Обработчики событий. Привязываем проектируемые события, указанные на диаграмме переходов состояний интерфейса, к событиям, обрабатываемым визуальными компонентами, и описываем необходимые действия приложения (табл. 12.2).

Привязка событий к выполняемым действиям

Таблица 12.2

Реальные

события

События

компонентов

Выполняемые

действия

Запуск приложения

MainForm:

OnActivate — получение окном управления

Настройка интерфейса на ввод числа

Ввод цифр

Обрабатывается компонентом TEdit автоматически

Ввод Enter

InputEdit: OnKeyPressed — ввод алфавитно-цифровой информации в окно компонента редактирования

Если введено не число, то вывод сообщения об ошибке, иначе — создание объекта «Число», генерация запроса о квадрате числа, вывод результата и уничтожение объекта

Щелчок по кнопке ОК

Обрабатывается окном сообщения автоматически

Щелчок по кнопке «Следующее»

NextButton: OnClick— щелчок мышью по кнопке

Настройка интерфейса на ввод числа

Щелчок по кнопке «Выход»

ExitButton: OnClick— щелчок мышью по кнопке

Завершение приложения

Последовательно выделяем компоненты, выбираем в списке событий Events «Инспектора объектов» нужные события и дважды щелкаем мышью на чистом поле рядом с ними. В результате создаются заготовки обработчиков событий, в которые необходимо вписать соответствующие фрагменты программы. В конечном итоге получаем полный текст модуля MainForm, приведенный ниже.

Unit MainForm;

Interface

Uses Windows,Messages,SysUtils,Classes,Forms,Graphics,

Controls,Dialogs,StdCtrls,ExtCtrls;

Type

TMainForm=class(TForm)

InputLabel:TLabel;

OutputLabel:TLabel;

InputEdit:TEdit;

OutputEdit:TEdit ;

NextButton:TButton;

ExitButton:TButton;

Bevel1:TBevel;

procedure FormActivate(Sender:TObject); procedure InputEditKeyPress(Sender:TObject; var Key:Char);

procedure MextButtonClick(Sender:TObject); procedure ExitButtonClick(Sender:TObject); end;

Var MainForm:TMainForm;

Implementation

uses UnitNumber; {описание класса TNumber}

{$R*.DFM)

Procedure TMainForm.FormActivate(Sender:TObject); begin

OutputEdit .Visible :=false; {сделать редактор вывода

невидимым}

OutputLabel. Visible: =f alse; {сделать метку вывода невидимой}

NextButton.Enabled:=false;

InputEdit.Clear;

InputEdit.Readonly:=false;

{сделать кнопку «Следующий» недоступной} {очистить редактор ввода} {разрешить ввод}

InputEdit. SetFocus; {установить фокус ввода на редактор ввода}

end;

Procedure TMainForm.InputEditKeyPress(Sender:TObject; var Key:Char);

Var k:single; Code:integer; begin

if Key=#13 then

begin

Кеу:=#0;

Val(InputEdit.Text,k,Code) ; if Code=0 then

{чтобы не выдавался звуковой сигнал}

begin

N: =TNumber .Create (strtofloat (InputEdit. Text)) ;

{создать объект}

OutPutEdit .Text: =floattostr (N. SqrNum); {вывести

результат}

N. Destroy; {уничтожитьобъект — деструкторTObject}

end

OutPutEdit.Visible:=true;

OutputLabel.Visible:=true;

InputEdit.Readonly:=true; NextButton.Enabled:=true;

NextButton.SetFocus;

{сделать редактор вывода видимым} {сделать метку вывода видимой} {запретить ввод} {сделать кнопку «Следующий» доступной} {установить фокус ввода на кнопку «Следующий»}

else {вывести сообщение об ошибке}

MessageDlg('Строка содержит недопустимые символы',mtError,[mb0k],0)

end;

end;

Procedure TMainForm.NextButtonClick(Sender:TObject); begin

FormActivate (NextButton) ; {вызываем метод}

end;

Procedure TMainForm.ExitButtonClick(Sender:TObject); begin

Close; {закрываем окно и завершаем приложение}

end;

End.

Основную программу приложения — проект Delphi формирует автоматически:

Program ProectXQ;

Uses

Forms,

MainFormUnit in 'MainFormUnit.pas1, {Mainform}

UnitNumber in 'UnitNumber.pas';

{$R*.RES)

Begin

Application. Initialize; {инициализация объекта

«Приложение»}

Application.CreateForm(TMainForm,MainForm); {создание формы} Application. Run; {запуск цикла обработки сообщений}

End.

Виртуальные методы класса.

Изменилось описание виртуальных методов: только самый первый виртуальный метод в иерархии описывается virtual, все методы, перекрывающие его, описываются с директивой override. Если для некоторого класса объявляется деструктор, то он описывается с директивой override, так как деструктор класса TObject является виртуальным.

Для описания абстрактных методов класса в объектной модели Delphi используют специальную директиву abstruct, например:

Туре

TNumber=class(TObject)

public Procedure Print; virtual; abstruct;

end;

TIntNumber=class(TNumber) private i:integer;

public Constructor Create(ai:integer);

Procedure Print; override;

end;

Кроме этого в объектной модели Delphi Pascal появился целый ряд новых возможностей и средств [5]:

  • • динамические и абстрактные полиморфные методы;
  • • свойства (простые, массивы, индексные);
  • • средства реализации делегирования методов;
  • • метаклассы;
  • • перегрузка методов;
  • • исключения и т.п.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >