
- •Место процедур в модуле
- •Вложенные описания процедур
- •Параметры процедур
- •Пример 1. Процедуры без параметров
- •Иллюстрация свойств параметр-значение и параметр-переменная
- •Рекомендации по выбору типа формальных параметров
- •Пример 2. Процедура с параметрами
- •Пример 3. Процедура контроля алфавита вещественных чисел
- •Пример 4. Функция
- •Постановка задачи
- •Пример 5. Вычисление значений функции
- •Содержание отчета
Иллюстрация свойств параметр-значение и параметр-переменная
Дано: Значения X и Y;
процедура ABC(A: Integer; Var B: Real) с формальным параметром-значение A и параметром-переменная B, внутри процедуры значения A и B удваиваются.
implementation
Const X: Integer = 5;
Y: Integer = 6;
procedure ABC(A: Integer; Var B: Real); //A и Var B формальные параметры
begin
A:= 2*A; //А и B удваиваем
B:= 2*B;
end;
Вызовем процедуру с фактическими параметрами X и Y, распечатаем значения X и Y.
……………………
procedure Проц1_Обработки_События(……..);
ABC(X, Y); //фактические параметры X=5, Y=6
{преобразуем X и Y в строковое значение и распечатаем их, отделив табуляцией}
Label1.Caption := IntToStr(X) + #9 + IntToStr(Y);
………………
В результате будут выведены соответственно значения 10 и 12. Параметр-значение не передаёт изменённые значения из процедуры в программу. Параметр-переменная изменённое значение передаёт в программу.
Если обратиться к процедуре с фактическими параметрами ABC(X+10, Y), получим прежний результат.
Обращение к процедуре с фактическими параметрами ABC(X, Y+10) компилятор объявит ошибочным.
Рекомендации по выбору типа формальных параметров
При подстановке фактических параметров, обращаясь к подпрограмме, следите за соответствием:
количество формальных и фактических параметров должно быть одинаковое;
порядок следования формальных и фактических параметров должен совпадать;
тип фактического параметра должен совпадать с соответствующим типом формального параметра.
Без необходимости описание всех формальных параметров как параметров-переменных нежелательно по двум причинам.
Во-первых, это исключает возможность вызова процедуры с фактическими параметрами в виде выражений, что делает программу менее компактной. Во-вторых, изменённое в подпрограмме значение не всегда следует передавать в вызывающий блок. Параметрами-переменными следует объявлять только те, через которые подпрограмма в действительности передает результаты вызывающему блоку. Чем меньше параметров объявлено параметрами-переменными и чем меньше в подпрограмме используется глобальных переменных, тем меньше опасность получения не предусмотренных эффектов.
Не рекомендуется использовать параметры-переменные в заголовке функции, так как функция сама возвращает единственное значение. Если результатом работы подпрограммы должно быть несколько значений, то её следует оформить в виде процедуры.
Пример 2. Процедура с параметрами
Дано: несколько текстовых полей для ввода вещественных чисел.
Требуется: разработать процедуру, контролирующую ввод символов алфавита вещественных чисел используя механизм передачи данных посредством параметров.
{Параметр Var Symb - формальный параметр-переменная обеспечит передачу введённого символа из процедуры Inp_Real2 в вызывающую процедуру}
procedure Inp_Real2(Var Symb: Char);
begin
If Not (Symb in ['0'..'9', ',', '-', '+', #8]) //допустимые символы
then Symb := #0 ; //подмена недопустимого символа пустым значением
end;
{Вызов процедуры Inp_Real2 процедурой TForm1.LabeledEdit1KeyPress }
procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin
Inp_Real(Key); {Key - фактический параметр, значение будет передано в
вызывающую процедуру TForm1.LabeledEdit1KeyPress}
end;
По аналогии с Inp_Real2 можно разработать процедуру для ввода целых чисел, она будет отличаться только множеством допустимых символов. Недостаток процедуры Inp_Real2 - не исключает ввода нескольких запятых.