В операциях над записями оператор with удобно использовать
для краткого обращения к полям записи. В операторе with к полям
одной или более конкретных переменных типа запись можно обращать-
ся, используя только идентификаторы полей. Оперaтор with имеет
следующий синтаксис:
┌────┐ ┌───────────────┐ ┌──┐ ┌────────┐
оператор ──>│with├─────>│ ссылка на ├──┬─>│do├──>│оператор├>
with └────┘ ^ │переменную типа│ │ └──┘ └────────┘
│ │ запись │ │
│ │ или объект │ │
│ └───────────────┘ │
│ ┌───┐ │
└────────┤ , │<────────┘
└───┘
ссылка на переменную ┌────────────────────┐
типа запись или объект ───>│ссылка на переменную├──>
└────────────────────┘
Возьмем следующее описание:
type
TDate = record
Day : Integer:
Month : Integer;
Year : Integer:
end;
var OrderDate: TDate;
С учетом данного описания приведем пример оператора with:
with OrderDate do
if Month = 12 then
begin
Month := 1;
Year := Year + 1
end else
Month := Month + 1;
Это эквивалентно следующему:
if OrderDate.Month = 12 then
begin
OrderDate.Month := 1;
OrderDate.Year := TDate.Year + 1
end
else
Date.month := TDate.Month + 1;
В операторе with сначала производится проверка каждой ссылки
на переменную, а именно: можно ли ее интерпретировать, как поле
записи. Если это так, то она всегда интерпретируется именно таким
образом, даже если имеется доступ к переменной с тем же именем.
Допустим описаны следующие переменные:
type
TPoint = record
x,y: Integer;
end;
var
x: Point;
y: Integer;
В этом случае и к x, и к y можно обращаться, как к перемен-
ной или как к полю записи. В операторе:
with x do
begin
x := 10;
y := 25;
end;
x между ключевыми словами with и dо относится к переменной типа
указатель, а в составном операторе x и y ссылаются на x.x и y.y.
Оператор:
with V1,V2,...Vn do s;
эквивалентен операторам:
with V1 do
with V2 do
...
with Vn do
S;
В обоих случаях, если Vn является полем и v1, и v2, то она
интерпретируется как v2.Vn, а не как v1.Vn.
Если выборка переменной типа запись связана с индексировани-
ем массива или разыменованием указателя, то эти действия произво-
дятся до того, как будет выполняться составной оператор.