Проектирование объекта предметной области.
Анализ взаимодействия объектов, полученных в процессе объектной декомпозиции показывает, что класс 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]:
- • динамические и абстрактные полиморфные методы;
- • свойства (простые, массивы, индексные);
- • средства реализации делегирования методов;
- • метаклассы;
- • перегрузка методов;
- • исключения и т.п.