4.1. Виды подпрограмм: процедуры и функции
Подпрограммы в Delphi, как и в Pascal, представлены процедурами и функциями.
Процедура — это логически законченная часть программы, описываемая отдельно от раздела описания логики программы и вызываемая по ее уникальному имени. Процедуры, так же как и программа, имеют сложную структуру, включающую в себя разделы описания переменных, констант, типов, и так далее (все они называются локальными, так как их область видимости ограничена процедурой). Единственное, чем отличается по структуре процедура от программы — в ней нет раздела подключения модулей.
Procedure <Имя>; Заголовок процедуры
Label Раздел описания локальных меток безусловного перехода
Const Раздел описания локальных констант
Type Раздел описания локальных типов данных
Var Раздел описания локальных переменных
Procedure . . . Раздел описания локальных подпрограмм процедур и функций,
Function . . . содержащих некоторые элементы логики процедуры
begin end;
Начало раздела описания логики процедуры
Раздел описания логики процедуры
Конец раздела описания логики процедуры
Функции — это процедуры, которые возвращают значения. Благодаря этому их можно использовать в арифметических или логических выражениях, наряду с переменными или константами. Структура функции аналогична структуре процедуры, за исключением заголовка, в котором указывается, значение какого типа возвращает функция. Вместо ключевого слова Procedure в описании функций используется ключевое слово Function:
Function <Имя функции>: <Тип возвращаемого значения>;
Для указания компилятору, какое именно значение должна возвращать функция, в разделе описания логики функции должно использоваться присвоение следующего вида:
<Имя функции> := <3начение>;
В Delphi предусмотрен еще один механизм возврата значения функции в вызывающую подпрограмму — ключевое слово Result:
Result := <3начение>;
Приведем пример модуля, в котором описана одна процедура и одна функция (листинг 4.1), а также программу, которая подключает этот модуль и вызывает подпрограммы, описанные в нем (листинг 4.2).
Листинг 4.1. Модуль с описанием подпрограмм
Unit Subprograms; (Заголовок модуля содержит название, по которому модуль подключается к программе)
Interface {Начало интерфейсной секции}
Procedure RunMe; (Заголовок процедуры RunMe, которая должна быть реализована в описательной секции и будет доступна в подключающем модуле}
Function GetValue: Integer; (Заголовок функции GetValue, которая должна быть реализована в описательной секции и будет доступна в подключающем модуле)
Implementation {Начало описательной секции)
Procedure RunMe;
begin
{Реализация процедуры RunMe}
end;
RunMe; GetValue;
V := GetValue;
(Вызов процедуры RunMe}
{Вызов функции GetValue без анализа
возвращаемого значения}
{Вызов функции GetValue с занесением
возвращаемого значения в переменную V}
Листинг 4.2. Программа, подключающая модуль и вызывающая его подпрограммы
Uses Subprograms; {Подключение модуля Subprograms) Var
V: Integer; {Описание целочисленной переменной}
Begin
RunMe; GetValue;
V := GetValue;
(Вызов процедуры RunMe}
{Вызов функции GetValue без анализа
возвращаемого значения}
{Вызов функции GetValue с занесением
возвращаемого значения в переменную V}