Instrukcja wiążąca With


Instrukcja wiążąca with jest sposobem skracania odwołań do pól rekordów lub pól, właściwości i metod obiektów.

Składnia instrukcji with:

 with obj do instr
lub
with obj1, ..., objN do instr

gdzie obj jest zmienną stanowiącą odwołanie do obiektu lub rekordu, zaś instr jest dowolną instrukcją prostą lub strukturalną. Wewnątrz instrukcji, można odwoływać się do pól rekordu bądź do pól, właściwości i metod obiektu reprezentowanego przez obj używając jedynie ich identyfikatorów - bez kwalifikacji z obj.

Np. zadeklarowany poniżej rekord:

type TDate = record
  Day: Integer;
  Month: Integer;
  Year: Integer;
end;

var OrderDate: TDate;

można użyć w instrukcji wiążącej:

with OrderDate do
  if Month = 12 then
  begin
    Month := 1;
    Year := Year + 1;
  end
  else
    Month := Month + 1;

Jest to równoznaczne z zapisem:

if OrderDate.Month = 12 then
begin
  OrderDate.Month := 1;
  OrderDate.Year := OrderDate.Year + 1;
end
else
  OrderDate.Month := OrderDate.Month + 1;

Każde odwołanie do zmiennej lub nazwy metody w instrukcji with jest interpretowane, o ile to możliwe, jako składnik wyspecyfikowanego obiektu lub rekordu. Jeśli istnieje inna zmienna lub metoda o takiej samej nazwie, można mieć do niej dostęp kwalifikując ją, jak w poniższym przykładzie:

with OrderDate do
  begin
    Year := Unit1.Year
    ...
  end;

Kiedy wiele obietów lub rekordów pojawia się po with, wewnętrzna instrukcja jest traktowana jako seria zagnieżdżonych instrukcji with. Zapis:

with obj1, obj2, ..., objN do instr

jest równoważny zapisowi:

with obj1 do
  with obj2 do
     ... 
     with objN do
       instr

W tym przypadku, każde odwołanie do zmiennej lub nazwy metody w instrukcji jest interpretowane, o ile to możliwe, jako składnik objN; w przeciwnym razie, jeśli to możliwe, jako składnik objN–1; itd. Te same zasady stosują się interpretacji każdego obj, tj. przykładowo: jeśli objN jest składnikiem zarówno obj1 i obj2, odwołanie do niego interpretowane jest jako obj2.objN.