Записи в КП не являются записями как в обыкновенной жизни, но тем не менее, имеют нечто похожее. Записям в жизни всё-равно, какого цвета ручка (или может быть это карандаш, фломастер). Не важно где выполнена запись — на обрывке листа, полях газеты или тетрадке. Ценность в записи — её содержимое. Поэтому, запись — это сущность, определяющая какую-то информацию. Можно считать, что запись — это особый вид файла. Но в отличии от файла, которому безразлично, что в него записали, у записи есть чёткое разделение полей, например:
В какой-то записи, например, нет отчества, в другой — нет телефона, но есть общее правило: все записи состоят из полей. Поля могут быть даже не заполненными, но они есть. Очень удобно, когда один раз описав поля записи, можно создать массив записей. Примерно так создаются базы данных (хотя надо понимать, что базы данных шагнули очень далеко, по сравнению с простым набором записей). Можно, конечно, хранить различные фамилии в одном массиве, а имена в другом массиве, а телефоны в третьем массиве, и собирать эти данные по общему индексу для всех массивов, но гораздо более красивое решение — хранить все эти переменные в одной записи в виде полей. Записи используются на столько широко, у них на столько обширные возможности, что в одной главе осветить охватить всё просто не получится.
В тексте модуля, который приведён ниже, представлено объявление одной записи с несколькими полями:
Привет7.odc
MODULE КнигаПривет7; (* Этот пример показывает как объявлять записи *) IMPORT Log, Math; VAR зТочка: RECORD цКоорд_х, цКоорд_у: INTEGER; бВключ: BOOLEAN; мцЦвет: ARRAY 3 OF INTEGER; END; PROCEDURE Старт*; VAR BEGIN END Старт; BEGIN END КнигаПривет7.
В секции VAR
модуля объявлена переменная зТочка
с ключевым словом RECORD
. Это не тип данных, это переменная, которая является точкой входа для записи. В самой записи могут быть любые поля любого типа, в неограниченном количестве (конечно, учитывая размер свободной памяти и разумность попытки разместить всё под одним объявление RECORD
). Более того, в запись может быть включена другая запись, в которую может быть включена другая запись, в которую…
Описание полей в записи разделяются точкой с запятой, а само объявление записи ограничивается ключевым словом END;
.
Обращение к полям записи происходит точно также, как и к простой переменной. Обращение к элементу массива в записи, в сущности, ничем не отличается от обращения к элементу простого масcива. Единственное отличие, перед полем записи должно быть указано имя соответствующей переменной с типом RECORD и подряд символ «.» («точка»). Пример такого обращения к записи:
Привет7.odc
MODULE КнигаПривет7; (* Этот пример показывает как объявлять записи *) IMPORT Log, Math; VAR зТочка: RECORD цКоорд_х, цКоорд_у: INTEGER; бВключ: BOOLEAN; мцЦвет: ARRAY 3 OF INTEGER; END; PROCEDURE Старт*; VAR лцИтер: INTEGER; BEGIN зТочка.цКоорд_х := 5; зТочка.цКоорд_у := 4; Log.Int(зТочка.цКоорд_х); Log.String(', '); Log.Int(зТочка.цКоорд_у); Log.Ln; зТочка.мцЦвет[0] := 4; зТочка.мцЦвет[2] := - 10; FOR лцИтер := 0 TO 2 DO Log.Int(зТочка.мцЦвет[лцИтер]); Log.String(', ') END; Log.Ln END Старт; BEGIN END КнигаПривет7. (!)КнигаПривет7.Старт
В этом примере присваиваются значения полям цКоорд_Х
и цКоорд_У
. В массиве мцЦвет
элементам с номерами 0 и 2 также присваиваются значения. Обратите внимание, на именование полей — все они с маленькой буквы. В записях могут быть ссылки на процедуры, а процедуры должны именоваться с большой буквы (а иначе отличить одно от другого без чтения документации, либо исходных кодов — будет тяжело). Если всё сделано правильно, то будет получен такой вывод:
компилируется "КнигаПривет7" 156 24 старый модуль КнигаПривет7 выгружен 5, 4 4, 0, -10,
из которого можно сделать вывод, что действительно поля записи меняют свои значения.
Это коротенькое введение очень важно. Так как Компонентный Паскаль очень сильно приспособлен под использование записей в связи с его подходом к построению программ. Пользоваться записями впереди предстоит часто.