Процедурные значения

Переменной процедурного типа можно присвоить процедурное значение. Процедурные значения могут быть следующими:

В контексте процедурных значений описание процедуры или функции можно рассматривать как специальный вид описаний констант, когда значением константы является процедура или функция. Рассмотрим, например, следующее описание:

var
  P: SwapProc;
F: MathFunc;
procedure Swap(var A, B: Integer); far;
var
   
Temp: Integer;
begin
  Temp := A;
A := B;
B := Temp;

end;

function Tan(Angle: Real); far;
begin

  Tan := Sin(Angle) / Cos(Angle);

end;

Переменным P и F можно присвоить значения следующим образом:

P := Swap;
F := Tan;

а вызовы с помощью P и F можно выполнить так:

P(I, J);
X := F(X);

{ эквивалентно Swap(I, J) }
{ эквивалентно X := Tan(X) }

Использование процедурных переменных, которым в операторе вызова процедуры или функции присваивается значение nil, приводит к ошибке. Значение nil предназначено для указания того, что процедурная переменная не присвоена, и, так где процедурная переменная может получить значение nil, участвующие в этой процедурной переменной вызовы процедур и функций следует подвергать проверке:

if @P <> nil then P(I, J);

Обратите внимание на использование операции @ для указания того, что P проверяется, а не вызывается.