Структура модуля аналогична структуре программы, однако есть несколько существенных различий. Например, рассмотрим модуль:
unit <идентификатор>; interface uses <список модулей>; { Необязательный } { глобальные описания } implementation uses <список_модулей>; { Необязательный } { локальные описания } { реализация процедур и функций } begin { код инициализации } end.
Заголовок модуля начинается зарезервированным словом unit, за которым следует имя модуля (идентификатор) точно так же, как и в случае имени программы. Следующим элементом в модуле является ключевое слово interface. Оно обозначает начало интерфейсной секции модуля - части, доступной всем другим модулям или программам, в которых он используется.
Программный модуль может использовать другие модули, для этого они определяются в операторе uses. Оператор uses (если он имеет место) может содержаться в двух местах. Во-первых он может следовать сразу после ключевого слова interface. В этом случае любые константы и типы данных, описанные в интерфейсной секции этих модулей, могут использоваться в любом описании в интерфейсной части данного модуля.
Во-вторых, он может следовать немедленно за ключевым словом implementation. В этом случае все описания из этих модулей могут использоваться только в секции реализации.
Интерфейсная секция
Интерфейсная часть - "общедоступная" часть в модуле - начинается зарезервированным словом interface, следует сразу после заголовка модуля и заканчивается перед зарезервированным словом implementation. Интерфейс определяет, что является "видимым" (доступным) для любой программы (или модуля), использующей данный модуль.
В интерфейсной части (секции) модуля можно определять константы, типы данных, переменные, процедуры и функции. Как и в программе, они могут быть расположены в любом порядке, и секции могут встречаться повторно (например, ваша программа может содержать секцию var, за которой следует секция const, а затем другая секция var).
Процедуры и функции, видимые для любой программы, использующей данный модуль, описываются в секции интерфейса, однако их действительные тела - реализации - находятся в секции реализации. Вам не нужно использовать описания forward, и они не допускаются. В интерфейсной части перечисляются все заголовки процедуры и функции. Секция реализации содержит программную логику процедур и функций.
Секция реализации
Секция реализации - "приватная" часть - начинается зарезервированным словом implementation. Все, что описано в секции интерфейса, является видимым в секции реализации: константы, типы, переменные, процедуры и функции. Кроме того, в секции реализации могут быть свои дополнительные описания, которые не являются видимыми для программ, использующих этот модуль. Программа не знает об их существовании и не может ссылаться на них или обращаться к ним. Однако, эти скрытые элементы могут использоваться (и, как правило, используются) "видимыми" процедурами и функциями, то есть теми подпрограммами, чьи заголовки указаны в секции интерфейса.
Оператор uses может содержаться в секции реализации (implementation) и должен непосредственно следовать за ключевым словом implementation.
Обычные процедуры и функции, описанные в интерфейсной секции, то есть те из них, которые не являются подставляемыми (inline), должны повторно указываются в секции реализации. Заголовок procedure/function должен быть или идентичным тому, который указан в секции интерфейса, или иметь более краткую форму. В случае краткой формы наберите ключевое слово (procedure или function), а за ним укажите имя подпрограммы (идентификатор). Затем подпрограмма должна содержать все свои локальные описания (метки, константы, типы, переменные и вложенные процедуры и функции), за которыми должно находиться основное тело самой подпрограммы. Пусть в интерфейсной части указаны следующие описания:
procedure ISwap(var V1,V2 : integer); function IMax(V1,V2 : integer) : integer;
Тогда Секция реализации будет иметь следующий вид:
procedure ISwap; var Temp := integer; begin Temp := V1; V1 := V2; V2 := Temp end; {конец процедуры Swap} function IMax(V1,V2 : integer) : integer; begin if V1 > V2 then IMax := V1 else IMax := V2 end; { конец функции Max }
Подпрограммы, локальные для секции реализации (то есть не описанные в секции реализации), должны иметь полный (несокращенный) заголовок procedure/function.
Секция инициализации
Обычно вся секция реализации модуля заключена между зарезервированными словами implementation и end. Однако, если перед end поместить зарезервированное слово begin, а между ними - операторы, то получившийся составной оператор, очень похожий на основное тело программы, становится секцией инициализации модуля (initialization).
Секция инициализации представляет собой место, где инициализируются структуры данных (переменных), которые использует программный модуль или которые он делает доступными программе, использующей данный модуль. Вы можете использовать эту секцию для открытия файлов, которые программа использует позднее.
При выполнении программы, использующей некоторый модуль, секция инициализации этого модуля вызывается перед запуском основного тела программы. Если программа использует более одного модуля, то секции инициализации всех модулей вызываются (в порядке, указанном в операторе uses в программе) перед тем, как выполнить основное тело программы.
8 8 8
| |