Основное назначение процедурных типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
type
Proc1 = procedure(a, b, с: Real; var d: Real);
Proc2 = procedure(var a, b);
РгосЗ = procedure;
Func1 = function: string;
Func2 = function(var s: string): Real;
Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.
В следующий программе иллюстрируется механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1 (х) = (sin(x) + 1) * Ехр(-х) и cosi(x) = (Cos(x) + 1) * Ехр(-х) . Вычисление и печать значений этих функций реализуются в процедуре printFunc, которой в качестве параметров передается количество np вычислений функции в диапазоне х от 0 до 2*3.141592 и имя нужной функции.
function Sinl(X: Real): Real;
begin
Result := (Sin(X) + 1) * Exp(-X)
end; // Sin 1function Cosl(X: Real): Real;
begin
Result := (Cos(X) + 1) * Exp(-X)
end; // Cosiprocedure TfmExample.bbRunClick(Sender: TObject);
type// Процедурный тип Procedure PrintFunc(NP: Integer; F; Func);
Func = function(X: Real): Real;
var
k: Integer;
X: Real;
beginfor k := 0 to NP dobegin
X := k * 2 * pi / NP;
mmOutput.Lines.Add(FloatToStrF(X, ffExponent, 10, 2) + #9#9+
FloatToStrF(F(X), ffExponent, 10, 2));
end;
end; // PrintFuncbegin// bbRunClick
nmiOutput.Lines.Add(#9"Функция SINI:");
PrintFunc(10, Sini);
mmOutput.Lines.Add(#9"Функция COSI:");
PrintFunc(10, Cosi);
end;
Обратите внимание: передаваемые подпрограммы не могут быть локальными, т. е. процедурами или функциями, объявленными внутри другой подпрограммы. Вот почему описание подпрогра^." sini и cosi размещаются вне обработчика bbRunciick, но выше не." по тексту модуля. Замечу, что символ #9 - это символ табуляции. который вставляется в формируемые строки для разделения колонок с цифрами.
В программе могут быть объявлены переменные процедурных типов, например,так:
var
p1: Proc1;
fl, f2: Func2;
ар: array[1..N] of Proc1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.
Если Вас заинтересовала или понравилась информация по разработке на Delph - "Процедурные типы", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!