Ну, если не вдаваться в детали, то процедурный тип - это тип переменной, которая должна содержать ссылку на процедуру или функцию.
Допустим, у Вас есть набор процедур (функций) по работе с чем-то, Вы выбираете из них процедуру и присваиваете переменной. Далее, когда она понадобится, эта переменная вызывается как процедура.
Например, рассмотрим "избитые" комплексные числа:
- Код: Выделить всё
program compltest;
{$mode objfpc}{$H+}
type
TComplex=record
Re,Im:real;
end;
TComplexOperation=function(C1,C2:TComplex):TComplex;
Function CplPlus(C1,C2:TComplex):TComplex;
begin
Result.Re:=C1.Re+C2.Re;
Result.Im:=C1.Im+C2.Im;
end;
Function CplMinus(C1,C2:TComplex):TComplex;
begin
Result.Re:=C1.Re-C2.Re;
Result.Im:=C1.Im-C2.Im;
end;
Function CplNull(C1,C2:TComplex):TComplex;
begin
Result.Re:=0;
Result.Im:=0;
end;
var
C1,C2,C3:TComplex;
Op:TComplexOperation;
OpStr:String;
begin
Write('Введите с1.Re ');Readln(c1.Re);
Write('Введите с1.Im ');Readln(c1.Im);
Write('Введите с2.Re ');Readln(c2.Re);
Write('Введите с2.Im ');Readln(c2.Im);
Write('Введите символ операции');Readln(OpStr);
if length(OpStr)<1 then halt;
case OpStr[1] of
'+':Op:=@CplPlus;
'-':Op:=@CplMinus;
else Op:=@CplNull;
end;
C3:=Op(C1,C2);
Writeln('C3.Re=',C3.Re,' C3.Im=',c3.Im);
end.
Конечно, решить эту задачу можно множеством других способов (например, делая вызов в case), но в более сложных случаях (например, когда в модуле, вызывающем переменную процедурного типа, процедура ещё не определена, и даже не должна быть определена) этот тип незаменим. Кстати, символ @ требуется только в FPC, и то в режимах fpc или objfpc.