Компонентный Паскаль/Введение в записи

Понятие записи править

Записи в КП не являются записями как в обыкновенной жизни, но тем не менее, имеют нечто похожее. Записям в жизни всё-равно, какого цвета ручка (или может быть это карандаш, фломастер). Не важно где выполнена запись -- на обрывке листа, полях газеты или тетрадке. Ценность в записи -- её содержимое. Поэтому, запись -- это сущность, определяющая какую-то информацию. Можно считать, что запись -- это особый вид файла. Но в отличии от файла, которому безразлично, что в него записали, у записи есть чёткое разделение полей, например:

  • Фамилия
  • Имя
  • Отчество
  • Адрес
  • Телефон

В какой-то записи, например, нет отчества, в другой -- нет телефона, но есть общее правило: все записи состоят из полей. Поля могут быть даже не заполненными, но они есть. Очень удобно, когда один раз описав поля записи, можно создать массив записей. Примерно так создаются базы данных (хотя надо понимать, что базы данных шагнули очень далеко, по сравнению с простым набором записей). Можно, конечно, хранить различные фамилии в одном массиве, а имена в другом массиве, а телефоны в третьем массиве, и собирать эти данные по общему индексу для всех массивов, но гораздо более красивое решение -- хранить все эти переменные в одной записи в виде полей. Записи используются на столько широко, у них на столько обширные возможности, что в одной глав осветить охватить всё просто не получится.

Пример записи править

В тексте модуля, который приведён ниже, представлено объявление одно записи с несколькими полями:

MODULE TestHello07;
(* Этот пример показывает как объявлять 
записи *)
	IMPORT  Log, Math;
	VAR
		r : RECORD
			CoordX, CoordY : INTEGER;
			Enabled : BOOLEAN;
			Color : ARRAY 3 OF INTEGER;
		END;
	
	PROCEDURE Start*;
	VAR
	BEGIN
	END Start;	
BEGIN
END TestHello07.

В секции VAR модуля объявлена переменная "r" с ключевым словом RECORD. Это не тип данных, это указатель на то, что переменная является точкой входа для записи. В самой записи могут быть любые поля любого типа, в неограниченном количестве (конечно, учитывая размер свободной памяти и разумность попытки разместить всё под одним объявление RECORD). Более того, в запись может быть включена другая запись, в которую может быть включена другая запись, в которую...

Описание полей в записи разделяются точкой с запятой, а само объявление записи традиционно ограничивается ключевым словом END;


Обращение к полям записи править

Обращение к полям записи происходит точно также, как и к простой переменной. Обращение к элементу массива в записи, в сущности, ничем не отличается от обращения к элементу простого масcива. Единственное отличие, перед полем записи должно быть указано имя соответствующей переменной с типом RECORD и подряд символ "." ("точка"). Пример такого обращения к записи:


Hello07.odc

MODULE TestHello07;
	(* Этот пример показывает как объявлять
	записи *)

	IMPORT Log, Math;
	VAR
		r: RECORD
			coord_x, coord_y: INTEGER;
			enabled: BOOLEAN;
			color: ARRAY 5 OF INTEGER
		END;

	PROCEDURE Start*;
		VAR
			i: INTEGER;
	BEGIN
		r.coord_x := 5;
		r.coord_y := 4;
		Log.Int(r.coord_x); Log.String(', ');
		Log.Int(r.coord_y); Log.Ln;
		r.color[0] := 4;
		r.color[4] := - 10;
		FOR i := 0 TO 4 DO
			Log.Int(r.color[i]); Log.String(', ')
		END;
		Log.Ln
	END Start;

BEGIN
END TestHello07.

В этом примере присваиваются значения полям "coord_x" и "coord_y". В массиве "color" элементам с номерами 0 и 4 также присваиваются значения. Обратите внимание, на именование полей -- все они с маленькой буквы. В записях могут быть ссылки на процедуры, а процедуры должны именоваться с большой буквы (а иначе отличить одно от другого без чтения документации, либо исходных кодов -- будет тяжело). Если всё сделано правильно, то будет получен такой вывод:

компилируется "TestHello07"   156   32
старый модуль TestHello07 выгружен
 5,  4
 4,  0,  0,  0,  -10,

из которого можно сделать вывод, что действительно поля записи меняют свои значения.

Заключение править

Это коротенькое введение очень важно. Так как Компонентный Паскаль очень сильно приспособлен под использование записей в связи с его подходом к построению программ. Пользоваться записями впереди предстоит часто.