Основні синтаксичні конструкції мови програмування Object Pascal
Далі буде показано, що робота в популярній інструментальній системі Delphi – не лише налаштування властивостей візуальних компонент, а дещо більше. Для цього потрібно заглибитися в саме ядро Delphi – мову програмування Object Pascal.
Синтаксичні діаграми
Для опису мови програмування Object Pascal користуватимемося синтаксичними діаграмами. Наприклад:
Щоб прочитати синтаксичну діаграму, потрібно слідувати за стрілками. Дуже часто буває так. Шо можливий більше як один шлях. Подана вище діаграма показує, що список формальних параметрів необов”язковий у заголовку процедури. Можна йти від ідентифікатора до кінця заголовку процедури, або ж можна йти до списку формальних праметрів перед тим, як досягнути кінця діаграми.
Надписи у прямокутниках вказують на синтаксичні конструкції. Надписи в овалах – зарезервовані слова. Оператори та знаки пунктуації – це дійсні терми з програм; вони в діаграмах виділені напівтовстим шрифтом.
Тоукени
Тоукени – це найменші значащі одиниці тексту в програмі Object Pascal. Вони поділяються на символи, ідентифікатори, мітки, числа і рядкові константи. Програма на Object Pascal складається з тоукенів та сепараторів. Сепаратор – це або пропуск або коментар. Два суміжні тоукени повинні бути розділені одним або більше сепараторами якщо кожен тоукен є зарезервованим словом, ідентифікатором, міткою або числом. Сепаратори не можуть бути частинами тоукенів за виключенням рядкових констант.
Спеціальні символи
Object Pascal використовує такі підмножини набору символів ASCII:
· Літери—англійський алфавіт від A до Z і a до z
· Цифри—арабські від 0 до 9
· Шістнадцятирічні цифри—арабські цифри від 0 до 9, букви від A до F і від a до f
· Пропуски—символ пропуску (ASCII 32) і всі керуючі символи ASCII (від ASCII 0 до 31), включаючи символи кінця рядка або повернення каретки (ASCII 13)
Далі наводяться синтаксичні діаграми букви, цифри та шістнадцятирічної цифри:
Спеціальні символи та зарезервовані слова – це символи, що мають одне або більше фіксованих значень. Наступні одиничні символи є спеціальними символами:
+ – * / = < > [ ] . , ( ) : ; ^ @ { } $ #
І ці пари символів є також спеціальними символами:
<= >= := .. (* *) (. .)
Ліва квадратна дужка ([) є еквівалентна парі символів лівої круглої дужки і крапки (., а символ (]) еквівалентний .). Подібно символ ({) еквівалентний (*, а (}) – *).
Зарезервовані слова та стандартні директиви
Зарезервовані слова не можуть переозначуватися. Тут вони позначатимуться напівтовстим шрифтом і малими літерами. Object Pascal не є чутливим до до регістру символів (великі-малі букви), отже можна використовувати у ваших програмах як великі так і малі букви.
Далі наводяться зарезервовані слова Obejct Pascal:
Таблиця 1-1 Зарезервовані слова Object Pascal
and
|
exports
|
library
|
set
|
array
|
file
|
mod
|
shl
|
as
|
finally
|
nil
|
shr
|
asm
|
for
|
not
|
string
|
begin
|
function
|
object
|
then
|
case
|
goto
|
of
|
to
|
class
|
if
|
on
|
try
|
const
|
implementation
|
or
|
type
|
constructor
|
in
|
packed
|
unit
|
destructor
|
inherited
|
procedure
|
until
|
div
|
initialization
|
program
|
uses
|
do
|
inline
|
property
|
var
|
downto
|
interface
|
raise
|
while
|
else
|
is
|
record
|
with
|
end
|
label
|
repeat
|
xor
|
except
|
|
|
|
Далі наведені стандартні директиви Object Pascal. Директиви використовуються лише в місцях, де означені споживачем ідентифікатори не мають сили. На відміну від зарезервованих слів стандартні директиви можна переозначати, хоча робити це не рекомендується.
Таблиця 1-2 Директиви Object Pascal
absolute
|
export
|
name
|
published
|
abstract
|
external
|
near
|
read
|
assembler
|
far
|
nodefault
|
resident
|
at
|
forward
|
override
|
stored
|
cdec
|
l
|
index
|
private
|
virtual
|
default
|
interrupt
|
protected
|
write
|
dynamic
|
message
|
public
|
|
|
private, protected, public і published діють як зарезервовані слова в межах декларації типу об”єкту та порядок їх використання відрізняється від директив.
Ідентифікатори
Ідентифікатори позначають константи, типи, змінні, процедури, функції, модулі, програми та поля в записах.
Ідентифікатор може бути довільної довжини та лише перші 63 символи є значащими. Ідентифікатор повинен починатися з букви або символу підкреслення (_) і не може включати пропусків. Після першого символу дозволяється використовувати букви, цифри та символи підкреслення (ASCII $5F). Подібно до зарезервованих слів ідентифікатори не є залежними від регістру символу. Коли існує кілька інстанцій того ж ідентифікатору, буває потрібно кваліфікувати ідентифікатор іншим ідентифікатором, щоб вибрати певну інстанцію. Наприклад, щоб кваліфікувати ідентифікатор Ident ідентифікатором модуля UnitName, пишемо UnitName.Ident. Комбінований ідентифікатор називається уточнюючим ідентифікатором.
Приклади ідентифікаторів звичайних та уточнюючих:
Writeln
Exit
Real2String
System.MemAvail
SysUtils.StrLen
WinCrt.ReadText
Числа
Для чисел, що є константами цілочисельного або дійсного типів використовується звичайне десяткове позначення. Шістнадцятирічні цілочисельні константи використовують в якості префіксу знак долара ($). Інженерне позначення (E або e, за яким стоїть степінь) читається як “помножити на десять в степені” дійсного числа. Наприклад, 7E-2 означає 7 x 10-2; 12.25e+6 або ж 12.25e6 означають 12.25 x 106.
Нижче наведено синтаксичні діаграми для написання чисел.
Числа з десятками або степенями позначають константи дійсного типу. Інші десяткові числа позначають константи цілочисельного типу; вони повинні бути в діапазоні від -2,147,483,648 до 2,147,483,647.
Шістнадцятирічні числа позначають цілочисельні константи; вони повинні бути в діапазоні від $00000000 до $FFFFFFFF.
Мітки
Мітка – це послідовність цифр в діапазоні від 0 до 9999. Перші нулі не сприймаються. Мітки використовуються у реченнях goto.
В розширення до стандартного Pascal, Object Pascal допускає ідентифікатори функцій – мітки.
Рядки символів
Рядок символів – це послідовність символів з розширеного набору символів ASCII, записана в одному рядку програми та заключена в апострофи.
Рядок символів, що нічого не містить між апострофами є нульовим рядком. Два послідовні апострофи в рядку символів позначають один символ апострофу. Наприклад:
‘BORLAND’ { BORLAND }
‘You”ll see’ { You’ll see }
”” { ‘ }
” { null string }
‘ ‘ { a space }
Object Pascal дозволяє впроваджувати символи керувння у рядок символів. Символ #, за яким слідує беззнакова цілочисельна константа в діапазоні від 0 до 255 позначає символ із відповідним значенням коду ASCII. Наприклад:
#13#10
‘Line 1’#13’Line2’
#7#7’Wake up!’#7#7
Коментарі
Наступні конструкції називаються коментарями. Вони ігноруються програмою-компілятором:
{ Any text not containing right brace }
(* Any text not containing star/right parenthesis *)
Коментар, що містить знак долара ($) відразу після відкриваючих символів { або (* є директивою компілятора. Далі за символом $ слідує мнемокод команди компілятора.
Рядки програми
Рядки програми на Object Pascal містять до 126 символів.
Константи
Константа – це ідентифікатор, що позначає значення, що не може змінюватися. Декларація (оголошення) константи оголошує константу в межах блоку, що включає декларацію. Ідентифікатор константи не може використовуватися у її ж власній декларації.
Object Pascal дозволяє використовувати константні вирази. Константний вираз – це вираз, що може бути оцінений, не виконуючи насправді програми. В той час як стандартний Pascal дозволяє лише прості константи, Object Pascal дозволяє константні вирази.
Нижче показані приклади константних виразів:
100
‘A’x
256 – 1
(2.5 + 1) / (2.5 – 1)
‘Borland’ + ‘ ‘ + ‘Pascal’
Chr(32)
Ord(‘Z’) – Ord(‘A’) + 1
Найпростіший приклад константного виразу – це проста константа, така як 100 або ‘A’.
Типи
При оголошенні змінної необхідно вказувати її тип. Тип змінної визначає множину значень, що вона може приймати та на операції, що можуть над нею виконуватися. Декларація (оголошення) типу визначає ідентифікатор, що позначає тип.
Ідентифікатор в лівій частині декларації типу є ідентифікатором типу. Ідентифікатор типу може використовуватися повторно в декларації лише для типів вказівників.
Існує шість головних класів типів. На них ми зупинимося далі.
Прості типи
Прості типи позначають впорядковані множини значень.
Ідентифікатор топу real є одним із стандартним ідентифікаторів: Real, Single, Double, Extended або Comp.
Порядкові типи
Порядкові типи є підмножиною простих типів. Усі прості типи окрім типів дійсних чисел є порядковими. Їм притаманні такі шість рис:
· Усі можливі значення заданого порядкового типу є впорядкованими множинами і кожне можливе значення має порядковий номер, що є цілочисельним значенням. |
|
· Стандартна функція Ord може бути застосована до довільного значення порядкового типу з метою повернення порядкового номера значення. |
|
· Стандартна функція Pred може бути застосована до довільного значення порядкового типу з метою отримання попередника цього значення. |
|
· Стандартна функція Succ може бути застосована до довільного значення порядкового типу з метою отримання наступника цього значення. |
|
· Стандартна функція Low може застосовуватися до ідентифікатора порядкового типу і до посилання змінної порядкового типу. Результатом є найнижче значення діапазону заданого порядкового типу. |
|
· Стандартна функція High може застосовуватися до ідентифікатора порядкового типу і до посилання змінної порядкового типу. Результатом є найвище значення діапазону заданого порядкового типу. |
Синтаксис порядкового типу такий:
Object Pascal має дванадцять попередньо означених порядкових типів: Integer, Shortint, Smallint, Longint, Byte, Word, Cardinal, Boolean, ByteBool, WordBool, LongBool і Char. Існує ще два інші класи порядкових типів, означених споживачем: перечислимі типи та типи піддіапазонів.
Цілочисельні типи
Наперед задані цілочисельні типи Object Pascal діляться на дві категорії фундаментальні типи та породжені типи. Діапазон та формат фундаментальних типів не залежить від мікропроцесора та операційної системи і не відрізняється в різних реалізаціях Object Pascal. Діапазон та формат породжених типів навпаки залежить від мікропроцесора та операційної системи.
Фундаментальними типами є Shortint, Smallint, Longint, Byte і Word.
Таблиця 3-1 Фундаментальні цілочисельні типи
Тип
|
Діапазон
|
Формат
|
Shortint
|
-128..127
|
Signed 8-bit
|
Smallint
|
-32768..32767
|
Signed 16-bit
|
Longint
|
-2147483648..2147483647
|
Signed 32-bit
|
Byte
|
0..255
|
Unsigned 8-bit
|
Word
|
0..65535
|
Unsigned 16-bit
|
Породженими цілочисельними типами є Integer та Cardinal. Тип Integer представляє знакові цілі, а тип Cardinal – беззнакові цілі.
Таблиця 3-2 Породжені цілочисельні типи для 16-бітової реалізації Object Pascal
Tип
|
Діапазон
|
Формат
|
Integer
|
-32768..32767
|
Signed 16-bit
|
Cardinal
|
0..65535
|
Unsigned 16-bit
|
Таблиця 3-3 Породжені цілочисельні типи для 32-бітової реалізації Object Pascal
Tип
|
Діапазон
|
Формат
|
Integer
|
-2147483648..2147483647
|
Signed 32-bit
|
Cardinal
|
0..2147483647
|
Unsigned 32-bit
|
Додаткам слід використовувати породжені типи наскільки це можливо, оскільки це покращує продуктивність процесору та операційної системи. Фундаментальні типи слід використовувати лише там, де істотній дійсний діапазон та формат зберігання.
Булевські типи
Існує чотири наперед означені булевські типи: Boolean, ByteBool, WordBool і LongBool. Булевські значення позначаються наперед означеними ідентифікаторами констант False та True.
Оскільки булевські типи є перечислимими, то мають місце відношення:
· False < True |
|
· Ord(False) = 0 |
|
· Ord(True) = 1 |
|
· Succ(False) = True |
|
· Pred(True) = False |
Змінні типів Boolean та ByteBool займають один байт, WordBool – 2 байти (одне слово), LongBool – 4 байти (два слова). Необхідно віддавати перевагу типу Boolean. Типи ByteBool, WordBool, і LongBool існують, щоб гарантувати сумісність з іншими мовами та серидовищем Windows.
Символьний тип
Множина значень типу Char – це символи, впорядковані згідно з таблицею символів розширеного ASCII. Виклик функції Ord(Ch), де Ch це значення типу Char , повертає порядковий номер Ch.
Рядкова константа довжини 1 може позначати значення символьної константи. Довільне символьне значення може бети згенероване стандартною функцією Chr.
Перечислимі типи
Перечислимі типи позначають впорядковні набори значень, перераховуючи ідентифікатори, що позначають ці значення.
Приклад перечислимого типу:
type
Suit = (Club, Diamond, Heart, Spade);
Типи піддіапазонів
Тип піддіапазону – це діапазон значень з порядкового типу, що називається типом господаря. Означення типу піддіапазону описує найменше та найбільше значення в піддіапазоні. Ось його синтаксис:
Приклади типів піддіапазонів:
0..99
-128..127
Club..Heart
Типи дійсних чисел
Тип дійсних чисел має множину значень, що є підмножиною дійсних чисел, що може бути представлена числами з плаваючою точкою з фіксованою кількістю цифр. Існує п”ять видів типів дійсних чисел: Real, Single, Double, Extended, and Comp. Типи дійсних чисел розрізняються за діапазоном та точністю значень, як це покаано у наступній таблиці.
Таблиця 3-4 Типи дійсних чисел
Тип
|
Діапазон
|
значащі цифри
|
Розмір в байтах
|
Real
|
2.9 x 10-39.. 1.7 x 1038
|
11-12
|
6
|
Single
|
1.5 x 10-45.. 3.4 x 1038
|
7-8
|
4
|
Double
|
5.0 x 10-324.. 1.7 x 10308
|
15-16
|
8
|
Extended
|
3.4 x 10-4932.. 1.1 x 104932
|
19-20
|
10
|
Comp
|
-263+1 .. 263-1
|
19-20
|
8
|
Рядкові типи
Значенням типу string (рядок) є послідовність символів з динамічною довжиною (залежить від фактичної кількості символів під час виконання програми) або із сталою кількістю символів (від 1 до 255).
Впорядкування між двома рядками встановлюється на основі впорядкування символів у відповідних позиціях.
Структуровані типи
Структурований тип, що характеризується методом його структурування та типом(ами) його компонент, зберігає більше як одне значення. Якщо тип компоненту є структурним, то результуючий структурний тип матиме більше ніж один рівень структурування. Структурований тип може мати необмежене число рівнів структурування та максимально допустимий розмір структурованого типу є 65,520 байт.
У стандартному Pascal слово packed вказує компілятору на ущільнення зберігання даних незважаючи ні на що. У Object Pascal packed вказує на виконання автоматичне ущільнення там, де це можливо. Типи класів та посилання на типи класів є вершинами об”єктно-орієнтованого програмування в Object Pascal. Про них буде мова далі.
Типи масивів (Array)
Масиви (Arrays) мають фіксоване число компонент одного типу – типу компоненту. У наступних синтаксичних діаграмах тип компоненту йде після слова of.
Приклади типу array:
array[1..100] of Real
Тип
array[Boolean] of array[1..10] of array[Size] of Real
інтерпретується так само, як:
array[Boolean,1..10,Size] of Real
Тип запису (Record)
Тип запису (record) охоплює задане число компонент або полів, що можуть бути різних типів. Декларація типу запису описує тип кожного поля та ідентифікатор, що іменує поле.
Приклад типу запису:
type
TDateRec = record
Year: Integer;
Month: 1..12;
Day: 1..31;
end;
Більш складні приклади типів записів із варіантами
type
TPerson = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Citizen: Boolean of
True: (BirthPlace: string[40]);
False: (Country: string[20];
EntryPort: string[20];
EntryDate: TDate;
ExitDate: TDate);
end;
TPolygon = record
X, Y: Real;
case Kind: Figure of
TRectangle: (Height, Width: Real);
TTriangle: (Side1, Side2, Angle: Real);
TCircle: (Radius: Real);
end;
Тип множина (Set)
Область значень типу множина є декартовим добутком певного порядкового типу (базового типу). Декартовий добуток – це множина усіх можливих підмножин значень базового типу, включаючи порожню множину.
Кожен тип множина містить значення [ ], яке називається порожньою множиною.
Тип файлу (File)
Тип файлу складається з лінійної послідовності компонент одного ж типу, який може бути довільним типом окрім типу файлу чи типу об”єкту. Число компонент в декларації типу файлу не задається.
Типи вказівників
Тип вказівника визначає множину значень, що вказують на динамічні змінні певного типу, що називається базовим типом. Змінна типу вказівник містить адресу пам”яті динамічної змінної.
Можна надавати значення змінним типу вказівник через процедуру New , оператор @, функцію Ptr або процедуру GetMem. New виділяє нову область пам”яті для динамічної змінної і зберігає адресу цієї області у змінній типу вказівник. Оператор @ направляє змінну типу вказівник в область пам”яті, що включає довільну існуючу змінну або точку входу в процедуру чи функцію, включаючи змінні, що вже мають ідентифікатори. Ptr вказує змінній-вказівникові на певну адресу пам”яті. GetMem створює нову динамічну змінну певного розміру та розміщає адресу у змінну-вказівник.
Тип Pointer
Вмонтований тип Pointer позначає вказівник без типу, тобто вказівник, що не вказує на певний заданий тип.
Type PChar
Object Pascal має вмонтований тип PChar, що служить для вказування на рядки. Модуль System оголошує PChar як
type PChar = ^Char;
Процедурні типи
Object Pascal дозволяє поводитися із процедурами та функціями, як із сутностями, що можуть присвоюватися змінним та передаватися в якості параметрів. Такі дії можна робити, використовуючи процедурні типи.
Існує дві категорії процедурних типів: вказівники на глобальні процедури та вказівники методів.
Вказівники глобальних процедур
Процедурний тип, що оголошується без речення of object називається вказівником глобальної процедури. Вказівник глобальної процедури може посилатися на глобальну процедуру чи функцію. Він зберігає адресу глобальної процедури чи функції. Приклади типів вказівників глобальних процедур:
type
TProcedure = procedure;
TStrProc = procedure(const S: string);
TMathFunc = function(X: Double): Double;
Вказівники методів
Процедурний тип, оголошений із реченням of object називається вказівником методу. Вказівник методу може посилатися на метод процедури або функції об”єкту. Внутрішньо він представлений як два вказівники: перший вказівник зберігає адресу методу, другий вказівник зберігає посилання на об”єкт, якому належить сам метод. Нижче наведені приклади типів вказівників методів:
type
TMethod = procedure of object;
TNotifyEvent = procedure(Sender: TObject) of object;
Сумісність між типами
Сумісність між двома типами вимагається у виразах та операціях відношення. Сумісніть типів існує, коли виконується хоча б одна з умов (неповний перелік):
Обидва типи є тотожніми. |
|
Обидва типи є типами дійсних чисел. |
|
Обидва типи є цілочисельними типами. |
|
Один тип є підобластю іншого. |
|
Обидва типи є підобластями того ж типу господаря. |
|
Обидва типи є типами множина із сумісними базовими типами. |
|
Обидва типи є ущільненими рядковими типами з одинаковою кількістю компонент. |
|
Один тип є типом рядка, а інший є або рядком, ущільненим рядком, або типом Char. |
і т.д.
Змінні та константи типу
Декларації змінних
Змінна – це ідентифікатор, що позначає значення, що може змінюватися. Декларація змінних показує список ідентифікаторів, що позначають нові змінні та їх тип.
Приклад підрозділу декларації змінних:
var
X, Y, Z: Double;
I, J, K: Integer;
Digit: 0..9;
C: Color;
Done, Error: Boolean;
Operator: (Plus, Minus, Times);
Hue1, Hue2: set of Color;
Today: Date;
Results: MeasureList;
P1, P2: Person;
Визначальники полів у записах
Певне поле змінної-запису позначається посиланням на змінну, що посилається на змінну-запис, за яким слідує визначальник поля, що описує поле
Приклади визначальників полів:
Today.Year Results[1].Count Results[1].When.Month
Визначальники компоненту об”єкту
Формат визначальника компоненту є таким же, що й для визначальника запису поля, тобто він складається з інстанції (посилання на змінну), за якою слідує крапка та ідентифікатор компоненту. Визначальник компоненту, що визначає метод, називається визначальником методу.
Вказівники та динамічні змінні
Значенням змінної-вказівника є або nil (не вказує ні на що) або адреса динамічної змінної.
Динамічна змінна, що вказується змінною-вказівником, може бути отримана написавши символ вказування (^) після змінної-вказівника.
Константи типу
Константи типу можна порівняти із ініціалізованими змінними – змінними, чиї значення означуються при входженні в їх блок. На відміну від констант без типу декларація констант типу визначає і тип, і значення константи.
Константи типу використовуються подібно до змінних того ж типу і вони можуть з”являтися в лівій частині речень присвоювання.
Константи простих типів
Декларація констант простих типів описує значення констант:
const
Maximum: Integer = 9999;
Factor: Real = -0.1;
Breakchar: Char = #3;
Константи типу рядок
Декларація констант типу типу string описує максимальну довжину рядка та його початкове значення:
const
Heading: string[7] = ‘Section’;
NewLine: string[2] = #13#10;
TrueStr: string[5] = ‘Yes’;
FalseStr: string[5] = ‘No’;
Константи структурованих типів
Декларація константи структурованого типу описує значення кожного компоненту структури. Object Pascal підтримує декларації констант таких типів як масив, запис і множина. Константи типу файл або масив чи запис, що включає файл не підтримуються.
Константи типу масив
Декларація констант типу масив описує значення елементів масиву. Приклад константи типу масив:
type
TStatus = (Active, Passive, Waiting);
TStatusMap = array[TStatus] of string[7];
const
StatStr: TStatusMap = (‘Active’, ‘Passive’, ‘Waiting’);
Константи типу запис
Приклад констант типу запис:
type
TPoint = record X, Y: Real;
end;
TVector = array[0..1] of Point;
TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
TDate = record D: 1..31;
M: Month;
Y: 1900..1999;
end;
const
Origin: TPoint = (X: 0.0; Y: 0.0);
Line: TVector = ((X: -3.1; Y: 1.5), (X: 5.8; Y: 3.0));
SomeDay: TDate = (D: 2; M: Dec; Y: 1960);
Константи типу вказівник
Приклад:
type
TDirection = (Left, Right, Up, Down);
TStringPtr = ^String;
TNodePtr = ^Node;
TNode = record
Next: TNodePtr;
Symbol: TStringPtr;
Value: TDirection;
end;
const
S1: string[4] = ‘DOWN’;
S2: string[2] = ‘UP’;
S3: string[5] = ‘RIGHT’;
S4: string[4] = ‘LEFT’;
N1: TNode = (Next: nil; Symbol: @S1; Value: Down);
N2: TNode = (Next: @N1; Symbol: @S2; Value: Up);
N3: TNode = (Next: @N2; Symbol: @S3; Value: Right);
N4: TNode = (Next: @N3; Symbol: @S4; Value: Left);
DirectionTable: TNodePtr = @N4;
Константи типу процедура
Приклад:
type
TErrorProc = procedure(ErrorCode: Integer);
procedure DefaultError(ErrorCode: Integer); far;
begin
Writeln(‘Error ‘, ErrorCode, ‘.’);
end;
const ErrorHandler: TErrorProc = DefaultError;
Програмні речення
Речення описують алгоритмічні дії, що можуть бути виконані. Попереду речень можуть стояти мітки. На ці мітки можна посилатися, використовуючи речення goto.
Існує два головних види речень: прості речення та структуровані речення.
Прості речення
Просте речення – це речення, що не містить будь-яких інших речень.
Речення присвоєння
Речення присвоєння заміняють поточне значення змінної новим значенням, яке описане у виразі. Ці речення можна також використовувати для повернення значень функцій.
Деякі приклади речень присвоєння:
X := Y + Z;
Done := (I >= 1) and (I < 100);
Hue1 := [Blue, Succ(C)];
I := Sqr(J) – I * K;
Речення процедур
Речення процедур активізують процедуру, описану в ідентифікатором процедури, визначником методу, визначником уточнюючого методу або посиланням на змінну процедурного типу.
Приклади речень процедур:
PrintHeading;
Transpose(A, N, M);
Find(Name, Address);
Речення Goto
Речення goto переносить виконання програми на речення, позначене певною міткою. Синтаксична діаграма цього речення:
Хороше програмування використовує речення goto дуже рідко.
Структуровані речення
Структуровані речення – це конструкції, що складаються з інших речень, що повинні виконуватися послідовно (складові речення та речення with), при певних умовах (умовні речення) або ж повторно (речення повторення).
Складові речення
Складове речення вказує, що вкладені у нього речення повинні виконуватися в тому порядку, в якому вони записані.
Приклад складового речення:
begin
Z := X;
X := Y;
Y := Z;
end;
Умовні речення
Умовне речення вибирає для виконання одне речення (або ні одного) із вкладених у нього речень.
Речення If
Синтаксис речення if:
Два приклади речень if:
if X < 1.5 then
Z := X + Y
else
Z := 1.5;
if P1 <> nil then
P1 := P1^.Father;
Речення Case
Речення case складається з виразу (селектору) і списку речень, попереду кожного з яких стоїть одна або більше констант (називаються константами вибору) або слово else.
case MySelector of
5: Edit1.Text := ‘Special case’;
1..10: Edit1.Text := ‘General case’;
end;
Речення повторення
Речення повторення описує певні речення, що повинні виконуватися повторно.
Стандартні процедури Break та Continue можуть використовуватися для керування потоком повторюваних речень: Break закінчує повторюване речення; Continue продовжує виконання речення повторення з наступної ітерації повторюваного речення.
Речення Repeat
Речення repeat містить вираз, що керує повторенням виконання послідовності речень у цьому реченні repeat.
Речення між словами repeat та until виконуються послідовно доти, поки вираз в кінці послідовності не дорівнюватиме True.
Приклади речень repeat:
repeat
K := I mod J;
I := J;
J := K;
until J = 0;
repeat
Write(‘Enter value (0..9): ‘);
Readln(I);
until (I >= 0) and (I <= 9);
Речення While
Речення while включає вираз, що керує повторним виконанням речення (яке може бути складовим).
while Data[I] <> X do I := I + 1;
while I > 0 do
begin
if Odd(I) then Z := Z * X;
I := I div 2;
X := Sqr(X);
end;
Речення For
Речення for здійснює повторне виконання речення поряд із присвоєнням керуючій змінній прогресії значень.
Керуюча змінна повинна бути порядкового типу. Її початкове та кінцеве значення повинні бути типу, сумісного з порядковим.
for I := 1 to 10 do
for J := 1 to 10 do
begin
X := 0;
for K := 1 to 10 do
X := X + Mat1[I, K] * Mat2[K, J];
Mat[I, J] := X;
end;
Речення With
Речення with – це спрощення посилання на поля записів та поля і методи об”єкту. В межах речення with посилання на поля однієї або більше змінних-записів можуть здійснюватися лише з використанням ідентифікаторів полів.
Нехай задано декларацію типу:
type
TDate = record
Day : Integer;
Month: Integer;
Year : Integer;
end;
var OrderDate: TDate;
Тоді можна використати таке речення with:
with OrderDate do
begin
if Month = 12 then
begin
Month := 1;
Year := Year + 1
end
else
Month := Month + 1;
end
Типи класів
Тип класу – це структура, що складається з фіксованого числа елементів. Можливими елементами класу є поля, методи та властивості. На відіну від інших типів тип класу може бути декларований лише в частині декларацій типів файлу програми чи модуля. Отже, тип класу не можу декларуватися в частині декларацій змінних або в блоках процедур, функцій чи методів.
Інстанції та посилання
Інстанція типу класу – це динамічно виділений блок пам”яті, розбиття якого визначається типом класу. Інстанції типу класу часто називають об”єктами. Об”єкти створюються конструкторами та руйнуються деструкторами. Кожен об”єкт типу класу має єдину копію полів, оголошених в типі класу, але всі вони використовують тіж самі методи.
Змінна типу класу включає посилання на об”єкт типу класу. Змінна не містить об”єкта самого, а швидше є вказівником на блок пам”яті, виділений під об”єкт. Подібно до змінних-вказівників змінні багатьох типів класів можуть посилатися на той же об”єкт. Більше того, змінна типу класу може містити значення nil, що свідчить про те, що вона не посилається на жоден об”єкт.
Примітка. На відміну від змінних-вказівників не має потреби “перепосилати” змінну типу класу, щоб отримати доступ до об”єкту, на який посилаємося. Іншими словами, тоді як потрібно писати Ptr^.Field, щоб отримати доступ до поля в динамічно розміщеному записі, то оператор ^ підпозумівається, коли ми доступаємося до елементу об”єкту. Використовується наступний синтаксис: Instance.Field.
Домовимося, що термін посилання на об”єкт використовується, щоб позначити значення типу класу. Наприклад, змінна типу класу містить посилання на об”єкт і конструктор повертає посилання на об”єкт.
До того ж , термін посилання на клас використовується, щоб позначити значення типу посилання на клас. Наприклад, ідентифікатор типу класу – це посилання на клас, а змінна типу посилання на клас містить посилання на клас.
Елементи класу
Елементи класу – це поля, методи і властивості. Елементи класу часто називають його членами.
Поля
Декларація поля в класі визначає пункт даних, що існує в кожній інстанції класу. Це дуже нагадує поле в запису.
Методи
Метод – це процедура або функція, що виконує операцію над об”єктом. Перша частина виклику методу описує об”єкт, над яким метод повинен оперувати. Декларація методу у типі класу відповідає декларації forward цього методу. Це означає, що десь слідом за декларацією типу класу і на протязі того ж модуля метод повинен бути реалізований декларацією означення.
На протязі реалізації методу ідентифікатор Self представляє параметр, що посилається на об”єкт, для якого було викликано метод.
Консруктори та деструктори – це спеціальні методи, що керують побудовою та руйнуванням об”єктів.
Конструктор визначає дії, пов2язані із створенням об”єкту. Коли він викликається, він діє як функція, що повертає посилання на заново розміщену та ініціалізовану інстанцію типу класу.
Деструктор визначає дії, пов”язані із руйнуванням об”єкту. Коли він викликається, деструктор звільнить пам”ять, що була виділена під об”єкт.
Метод класу – це процедура або функція, що оперує над посиланням на клас замість посилання на об”єкт.
Властивості
Декларація властивості у класі визначає поіменований атрибут для об”єктів класу та дії, пов”язані з читанням та записом атрибуту. Глибше про властивості буде далі.
Наслідування
Тип класу може наслідувати елементи з іншого типу класу. Якщо T2 наслідує T1, тоді T2 – це нащадок T1, а T1 – це предок T2. Наслідування є транзитивним; тобто, якщо T3 наслідує T2, а T2 наслідує T1, то T3 також наслідує T1. Домен типу класу складається із себе та усіх його нащадків. Клас нащадка включає усі елементи, означені в класах його предків. Клас нащадка може додати нові елементи до тих, що він успадковує. Однак, він не може викинути означення елементу, визначеного у класі предка.
Наперед заданий тип класу TObject – є основний і остаточний предок усіх типів класів. Якщо декларація типу класу не описує тип предка (тобто, якщо успадкована частина декларації класу опущена), тип класу походитиме із TObject.
TObject декларований в модулі System; він визначає методи, що застосовуються до всіх класів. Опис цих методів можна знайти далі.
Елементи та сфера їх дії
Сфера дії ідентифікатору елементу декларованого у типі класу, простягається від місця декларації до кінця декларації типу класу та розповсюджується на усі нащадки типу класу та блоки декларації усіх методів класу. Також сфера дії ідентифікаторів компоненту включає визначники полів, методів та властивостей та речення with, що оперують над змінними заданого типу класу.
Ідентифікатор елементу, який декларовано у типі класу, може бути передекларований у блоці декларації методу типу класу. В цьому випадку для доступу до елементу використовується параметр Self .
Ідентифікатор елементу у типі класу предка може бети переоголошений у типі класу нащадка. Таке переоголошення приховує успадкований елемент; хоча ключове слово inherited може бути використане, щоб повернути еспадкованому елементу його сферу дії.
Майбутня декларація
Для використання можливості майбутньої декларації використовується зарезервоване слово class, за яким нічого далі не слідує. Майбутня декларація повинна прийти до звичайної декларації в тому ж підрозділі декларації. Майбутня декларація дозволяє декларуватися одночасно залежним класам. Наприклад:
type
TFigure = class;
TDrawing = class
Figure: TFigure;
:
end;
TFigure = class
Drawing: TDrawing;
end;
Правила сумісності типів класів
Тип класу є сумісним з типами класів довільного предка; отже, під час виконання програми змінна типу класу може посилатися на інстанцію цього типу або ж інстанцію типу нащадка. Наприклад, для декларацій:
type
TFigure = class
:
end;
TRectangle = class(TFigure)
:
end;
TRoundRect = class(TRectangle)
:
end;
TEllipse = class(TFigure)
:
end;
значення типу TRectangle може бути присвоєним змінним типів TRectangle, TFigure і Tobject, а під час виконання програми змінна типу TFigure може бути або nil або посиланням на інстанції типів TFigure, TRectangle, TRoundRect, Tellipse або довільну іншу інстанцію типа – нащадка TFigure.
Видимість компонент
Видимість ідентифікатору елементу керується атрибутом видимості секції елементів, що декларує ідентифікатор. Існує такі чотири атрибути видимості: published, public, protected, and private.
Елементи секції Public
Ідентифікатори елементів, декларованих у секціях public не мають спеціальних обмежень на їх видимість.
Елементи секції Published
Правила видимості елементів цієї секції подібні до секції public. Єдина різниця між елементами секцій published та public полягає в тому, що інформація часу виконання генерується для полів та властивостей, декларованих у секції published. Ця інформація часу виконання дозволяє додатку динамічно запитувати поля та властивості в противному випадку невідомого типу класу.
Поля, означені у секції published повинні бути типу класу. Поля усіх інших типів заключаються у секції public, protected і private.
Властивості, визначені в секції published не можуть бути властивостями-масивами. Більше того, тип властивості, означений у секції published повинен бути порядкового типу, дійсних типів (Single, Double, Extended, Comp, але не Real), рядкового типу, типу малої множини, типу класу або типу вказівника методу. Тип малої множини – це тип множини з базовим типом, нижня і верхня межі якого мають порядкові значення між 0 та 15. Іншими словами, тип малої множини – це множина, що поміщається у байті або слові.
Елементи секції Protected
При здійсненні доступу через тип класу, декларований в поточному модулі, ідентифікатори елементів із секції protected є видимими. У всіх інших випадках вони є прихованими. Доступ до елементів класу секції protected обмежується згідно до реалізації методів класу та його нащадків. Отже, елементи класу, що створені лише для використання в підрозділах реалізацій породжених класів переважно оголошуються як захищені (protected).
Елементи секції Private
Видимість ідентифікатору елементу, декларованого у секції private, обмежена модулем, що містить декларацію типу класу.