Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Программирование в среде Delphi (Часть 2).pdf
Скачиваний:
89
Добавлен:
27.05.2015
Размер:
1.41 Mб
Скачать

Рисунок 7 – Внешний вид и пример работы программы, реализующей комплексное задание

2.7 Наследование

Задание: Разработать программу, использующую иерархию классов. Базовый класс – функция; базовая функция – расчет; базовый параметр – х. Параметры классов-наследников:

Название

Описание

Дополнительные

Расчетная

 

базового

параметры

функция

 

параметра

 

 

Log10

аргумент

 

S = ln(х)/ln(10)

LogA

функции

a – основание логарифма

S = ln(х)/ln(a)

При вводе данных классов-наследников использовать диалоговые формы. Предусмотреть контроль правильности ввода данных. Обеспечить запрет недопустимых действий. Введенные данные хранить в компоненте класса TListBox. При выборе строки в списке данных в компоненте класса TEdit отображать результат вычисления базовой функции.

Для решения поставленной задачи на основной форме (Main_F) потребуются компоненты:

Spisok_LB класса TListBox для хранения и отображения введенных элементов;

Result_E класса TEdit для вывода результата расчета базовой функции у выбранного элемента;

Select_RG класса TRadioGroup для задания вида добавляемого элемента;

39

Spisok_L класса TLabel для подписи компонента Spisok_LB;

Result_L класса TLabel для подписи компонента Result_E;

Add_B класса TButton для активизации добавления элемента;

Change_B класса TButton для активизации редактирования выбранно-

го элемента;

Del_B класса TButton для активизации удаления выбранного элемента. Установим следующие значения свойств компонентов (таблица 11):

Таблица 11 – Значения свойств компонентов основной формы для примера программы, реализующей работу с иерархией классов

Компонент.Свойство

Значение

Spisok_L.Caption

Спи&сок элементов

Spisok_L.FocusControl

Spisok_LB

 

 

Add_B.Caption

Доб&авить

Change_B.Caption

И&зменить

Del_B.Caption

Уда&лить

Result_E.ReadOnly

True

 

 

Result_L.Caption

Р&езультат

Result_L.FocusControl

Result_E

 

 

Select_RG.Caption

Вид добавляемого элемента

Select_RG.Items

&десятичный логарифм

 

логарифм по &основанию А

Очистим свойство Text у компонента Result_E.

На форме диалогового окна работы с десятичным логарифмом (Log10_F) потребуются компоненты:

X_E класса TEdit для ввода аргумента;

X_L класса TLabel для подписи компонента X_E;

Ok_B класса TButton для подтверждения добавления или редактирова-

ния;

Cancel_B класса TButton для отмены добавления или редактирования. Установим следующие значения свойств компонентов (таблица 12):

Таблица 12 – Значения свойств компонентов диалогового окна для работы с десятичным логарифмом

Компонент.Свойство

Значение

Log10_F.BorderStyle

bsDialog

X_L.Caption

Ар&гумент

X_L.FocusControl

X_E

Ok_B.Caption

Ok

Ok_B.Default

True

Ok_B.ModalResult

mrOk

40

Продолжение таблицы 12

Компонент.Свойство Значение

Cancel_B.Caption Отм&ена

Cancel_B.Cancel True

Cancel_B.ModalResult mrCancel

Очистим свойство Text у компонента X_E.

На форме диалогового окна работы с логарифмом по основанию «А» (LogA_F) потребуются компоненты:

X_E класса TEdit для ввода аргумента;

A_E класса TEdit для ввода основания;

X_L класса TLabel для подписи компонента X_E;

A_L класса TLabel для подписи компонента A_E;

Ok_B класса TButton для подтверждения добавления или редактирова-

ния;

Cancel_B класса TButton для отмены добавления или редактирования. Установим следующие значения свойств компонентов (таблица 13):

Таблица 13 – Значения свойств компонентов диалогового окна для работы с логарифмом по основанию «А»

Компонент.Свойство

Значение

LogA_F.BorderStyle

bsDialog

X_L.Caption

Ар&гумент

X_L.FocusControl

X_E

A_L.Caption

Ос&нование

A_L.FocusControl

A_E

Ok_B.Caption

Ok

Ok_B.Default

True

Ok_B.ModalResult

mrOk

 

 

Cancel_B.Caption

Отм&ена

Cancel_B.Cancel

True

 

 

Cancel_B.ModalResult

mrCancel

 

 

Очистим свойство Text у компонентов X_E, A_E.

Опишем событие OnCloseQuery формы Log10_F:

procedure TLog10_F.FormCloseQuery(Sender: TObject;

var CanClose: Boolean);

var

n : double; begin

{Проверку следует проводить только при нажатии кнопки "Ok"} if ModalResult=mrOk then

try

{Если не удалось перевести введенные данные в число, то

41

перевод фокуса на строку ввода и вызов исключительной ситуации}

if not TryStrToFloat(X_E.Text,n) then begin

X_E.SetFocus;

raise Exception.Create('Аргумент должен быть числом'); end;

