
- •1 Компоненты Delphi
- •1.1 Компонент класса TGroupBox
- •1.2 Компонент класса TRadioButton
- •1.3 Компонент класса TRadioGroup
- •1.4 Компонент класса TCheckBox
- •1.5 Компонент класса TListBox
- •1.6 Компонент класса TForm
- •1.7 Компонент класса TImage
- •1.8 Компонент класса TTimer
- •1.9 Компонент класса TImageList
- •1.10 Компоненты классов TActionList и TAction
- •1.11 Компонент класса TMainMenu
- •1.12 Компоненты классов TToolBar и TToolButton
- •1.13 Компоненты класса TStatusBar и TStatusPanel
- •1.14 Компоненты классов TOpenDialog и TSaveDialog
- •1.15 Компонент класса TTreeView
- •2 Примеры выполнения практических заданий
- •2.1 Стандартные алгоритмы
- •2.2 Элементы выбора
- •2.3 Простейшие классы
- •2.4 Графика
- •2.5 Диалоговые окна
- •2.6 Комплексное задание
- •2.7 Наследование
- •2.8 Древовидные структуры

Рисунок 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