4.5. Процедурные типы данных
В заключение, мы вернемся к информационной структуре программы разберем такое важное для программирования на Delphi понятие, как процедурные типы данных.
Переменные процедурного типа представляют собой ссылки на подпрограммы — процедуры и функции. Описание типа строится на основе сигналы подпрограммы без указания имени:
<Назвзвание типа> = Procedure(<Список параметров>)
Или для функций:
Туре
<Название типа> = Function(<Список параметров>): <Возвращаемое значение>;
Допускается описание переменной в разделе Var без введения в программу нового процедурного типа, например:
Var
fSin = Function(X: Double): Double;
Как и переменные любого другого типа, процедурные переменные после описания не определены. Для инициализации процедурной переменной необходимо присвоить ей адрес подпрограммы, доступной текущему фрагменту программы, в котором выполняется присвоение. Для получения адреса подпрограммы используется ее имя:
<Название переменной> = <Название подпрограммы:*;
После инициализации переменная процедурного типа используется так же, как и вызов обычной подпрограммы, то есть вместо названия подпрограммы указывается название процедурной переменной:
<Название переменной>(<Список параметров>);
Рассмотрим пример описания процедурного типа данных, переменной на его основе, ее инициализации и использования (листинг 4.10).
Листинг 4.10. Пример использования процедурного типа данных
Unit Procedural;
Interface
Type
fMathFunct = Function (Arg: Double): Double;
{Описание процедурного типа fMathFunct — указателя на функцию с одним вещественным аргументом, возвращающую вещественное значение}
Implementation
Function Sin2(X: Double): Double;
begin
Result := Sin(X) * Sin (X) ;
end; {Описание функции Sin2, совместимой
с процедурным типом fMathFunct, и построенной на основе стандартной функции Sin}
Procedure UseProcedural;
{Описание процедуры, использующей процедурные типы}
Var
F: fMathFunct;{Описание процедурной переменной F} Res: Double; begin F := Sin2; {Присвоение процедурной переменной ссылки
на функцию Sin2} F(l); {Вызов функции Sin2 через процедурную
переменную F} Res := F(3); end; End.
Для описания процедурного типа, который указывает не просто на подпрограмму, а на метод экземпляра класса, после описания процедурного типа используется конструкция Of Object, например:
Var
ProcTypel = Procedure(S: AnsiString) Of Object;
На использовании ссылок на методы объектов построена система сообщений компонентов Delphi.