Оператор присоединения WITH

Если в программе необходимо несколько раз подряд обратиться к полям одной записи, то это может оказаться неудобным.

Пример:

var Circle: TCircle;

Circle.color:= 0;

Circle.center.x:= 10;

Circle.center.y:= 5.5;

Circle.radius:= sqr(Circle.center.x)+ sqr(Circle.center.y);

Обращение к компонентам записи в таком случае можно упростить, если воспользоваться оператором присоединения with.

Оператор with позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения:

WITHMDOOP;

Здесь М – имя записи, ОР – простой или составной оператор. Оператор ОР представляет собой область действия оператора присоединения, в пределах которой можно не использовать составные имена.

Пример: использование оператора with

var Circle: TCircle;

with Circle do

begin

color:= 0;

center.x:= 10;

center.y:= 5.5;

radius:= sqr(center.x)+ sqr(center.y);

end;

Если внутри оператора with требуется обратиться к глобальной переменной, которая имеет такое же имя, как и одно из полей записи, то перед ней нужно указать через точку имя программы (раздел program).

Если внутри оператора with для некоторого имени явно не указано имя записи, то компилятор пытается интерпретировать его в следующей последовательности:

1) если в записи есть поле с искомым именем, то поиск заканчивается;

2) если в записи поля с таким именем нет, а рассматриваемый оператор with является вложенным в другой оператор with, то поиск производится среди полей внешней записи;

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

Записи с вариантами

Иногда содержимое отдельной записи зависит от значения одного из ее полей (например, одно из полей определяет тип оборудования, от которого может зависеть набор его характеристик). В языке Паскаль допускается описание записи, состоящей из общей и вариантной частей. Вариантная часть при этом задается с помощью конструкции

CASEPOF,

где Р – имя поля из общей части записи.

Возможные значения, принимаемые этим полем, перечисляются так же, как и в операторе выбора case. Однако вместо указания выполняемого действия, как это делается в операторе case, здесь указываются поля варианта, заключенные в круглые скобки. Описание вариантной части завершается служебным словом end.

Тип поля Р можно указать в заголовке вариантной части.

Пример: тип поля Р указан в заголовке вариантной части

case P: Integer of

Далее рассмотрим следующий пример: описать запись для хранения данных: имя, фамилия, дата рождения. Для граждан хранить место рождения, для иностранцев – страну, дату прибытия и дату отъезда.

Пример: описание записи с вариантной частью

record

firstName, lastName: string[40];

birthDate: Date;

case citizen: boolean of

True: (birthPlace: string[40]);

False: (country: string[20];

entryDate : Date;

exitDate : Date);

end;