Описание функции и процедуры Назад В начало Вперед

Процедуры и функции позволяют объединять операторы программы в логически связанные группы для однократного или многократного использования.

В отличие от процедуры функция возвращает значение. Имя функции может входить в выражение как операнд.

Функции и процедуры должны быть описаны до их использования, в том числе до их использования в других функциях и процедурах.

Имеется возможность опережающего описания функций с использованием ключевого слова forward. Для функций forward работает только внутри интерфейса.

Опережающее описание функции:

<опережающее-описание-функции> =
  [public] [static] function <имя-функции>
  [(<список-формальных-параметров>)] : <тип>; forward;

Опережающее описание процедуры:

<опережающее-описание-процедуры> =
  [public] [static] procedure <имя-процедуры> 
  [(<список-формальных-параметров>)]; forward;

Описание функции:

<описание-функции> = [public] [static] function <имя-функции>
  [(<список-формальных-параметров>)] : <тип>; [cacheable];
  {<описание-переменных>}
  { <описание-массива> }
  <блок-begin-end>

Описание процедуры:

<описание-процедуры> = [public] [static]
  procedure <имя-процедуры>
  [( <список-формальных-параметров> )] ; [cacheable];
  { <описание-переменных> }
  { <описание-массива> }
  <блок-begin-end>

Квалификатор static объявляет статическую функцию или процедуру (см. также "Статические члены класса. "). Квалификатор доступен начиная с Атлантис 5.1.25.

<имя-функции> - идентификатор (см. "Идентификаторы. ").

<имя-процедуры> - идентификатор (см. "Идентификаторы. ").

<список-формальных-параметров> - список параметров вызова, заключенный в круглые скобки. Список параметров вызова может отсутствовать. Скобки в этом случае также опускаются.

Формальные параметры в списке разделяются точкой с запятой:

<список-формальных-параметров> =
		<формальный-параметр>[; <формальный-параметр>]

<формальный-параметр> - идентификатор и тип параметра:

<формальный-параметр> =
  [const] <идентификатор> : <тип> [[<атрибуты-кэширования>]] [<значение-по-умолчанию>]
  | var <идентификатор> : <тип> [[<атрибуты-кэширования>]] [<значение-по-умолчанию>]

Ключевое слово const используется для описания формальных параметров, передающихся по значению. Слово const можно опустить.

Ключевое слово var используется для описания формальных параметров, передающихся по ссылке.

<атрибуты-кэширования> - для каждого параметра сразу после типа в квадратных скобках можно задать атрибуты кэширования. Если атрибутов несколько, то они разделяются запятой. Атрибуты кэширования доступны начиная с Атлантис 5.1.36.

<атрибуты-кэширования> =
  [ nocacheinfl | cacheinfl ] [, nocached ]

nocacheinfl -исключить данный const-параметр из числа параметров, влияющих на результат.

cacheinfl - включить данный var-параметр в число параметров, влияющих на результат.

nocached - не кэшировать данный var-параметр.

<значение-по-умолчанию> - значение параметра по умолчанию. Задается знаком '=' и следующим за ним значением соответствующего типа (см. Пример 4). Параметры, для которых задано значение по умолчанию, могут быть опущены при вызове функции или процедуры. В этом случае для параметра будет использовано его значение по умолчанию.

Если для параметра задано значение по умолчанию, то для всех последующих параметров данного метода также должны быть указаны значения по умолчанию. Т.е. значения по умолчанию указываются для последнего параметра или для нескольких последних параметров.

<тип> - тип параметра или возвращаемого значения. Любой тип из перечисленных в разделе "Простые типы данных. ".

Начиная с Атлантис 5.3.16 запрещается использовать тип decimal в описании параметров процедур и функций. Однако можно определить пользовательский тип на основе типа decimal и использовать его для описания параметров:

type TMy_30_25_Decimal = decimal[30,25];
	 ...
function MyFunc(add_s : TMy_30_25_Decimal) : boolean;
	 ...
var param : TMy_30_25_Decimal;
	 ...
MyFunc(param);

Ключевое слово forward объявляет опережающее описание функции или процедуры.

Ключевое слово cacheable объявляет кэшируемую функцию. Кэшироваться может только функция, параметры которой являются простыми типами. В противном случае выдаётся ошибка компиляции. По умолчанию кэшируются все её var-параметры и результат, а зависимость устанавливается от всех остальных параметров. Умолчания можно изменить указав для параметра <атрибуты-кэширования>. См. также "Кэширование результатов обращения к функции. ". Доступно начиная с Атлантис 5.1.36.

Примеры:

function f1 (a: word; b: longint; var c: string) : boolean;
  cacheable;

Кэшируется параметр с и результат функции. Кэшируемые значения зависят от параметров а и b.

function f2 (a: word;
			 b: longint [nocacheinfl];
			 var c: string [cacheinfl, nocached]
			) : boolean; cacheable;

Кэшируется результат функции. Кэшируемые значения зависят от параметров a и c.

<описание-переменных> - описание переменных, может отсутствовать. Описания могут повторяться неоднократно.

Переменные видны во всех вложенных блоках. Описание переменных смотрите в разделе "Переменные. ".

<описание-массива> - описание массивов может отсутствовать. Описания могут повторяться неоднократно.

Массивы видны во всех вложенных блоках. Описание массивов смотрите в разделе "Массивы. ".

<блок-begin-end> - смотрите в разделе "Блок. ".

В Атлантис 3.XX процедура или функция не может вызывать саму себя.

Для того, чтобы функция возвращала значение, в блоке begin..end функции должен присутствовать оператор присваивания, в левой части которого стоит идентификатор функции. Например:

function Pi:double;
begin
  Pi:= 3.1415926;
end;

Примеры

Пример 1. Опережающее описание функции.

function b (i : integer) : integer; forward;
function a : integer;
{
  a := b (1);
}
function b (i : integer) : integer;
{
  b := i + i;
}

Пример 2. Описание процедуры:

procedure PrintDoc;
begin
		var empCount : word;
		DocForm.Write(Cur_date,'DD/MM/YYYY');
		empCount := 0;
		if ( modifier getFirst Employee = tsOk ) 
		then
				do 
				{DocForm.Write(Employee.Name);
				 DocForm.Write(Employee.Salary,2);
				 empCount := empCount + 1;}
				while ( modifier getNext Employee = tsOk );
		DocForm.Write(empCount);
		DocForm.ShowFile('Сотрудники');
end;

Пример 3. Описание функции:

function Pow(const p:double; const d:word):double;
var i : word;
	result : double;
begin
  result := p;
  for (i:=1; i<d; i:=i+1)
	result := result * p;
  Pow := result;
end;

Пример 4. Функция с параметрами по умолчанию.

function f1(x : integer = 1; y : integer = 5; z : integer = 2) : integer;
{
  f1 := (x + y) * z;
}

Возможные варианты вызовов:

  Message('f1(2,2,3)=' + f1(2,2,3));
  Message('f1(2,2)='   + f1(2,2));
  Message('f1(2)='	 + f1(2));
  Message('f1='		+ f1);

Версия

Начиная с версии Атлантис 5.3.16 запрещается использовать тип decimal в описании параметров процедур и функций.

Начиная с версии Атлантис 5.00.03 допускается рекурсивный вызов функций и процедур.

Квалификатор static доступен начиная с Атлантис 5.1.25.

Атрибуты cacheable, nocacheinfl, cacheinfl и nocached доступны начиная с Атлантис 5.1.36.