{Если число меньше или равно нулю, то перевод фокуса на

строку ввода и вызов исключительной ситуации} if n<=0 then

begin X_E.SetFocus;

raise Exception.Create(

'Аргумент должен быть положительным числом');

end; except

{При возникновении исключительной ситуации блокировка закрытия формы и выдача сообщения об ошибке}

on E: Exception do begin

CanClose := False; ShowMessage(E.Message);

end;

end;

end;

Опишем событие OnShow формы Log10_F:

procedure TLog10_F.FormShow(Sender: TObject); begin

X_E.SetFocus; end;

Аналогично описываются события для формы LogA_F.

Опишем базовый класс TFunction и классы-наследники TLog10 и TLogA в разделе type секции implementation модуля основной формы:

TFunction = class public

X : double; // Базовый параметр

constructor Create(NewX : double); // Конструктор класса function Calc : double; virtual; abstract; //Базовая функция

end;

TLog10 = class(TFunction) public

function Calc : double; override; // Своя базовая функция end;

TLogA = class(TFunction) public

A : double; // Дополнительный параметр

42

constructor Create(NewX,NewA : double); // Свой конструктор function Calc : double; override; // Своя базовая функция

end;

Опишем реализации всех методов классов:

constructor TFunction.Create(NewX: double); begin

inherited Create; // Вызов конструктора родителя (TObject) X := NewX; // Присвоение базовому параметру значения

end;

function TLog10.Calc: double; begin

Result := ln(X)/ln(10); end;

constructor TLogA.Create(NewX, NewA: double); begin

{Вызов конструктора родителя (TFunction)} inherited Create(NewX);

A := NewA; // Присвоение дополнительному параметру значения end;

function TLogA.Calc: double; begin

Result := ln(X)/ln(A); end;

Опишем событие OnClick кнопки Add_B:

procedure TMain_F.Add_BClick(Sender: TObject); var

Func : TFunction; begin

{Определение вида добавляемого элемента} case Select_RG.ItemIndex of

{Работа по добавлению десятичного логарифма}

0: with Log10_F do begin

Caption := 'Добавление Log10'; X_E.Text := '';

if ShowModal=mrOk then begin

{Переменной класса-родителя можно присвоить класс-

потомок. Поэтому используется одна переменная для разных классов}

Func := TLog10.Create(StrToFloat(X_E.Text)); Spisok_LB.Items.AddObject('Log10('+X_E.Text+')',

Func);

end;

end;

43

{Работа по добавлению логарифма по основанию “A”} 1 : with LogA_F do

begin

{Работа с формой}

...;

if ShowModal=mrOk then begin

Func := TLogA.Create(StrToFloat(X_E.Text), StrToFloat(A_E.Text));

Spisok_LB.Items.AddObject('LogA('+X_E.Text+','+ A_E.Text+')',Func);

end;

end;

end;

end;

Опишем событие OnClick кнопки Change_B:

procedure TMain_F.Change_BClick(Sender: TObject); var

Func : TFunction; begin

if Spisok_LB.ItemIndex<>-1 then begin

{Получение объекта, связанного с выбранной строкой,

с использованием переменной базового класса}

Func := Spisok_LB.Items.Objects[Spisok_LB.ItemIndex] as TFunction;

if Func is TLog10 then // Проверка класса объекта {Работа с формой десятичного логарифма}

with Log10_F do begin

Caption := 'Изменение Log10'; X_E.Text := FloatToStr(Func.X); if ShowModal=mrOk then

begin

Func.X := StrToFloat(X_E.Text); Spisok_LB.Items[Spisok_LB.ItemIndex] :=

'Log10('+X_E.Text+')';

{После изменения требуется пересчитать результат} Result_E.Text := FloatToStr(Func.Calc);

end; end

else

{Работа с формой логарифма по основанию “А”} with LogA_F do

begin

...; {Для обращения к дополнительному параметру требуется

приведение типов}

A_E.Text := FloatToStr((Func as TLogA).A);

...;

44

(Func as TLogA).A := StrToFloat(A_E.Text);

...; end;

end else

ShowMessage('Не выбран элемент в списке');

end;

Опишем событие OnClick кнопки Del_B:

procedure TMain_F.Del_BClick(Sender: TObject); begin

if Spisok_LB.ItemIndex<>-1 then begin

{При выполнении удаления производится разрушение объекта,

связанного с выбранной строкой, удаление строки, работа по блокировке недопустимых действий и очистка строки

результата}

...; end else

ShowMessage('Не выбран элемент в списке');

end;

Опишем событие OnClick компонента Spisok_LB:

procedure TMain_F.Spisok_LBClick(Sender: TObject); var

Func : TFunction; begin

{При выборе строки в списке производится разрешение

доступных действий и вывод значения функции для объекта, связанного с выбранной строкой}

...; end;

Опишем событие OnDestroy основной формы:

procedure TMain_F.FormDestroy(Sender: TObject); var

...; begin

{Производится разрушение всех объектов, связанных со строками списка}

...; end;

Внешний вид и пример работы программы показаны на рисунке 8.

45