Наряду с уже известными типами данных в языке Delphi введен так называемый процедурный тип, с помощью которого обычные процедуры и функции можно интерпретировать как некоторую разновидность переменных. Определение процедурного типа состоит из зарезервированного слова procedure или function, за которым следует полное описание параметров. Для функции дополнительно указывается тип результата. Символические имена параметров никакой роли не играют, поскольку нигде не используются.
type TProc = procedure (X, Y: Integer); TFunc = function (X, Y: Integer): Boolean; |
Определив процедурный тип, можно непосредственно перейти к так называемым процедурным переменным. Они объявляются точно так же, как и обычные переменные.
Можно так же описать процедурную переменную без предварительного описания типа.
function Calc(X,Y: Integer): Integer; var F: function(X,Y: Integer): Integer; F := Calc; |
Приведем еще примеры:
type TIntegerFunction = function: Integer; TProcedure = procedure; TStrProc = procedure(const S: string); TMathFunc = function(X: Double): Double;var F: TIntegerFunction;//F is a parameterless function that returns an integer Proc: TProcedure; //Proc is a parameterless procedure SP: TStrProc; //SP is a procedure that takes a string parameter M: TMathFunc; // M is a function that takes a Double (real) parameter and returns a Doubleprocedure FuncProc(P: TIntegerFunction); |
При работе с процедурной переменной важно понимать, что она не дублирует код подпрограммы, а содержит лишь ее адрес. Если обратиться к такой переменной как к подпрограмме, произойдет выполнение подпрограммы, адрес которой записан в переменной.
type TFunc = function (X, Y: Double): Double; var F: TFunc; function Power(X, Y: Double): Double;begin Result := Exp(Y * Ln(X));end; … F := Power; // В переменную F заносится адрес функции Power ShowMessage(floattostr(F(2, 4))); // Вызов Power посредством F… |
Обращение к процедурной переменной следует выполнять только после установки ее значения. Чтобы установка значения была корректной, процедура либо функция справа от знака присваивания не должна быть встроенной подпрограммой модуля System.