Формальные параметры

Формальные параметры – идентификаторы, которые принимают значения фактических параметров, указанных при вызове процедур/функций.

Параметры могут передаваться как по ссылке, так и по значению. Если формальный параметр описан как параметр по ссылке, тогда фактический параметр должен являться переменной или полем объекта. Описанию формального параметра по ссылке должно предшествовать ключевое слово Var. Если формальный параметр описан как параметр по значению, тогда фактический параметр должен являться выражением.

Аргумент, передаваемый в качестве значения параметра по ссылке, должен иметь такой же тип, что и тип параметра. Аргумент, передаваемый в качестве значения параметра по значению, должен иметь тип, который можно привести к типу параметра.

Формальные параметры являются локальными для процедуры/функции.

Формальный параметр, передаваемый по значению, может быть необязательным. Параметр считается необязательным, если для него определено значение по умолчанию. Все необязательные параметры должны обязательно следовать в конце списка параметров. Значение по умолчанию не может быть присвоено списку параметров. Для указания массива параметров используется зарезервированное слово Paramarray. Действуют следующие правила:

При вызове процедуры/функции должны быть указаны их параметры. Допустимы две схемы сопоставления формальных и фактических параметров: «позиционные параметры» и «именованные параметры».

При использовании позиционных параметров фактические параметры формируются в виде списка параметров, разделенных запятыми. Каждый фактический параметр сопоставляется тому формальному, которому соответствует его позиция. При этом допустимо использование необязательных параметров, которым может соответствовать значение по умолчанию. Тогда список фактических параметров должен включать в себя обязательные параметры и при необходимости необязательные параметры. При этом не допускается пропуск параметров. Таким образом, если процедура имеет 3 обязательных и 5 необязательных параметров, то для указания значения 7-го параметра придётся определить все 6 предшествующих.

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

Позиционные параметры могут быть совмещены с именованными, но указание позиционных параметров после именованных недопустимо.

Пример

// a - параметр, передаваемый по значению
// b - параметр, передаваемый по ссылке
// c - параметр, передаваемый по значению. Значение по умолчанию = 'a'
Sub MyProc(a: Integer; Var b: String; c: String = "a");
Begin
    b := c;
    
//Набор операторов
End Sub MyProc;
// a - параметр, передаваемый по значению
// b - параметр, передаваемый по ссылке
// с - массив параметров вещественного типа
Sub MyProc1(a: Integer; Var b: String; Paramarray c: Array Of Double);
Begin
    
//Набор операторов
End Sub MyProc1;
// a, b, c - параметры со значением по умолчанию
Sub MyProc2(a: Integer = 0; b: String = ""; c: Boolean = False);
Begin
    
//Набор операторов
End Sub MyProc2;

// Вызов с различными вариантами указания параметров
Sub Run;
Var
    params: Array 
Of Double;
    s: String;
Begin
    MyProc(
10, s); // Указываются только обязательные параметры
    MyProc(b := s, a := 10); // Указываются обязательные именованные параметры
    MyProc(10, s, "b"); // Указываются все параметры
    MyProc1(10, s, 123); // Указываются все параметры, три последних значения формируют массив
    params := New Double[3];
    params[
0] := 1;
    params[
1] := 2;
    params[
2] := 3;
    MyProc1(
10, s, params); // Указываются все параметры, в массиве передаются три значения
    MyProc2(1, b := "a"); // Один позиционный и один именованный параметр
    MyProc2(c := True, b := "a", a := 2); // Три именованный параметра со сменой порядка указания
End Sub Run;

См. также:

Процедуры и функции