5. Запрограмуйте блимання повідомлення „Обов’язково
натисніть на кнопку Готово після розміщення малюнків !!!”.
Двічі клацніть на першому таймері (Timer1) і запрограмуйте блимання повідомлення так:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Label1.Visible=True then Label1.Visible:=False else Label1.Visible:=True;
end;
6. Введіть описи глобальних констант та змінних програми.
Для цього перед розділом реалізації implementation додайте такий програмний код:
const k=4; {Кількість оновлень змісту тесту}
a : array[1..k, 1..3] of string=( {Масив малюнків}
(’car.wmf’, ’money.wmf’, ’bomb.wmf’),
(’coins.wmf’, ’clock.wmf’, ’tennis.wmf’),
(’brick.wmf’, ’building.wmf’, ’champagne.wmf’),
(’dice.wmf’, ’donkey.wmf’, ’door.wmf’));
b : array[1..k, 1..3] of string=( {Масив слів}
(’money’, ’car’, ’bomb’), (’tennis’, ’clock’, ’coins’),
(’building’, ’champagne’, ’brick’), (’dice’, ’door’, ’donkey’));
{Таблиця відображення масиву малюнків у масив слів. Число – номер малюнка до слова}
check : array[1..k, 1..3] of integer=((2, 1, 3), (3, 2, 1), (3, 1, 2), (1, 3, 2));
var Form1 : TForm1; {Цей рядок вже є в заготовці модуля}
i, score : integer;
shiftX, shiftY : integer;
left1, left2, left3 : integer;
top1, top2, top3 : integer;
7. Збережіть створену на даний момент форму у своїй папці.
Для цього виберіть команду головного меню File – Save All (Зберегти Все) або натисніть на кнопку Save All панелі інструментів. У першому рядку вікна, яке з’явиться (Save Unit1 As) під заголовком Save in: (Зберегти в:), за допомогою випадаючого меню виберіть ім’я робочого диска, після чого знайдіть і відкрийте свою власну папку. Задайте назву для файлу тексту програми, попередньо знищивши запропоновану комп’ютером назву Unit1.pas, PRGRM28.pas Þ Save. У наступному вікні Save Project1 As дайте назву файлові проекту, стерши запропоновану комп’ютером назву Project1.dpr, PRJCT28.dpr Þ Save. У подальшому періодично, зокрема перед черговими запусками проекту на виконання, зберігайте файли програми (File – Save All, вводити імена файлів вже не потрібно).
8. Запрограмуйте процедури: створення форми FormCreate,
вставляння у неї малюнків SetPicture, виведення інформації
про результат тесту Information та кнопку BitBtn2.
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0; {Номер оновлення змісту тесту}
score:=0; {Набрані користувачем бали }
{Зберігаємо початкові координати лівих верхніх кутів трьох малюнків у формі}
left1:=Image1.Left; left2:=Image2.Left; left3:=Image3.Left;
top1:=Image1.Top; top2:=Image2.Top; top3:=Image3.Top;
SetPicture; end; {Процедура і-го вставляння малюнків}
procedure SetPicture;
begin
{Доки малюнки не розташовані правильно – кнопка „Готово” недоступна}
Form1.BitBtn1.Enabled:=False;
i:=i+l; {Збільшуємо номер серії малюнків}
if i > = k+1 then Information
{Якщо тест закінчено, то виводимо результати (процедура Information)}
else {Інакше}
begin
Form1.Label2.Caption:=b[i, 1]; {Оновлюємо слова}
Form1.Label3.Caption:=b[i, 2];
Form1.Label4.Caption:=b[i, 3];
Form1.Image1.Picture.LoadFromFile(a[i, 1]); {Оновлюємо малюнки}
Form1.Image2. Picture.LoadFromFile(a[i, 2]);
Form1.Image3. Picture.LoadFromFile(a[i, 3]);
{Оновлюємо індикатор часу на 100%}
Form1.Gauge1.Progress:=Form1.Gauge1.MaxValue;
{Розташовуємо малюнки під фігурами}
Form1.Imagel.Left:=left1; Forml.Image2.Left:=left2;
Form1.Image3.Left: =left3; Form1.Imagel.Top:=top1;
Form1.Image2.Top: =top2; Form1.Image3.Topr:=top3;
end; end;
procedure Information;
begin
{Зупиняємо обидва таймери}
Form1.Timer1.Enabled:=False; {Зупиняємо блимання Label1}
Forml.Timer2.Enabled:=False; {Зупиняємо рух індикатора часу}
{Результат тесту приводимо до 100 балів}
score:=(score*l00) div k;
{Якщо результат > 90 – зчитуємо файл гучного аплодування}
if score > 90 then Form1.MediaPlayer1.FileName:=’applause.wav’;
{Якщо результат між 70 і 90 – зчитуємо файл легкого аплодування}
if (score > 70) and (score < 90) then Form1.MediaPlayer1.FileName:=’clap.wav’;
{В інших випадках файл не зчитується і аплодування не буде}
Form1.MediaPlayer1.Open; {Відкриваємо мультимедійний плеєр}
Form1.MediaPlayer1.Play; {Відтворюємо звук}
{Відкриваємо вікно повідомлення „Ви набрали # # балів зі 100”}
MessageDlg(’Bи набрали’ + IntToStr(score) + ’балів зі 100’, mtInformation, [mbOk], 0);
{Після клацання на кнопці „Ok” інформаційного вікна}
Form1.Close; end; {Закриваємо вікно програми – закінчуємо роботу}
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Information; end;
Процедури Information і SetPicture не є методами класу Form1. Тому зміна властивостей будь-яких об’єктів форми відбувається в них шляхом явного зазначення імені форми Form1 перед іменем відповідного об’єкта. Декларації процедур Information і SetPicture вставте між описом типу TForm1 і розділом під’єднаних модулів uses:
procedure Information;
procedure SetPicture;
9. Забезпечте перетягування першого малюнка (Image1) на формі,
запрограмувавши опрацювання таких трьох подій для об’єкта Image1: OnMouseDown (якщо натиснути мишу), OnMouseMove (якщо
переміщати мишу) та OnMouseUp (якщо відпустити мишу).
Для заповнення заготовок наведених процедур скористайтесь закладкою Events вікна інспектора об’єктів першого малюнка.
procedure TForm1.Image1MouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{Тимчасова змінна Tag об’єкта Image1=1, якщо клавіша миші в цей момент натиснута}
Image1.Tag:=l;
{Запам’ятовуємо координату (Х; У) точки клацання мишею всередині малюнка}
shiftY:=Y; shiftX:=X; end;
procedure TForm1.Image1MouseMove(Sender: TObject;
Shift: TShiftState; X,Y: Integer);
begin
if Image1.Tag=l then {Якщо натиснута клавіша миші}
begin
{Змінюємо координати малюнка на величину зміни координати вказівника
миші (X;Y) з урахуванням його зміщень всередині малюнка shiftX, shiftY}
Image1.Top:=Image1.Top+Y–shiftY; Image1.Left:=Image1.Left+X–shiftX;
end; end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image1.Tag:=0; {Запам’ятовуємо, що клавіша миші відпущена}
end;
Зверніть увагу, що програма не перевіряє, на яку саме клавішу миші натиснув користувач, і тому перетягування можна здійснювати довільною клавішею. Перевірити клавіші миші можна, проаналізувавши аргумент Button (типу TMouseButton) наведених процедур: Button={mbLeft (ліва клавіша), mbRight (права), mbMiddle (середня)}. Координати вказівника миші у пікселях передаються у процедури за допомогою аргументів X і Y типу Integer.
10. Аналогічно запрограмуйте події OnMouseDown, OnMouseMove та OnMouseUp для перетягування двох інших малюнків (Image1, Image2).
11. Створіть ще один метод форми Form1 – функцію ImageInShape
для перевірки розташування малюнка (об’єкта Image) всередині
деякої геометричної фігури (об’єкта Shape).
function TForm1.ImageInShape(Image: TImage; Shape: TShape) : Boolean;
begin
if (Image.Left > = Shape.Left) and (Image.Left+Image.Width < = Shape.Left+Shape.Width) and
(Image.Top > = Shape.Top) and (Image.Top+Image.Height < = Shape.Top+Shape.Height)
then ImageInShape:=True {Малюнок є всередині фігури}
else ImageInShape:=False; end; {Малюнок є поза фігурою}
Функція ImageInShape є методом класу Form1, тому звертання до властивостей будь-яких об’єктів форми Form1 здійснюється безпосередньо за допомогою імені цих об’єктів. Декларацію функції вставте у розділ опису форми type TForm1 у секцію декларацій загальнодоступних процедур після службового слова public:
function ImageInShape(Image: TImage; Shape: TShape) : Boolean;
12. Запрограмуйте кнопку „Готово”, яка перевіряє правильність
розташування малюнків всередині фігур.
procedure TForm1.BitBtn1Click(Sender: TObject);
var check1 ,check2, check3 : integer;
begin
{Де знаходиться перший малюнок ?}
if ImageInShape(Image1, Shape1) then check1:=1; {В 1-ій фігурі}
if ImageInShape(Image1, Shape2) then check1:=2; {В 2-ій фігурі}
if ImageInShape(Image1, Shape3) then check1:=3; {В 3-ій фігурі}
{Де знаходиться другий малюнок ?}
if ImageInShape(Image2,Shapel) then check2:=l; {В 1-ій фігурі}
if ImageInShape(Image2,Shape2) then check2:=2; {В 2-ій фігурі}
if ImageInShape(Image2,Shape3) then check2:=3; {В 3-ій фігурі}
{Де знаходиться третій малюнок ?}
if ImageInShape(Image3,Shapel) then check3:=1; {В 1-ій фігурі}
if ImageInShape(Image3,Shape2) then check3:=2; {B 2-ій фігурі}
if ImageInShape(Image3,Shape3) then check3:=3; {B 3-ій фігурі}
{Якщо малюнки розташовано правильно, то рахуємо вдалі спроби}
if (check[i, l]=check1) and (check[i, 2]=check2) and (check3=check[i, 3])
then score:=score+1;
SetPicture; end; {Встановлюємо нові малюнки}
13. Запрограмуйте другий таймер, який забезпечує доступність кнопки „Готово” лише у випадку правильного розташування всіх малюнків
у відведених прямокутниках та індукує час зі швидкістю, обернено пропорційною до числа в SpinEdit1.
У випадку, коли користувач не встиг розташувати малюнки у прямокутниках і натиснути на кнопку „Готово” за належний час, подається звуковий сигнал, спроба не зараховується, і відбувається перехід до наступної серії малюнків.
procedure TForml.Timer2Timer(Sender: TObject);
begin
Timer2.Interval:=SpinEdit1.Value*100; {Задаємо швидкість руху індикатора}
{Якщо один із малюнків є в першому прямокутнику}
if ( ImageInShape(Image1, Shape1) or ImageInShape(Image2, Shape1)
or ImageInShape(Image3, Shape1) ) and
{і один із малюнків є в другому прямокутнику}
( ImageInShape(Image1, Shape2) or ImageInShape(Image2, Shape2)
or ImageInShape(Image3, Shape2) ) and
{і один із малюнків є в третьому прямокутнику}
( ImageInShape(Image1, Shape3) or ImageInShape(Image2, Shape3)
or ImageInShape(Image3, Shape3) )
then BitBtn1.Enabled:=True; {то кнопка „Готово” стає доступною}
Gauge1.Progress:=Gauge1.Progress–l; {Працює індикатор часу}
if Gauge1.Progress=0 then
{Якщо час вичерпано, подаємо звуковий сигнал та міняємо серію малюнків}
begin
MediaPlayer1.FileName:=’ding.wav’; MediaPlayer1.Open;
MediaPlayer1.Play; SetPicture; end; end;
14. Збережіть виконану на даний момент роботу у своїй папці.
Для цього виконайте команду: File – Save All.
15. Скопіюйте музичні файли ding.wav, applause.wav та clap.wav у свою робочу папку з папки С: \ Windows \ Media \ Office.
16. Скопіюйте малюнки car.wmf, money.wmf, bomb.wmf, coins.wmf, clock.wmf, tennis.wmf, brick.wmf, building.wmf, champagne.wmf, dice.wmf, donkey.wmf, door.wmf у свою робочу папку з папки С: \ Program Files \ Microsoft Office \ Clipart \ Popular.
17. Запустіть створену програму і дослідіть її роботу.
Запустити програму на виконання можна декількома способами: виконати команду Run – Run головного меню; клацнути на кнопці Run панелі інструментів; натиснути на функціональну клавішу F9. Перетягуйте мишею малюнки всередину відповідних фігур.
18. Створіть exe – файл програми.
Виконайте команду головного меню Project – Build All.
19. Вийдіть із середовища Delphi та запустіть створену програму.
Запустіть exe – файл з іменем проекту зі своєї власної папки.
20. Продемонструйте створений проект викладачеві.
21. Закрийте всі відкриті вікна. Завершіть роботу. Здайте звіт.
Контрольні запитання:
1. Яким чином можна створити новий проект у середовищі Delphi ?
2. Яким чином можна зберегти проект у середовищі програмування Delphi ?
3. Яким чином можна виконати компіляцію проекту в Delphi ?
4. Що представляє собою редактор коду програми середовища Delphi ?
5. Що представляє собою наступний об’єкт середовища Delphi: BitBtn ?
6. Що представляє собою наступний об’єкт середовища Delphi: SpinEdit ?
7. Що представляє собою наступний об’єкт середовища Delphi: Image ?
8. Що представляє собою наступний об’єкт середовища Delphi: Shape ?
9. Що представляє собою наступний об’єкт середовища Delphi: Gauge ?
10. Що представляє собою наступний об’єкт середовища Delphi: MediaPlayer ?
11. Що представляє собою наступний об’єкт середовища Delphi: Timer ?
12. Що представляє собою наступний об’єкт середовища Delphi: ProgressBar ?
13. Які властивості має наступний об’єкт середовища Delphi: SpinEdit ?
14. Які властивості має наступний об’єкт середовища Delphi: Shape ?
15. Які властивості має наступний об’єкт середовища Delphi: Gauge ?
16. Які властивості має наступний об’єкт середовища Delphi: Timer ?
17. Які властивості має наступний об’єкт середовища Delphi: BitBtn ?
18. Як можна змінювати властивості об’єктів (компонентів) у Delphi ?
19. Яким чином можна реалізувати цикли у мові Object Pascal ?
20. Які стандартні події виникають під час роботи у середовищі Delphi ?
Студенти повинні знати:
1. загальну характеристику середовища візуального програмування Delphi;
2. основні принципи роботи у середовищі візуального програмування Delphi;
3. загальну характеристику компонентів середовища Delphi;
4. основні принципи побудови навчальних програм та їх алгоритмів;
5. оператори, операції, типи даних та стандартні
процедури і функції мови програмування Object Pascal;
6. стандартні події і властивості компонентів середовища Delphi,
їх призначення та основні принципи використання.
Студенти повинні вміти:
1. працювати у середовищі візуального програмування Delphi;
2. ефективно використовувати основні інструменти середовища
програмування для роботи у Delphi з проектами та компонентами;
3. здійснювати вибір необхідних компонентів для побудови проекту;
4. ефективно використовувати властивості компонентів
при роботі з проектами у середовищі програмування Delphi;
5. створювати, редагувати, виконувати тестування та
налагодження навчальних програм (проектів)
у середовищі візуального програмування Delphi.
Порядок оформлення звіту:
Звіт повинен складатися з наступних частин:
1. Тема роботи.
2. Мета роботи.
3. Хід роботи.
4. Висновки до роботи.
Практична робота №29
Створення власних об’єктів у середовищі Delphi.
Мета: Навчитися користуватися основними елементами інтерфейсу середовища програмування Delphi для побудови, редагування, налагодження та виконання програм (проектів) для створення об’єктів і роботи з ними.
Прилади, обладнання та інструменти:
Для виконання практичної роботи використовується ПК з наступним програмним забезпеченням: операційна система Windows XP; середовище Delphi.
Теоретичні відомості:
Опис гри:
Суть гри полягає у стрільбі в ціль, яка хаотично рухається по мішені, що являє собою десять концентричних кіл. Ціллю є прямокутник із заокругленими кутами, який може вийти із зони стрільби (за край мішені). Постріл здійснюється натисканням на клавішу Enter чи клацанням мишею, після чого засвічується випадкова точка в певному околі відносно центру цілі. Після кожного влучення у прямокутник гра призупиняється і програма інформує гравця про влучення. Після виходу прямокутника за межі зони стрільби гра припиняється і гравець отримує повідомлення про сумарну кількість влучень у ціль.
Останні версії мови Pascal і мова програмування Object Pascal, що використовується у системі візуального програмування Delphi дають можливість опрацьовувати новий тип даних – об’єкти. З об’єктами асоціюються такі поняття: інкапсуляція, успадкування, поліморфізм.
Інкапсуляція Ідея об’єкта полягає в об’єднанні даних і алгоритмів їх опрацювання. Дані називаються полями об’єкта, алгоритми – методами, а власне об’єднання – інкапсуляцією. Методи призначені для опрацювання полів і зовнішніх даних, власне вони реалізують ідею об’єкта. Створення нового об’єкта аналогічне до створення нового запису:
type < назва об’єкта > = object
< специфікатор доступу >
< поля об’єкта 1> : < тип полів 1 >;
< поля об’єкта N> : < тип полів N >;
< декларації методів об’єкта >; end;
Методами об’єкта є функції та процедури, які визначені для полів чи зовнішніх змінних. Є такі специфікатори доступу до них: private – доступність лише для методів об’єкта; protected – доступність лише для методів об’єкта та методів похідних об’єктів; public – доступність для всіх зовнішніх функцій. В описі об’єкта специфікатор доступу може бути не зазначений. Тоді активним вважається специфікатор private, доки явно не заданий інший. Директива private дає доступ до полів і методів об’єкта іншим методам цього об’єкта і зовнішнім процедурам лише того самого модуля чи програми. Директива public забезпечує доступність елементів об’єкта для процедур з інших модулів. Компоненти, описані як protected, доступні лише для методів цього об’єкта і його нащадків.
Процедуру створення об’єкта називають конструктором і замість службового слова procedure використовують слово constructor. У більшості випадків конструктор має назву Create. Конструктор створює екземпляр об’єкта і заповнює його поля конкретними значеннями.
Методи об’єктів описують у розділі реалізацій implementation так:
procedure < назва об’єкта > . < назва методу > (< список формальних параметрів >);
begin < тіло методу > end ;
У розділі implementation опису методів певного об’єкта виклик інших методів цього ж об’єкта здійснюється лише за ім’ям, без зазначення назви об’єкта. Водночас виклик методу із зовнішньої процедури здійснюється лише за допомогою команди доступу „ . ” (крапка) так:
< назва об’єкта > . < назва методу > (< список фактичних параметрів >);
Змінну типу об’єкт оголошують у розділі оголошення змінних:
var < назва змінної > : < назва об’єкта >;
До даних типу об’єкт, як і до записів, можна застосовувати команду приєднання with: with < назва об’єкта > do < оператор >;
Успадкування Об’єкти володіють властивістю успадкування, яка забезпечує використання об’єктом-нащадком (надалі – похідним об’єктом) полів і методів базового об’єкта (предка, батьківського об’єкта). Успадковування здійснюється так:
type < назва нащадка > = object (< назва батьківського типу >)
< додані поля об’єкта > : < тип полів >;
< декларації доданих і перевизначених методів >; end;
Таблиця, для визначення можливості доступу до елементів похідного об’єкта:
доступ у базовому об’єкті
| специфікатор доступу успадкування
| доступ у похідному об’єкті
|
public
| public
| public
|
private
| public
| недоступний
|
protected
| public
| protected
|
public
| private
| private
|
private
| private
| недоступний
|
protected
| private
| private
|
Кожний об’єкт може мати довільну кількість нащадків, що дає змогу створювати ієрархічні дерева успадкування.
Поліморфізм Поліморфізм – це можливість використовувати однакові імена для методів різних об’єктів (по лінії предок-нащадок). Нащадок може „ перекривати ” деякі методи предка, і тоді методи з однаковими іменами для різних об’єктів виконуватимуться по-різному. У програмному коді успадкованого об’єктного методу, який перевизначається, виклик батьківського методу здійснюється за допомогою службового слова inherited (успадкований) так:
inherited < назва методу > (< список фактичних параметрів >);
Виклик успадкованого методу без зазначення назви методу та параметрів „ inherited; ” означає, що викликається батьківський метод з тим же набором фактичних параметрів, що і в методі, з якого відбувається виклик. Виклик батьківського методу можна здійснити і явним способом із зазначенням назви методу:
< назва об’єкта > . < назва методу > (< список фактичних параметрів >).
Аналіз задачі та побудова об’єктів
Для реалізації точки створимо об’єкт TPoint, який міститиме компонент середовища Delphi типу TShape, його координати і такі методи: засвічування, гасіння і переміщення точки. Змінна типу TShape реалізує точку, якщо вона задає коло з радіусом в один піксель. Тому опис об’єкта TPoint має такий вигляд:
TPoint = object
private
х, у : integer; {координати}
figure : TShape;
public
constructor Create(a, b : integer; owner : TWinControl);
{ініціалізує поля координат числами а і b; owner – об’єкт, на якому рисується точка}
procedure Show; {малює точку поточним кольором}
procedure Hide; {витирає точку}
procedure Draw(vis : boolean); virtual;
{віртуальна процедура, яка використовується методами Show і Hide}
procedure Set_Color(color : TColor);
procedure Move(dx, dy : integer); end; {Переміщує точку на dx праворуч і на dy вниз}
Конструктор Create створює екземпляр об’єкта TPoint і заповнює його поля х та у конкретними значеннями. Значення полів об’єкта змінюються лише за допомогою методів. Наприклад, після створення точки змінити її координати можна лише за допомогою методу Move.
Опишемо методи створеного об’єкта:
constructor TPoint.Create(a, b : integer; owner : TWinControl);
begin
figure:=TShape.Create(nil); {створюємо об’єкт TShape}
figure.Parent:=owner; {розміщуємо його на owner}
figure.Visible:=false; {„гасимо” його до виклику методу Show}
х:=а; у:=b; end; {запам’ятовуємо координати}
procedure TPoint.Draw(vis : boolean);
begin
with figure do begin {працюватимемо з властивостями об’єкта figure}
shape:=stCircle; {точка – це коло з радіусом 1 піксель}
brush.Style:=bsClear; {коло всередині, не залите кольором}
width:=2; height:=width; {ширина та висота фігури – 2 пікселі}
left:=х–1; top:=у–1; {координати left та top об’єкта figure
розташовані в її лівому верхньому куті, тому зміщуємося туди від
координат (х; у), заданих як центр кола з радіусом 1 піксель}
visible:=vis; end; end; {засвічуємо чи гасимо точку}
procedure TPoint.Set_Color(color : TColor);
begin
figure.Pen.Color:=color; end; {задаємо колір для figure}
procedure TPoint.Show;
begin
Draw(true); end; {засвічуємо точку – коло з радіусом 1 піксель}
procedure TPoint.Hide;
begin
Draw(false); end; {гасимо точку}
procedure TPoint.Move(dx, dy : integer);
begin
Hide; {гасимо точку}
with figure do begin
x:=x+dx; у:=у+dy; end; {зміщуємо координати точки на dx, dy}
Show; end; {засвічуємо точку на новому місці}
Оголосити й використати екземпляр Point об’єкта TPoint можна так:
var Point : TPoint;
begin
Point.Create(25, 10, Form1); {створюється точка в позиції (25, 10) на Form1}
Point.Show; Point.Move(35, 70); Point.Hide;
{точка Point „засвічується” та переноситься на 35 пікселів праворуч
і 70 пікселів вниз, „гаситься”}
або за допомогою динамічних змінних:
var PointPtr : ^TPoint;
begin
New(PointPtr); PointPtr^.Create(250, 100, Form1);
PointPtr^.Show; PointPtr^.Move(35, 70); PointPtr^.Hide; …
Дві команди New(PointPtr); PointPtr^.Create(250, 100, Form1);
можуть бути замінені однією: New(PointPtr, Create(250, 100, Form1)) .
Команду приєднання можна застосувати так:
with Point do begin Create(100, 100, Panel1); Show; Move(50, –10); end;
Проілюструємо механізм успадковування шляхом створення ієрархічного дерева об’єктів: „коло”, „квадрат”, „прямокутник”, „еліпс”, „заокруглений квадрат”, „заокруглений прямокутник”.

Об’єкт TPoint вибрано батьківським, оскільки він має спільні властивості для всіх графічних об’єктів: координати, методи засвічування, гасіння і руху, які будуть успадковані іншими об’єктами. Квадрат та вписане в нього коло визначається центром (точкою) і радіусом (цілим числом). Тому об’єкти TCircle, TSquare та TRoundSquare як нащадки об’єкта TPoint будуть доповнені полем цілого типу radius. Прямокутники та еліпс визначаються центром (точкою), шириною і висотою. Тому об’єкти TRect, TRoundRect та TEllipse доповнимо цілими полями W і Н для ширини і висоти. Для усіх похідних об’єктів реалізації методів Show, Hide та Move – однакові, тому перевизначати їх не потрібно. Конструктори та методи малювання усіх успадкованих об’єктів різні. Тому їх необхідно перевизначати.
Оголошення і реалізація об’єкта TCircle має вигляд:
TCircle = object(TPoint)
private
radius : integer; {додано поле для радіуса кола}
public
constructor
Create(a, b, c : integer; owner : TWinControl);
procedure Draw(vis : boolean); virtual; end;
{розділ implementation}
constructor Circle.Create(a, b, c ; integer; owner : TWinControl);
begin {викликаємо конструктор базового класу}
inherited Create(a, b, owner);
radius:=c; end; {зберігаємо радіус}
procedure TCircle.Draw(vis : boolean);
begin
inherited;
with figure do begin {координати фігури задаються її лівим верхнім кутом}
left:=х–radius; top:=у–radius; {ширина і висота дорівнюють двом радіусам}
width:=2*radius; height:=width; end; end;
Службове слово inherited у конструкторі означає виклик батьківського конструктора Create, який створює об’єкт figure і надає значення успадкованим полям X і Y. Зауважимо, що його виклик може бути здійснений і командою TPoint.Create(a, b, owner). Директива inherited у процедурі Draw означає виклик батьківської процедури Draw з неявно заданим параметром vis : boolean. Цей виклик можна здійснити одним із трьох способів:
1) inherited; 2) inherited Draw(vis); 3) TPoint.Draw(vis);
Оголошення об’єкта TRoundRect має такий вигляд:
TRoundRect = object(TPoint)
private
w, h : integer;
public
constructor Create(a, b, c, d : integer; owner : TWinControl);