Выбрать главу

Раздел интерфейса включает объявление всех имен, которые экспортируются данным модулем в другие модули (при подключении его в разделе uses). Это могут быть константы, переменные, процедуры, функции, классы, интерфейсы. Реализация методов классов может быть дана прямо в разделе интерфейса, но это не рекомендуется.

Раздел реализации содержит реализацию всех процедур, функций и методов, объявленных в разделе интерфейса. Кроме этого, в разделе реализации могут быть описания внутренних имен, которые не видны вне модуля и используются лишь как вспомогательные.

Раздел инициализации и раздел финализации представляют собой последовательность операторов, разделяемых символом ;. Операторы из раздела инициализации модуля выполняются до начала основной программы, операторы из раздела финализации модуля - после окончания основной программы. Порядок выполнения разделов инициализации и разделов финализации подключенных модулей непредсказуем. Как раздел инициализации, так и раздел финализации могут отсутствовать.

Вместо разделов инициализации и финализации может присутствовать только раздел инициализации в виде

begin

последовательность операторов

end.

Например:

unit Lib;

interface

uses GraphABC;

const Dim = 5;

var Colors: array [1..Dim] of integer;

function RandomColor: integer;

procedure FillByRandomColor;

implementation

function RandomColor: integer;

begin

Result := RGB(Random(255),Random(255),Random(255));

end;

procedure FillByRandomColor;

begin

for i: integer := 1 to Dim do

Colors[i] := RandomColor;

end;

initialization

FillByRandomColor;

end.

Циклические ссылки между модулями возможны при определенных ограничениях.

Раздел uses

Раздел uses имеет вид

uses список имен;

Имена в списке перечисляются через запятую и могут быть либо именами подключаемых внешних модулей PascalABC.NET, либо пространствами имен .NET. Например:

uses System, System.Collections.Generic, MyUnit;

Здесь MyUnit - модуль PascalABC.NET, представленный в виде исходного текста или откомпилированного .pcu-модуля, System и System.Collections.Generic - пространства имен .NET.

В модуле или основной программе, которая содержит раздел uses, можно использовать все имена из подключаемых модулей PascalABC.NET и пространств имен .NET. Основное отличие между модулями и пространствами имен .NET состоит в том, что модуль содержит код, а пространства имен .NET содержат лишь имена - для использования кода его необходимо подключить с помощью директивы компилятора {$reference ИмяСборки}, где ИмяСборки - имя dll-файла, содержащего .NET-код. Другое не менее важное отличие состоит в том, что в модуле или основной программе нельзя использовать имена, определенные в другом модуле, без подключения этого модуля в разделе uses. Напротив, если сборка .NET подключена директивой $reference, то можно использовать ее имена, явно уточняя их пространством имен, не подключая это пространство имен в разделе uses. Например:

begin

System.Console.WriteLine('PascalABC.NET');

end.

По умолчанию в каждой секции uses неявно первым подключается системный модуль PABCSystem, содержащий стандартные константы, типы, процедуры и функции. Даже если секция uses отсутствует, модуль PABCSystem подключается неявно. Кроме того, по умолчанию с помощью неявной директивы $reference подключаются сборки System.dll, System.Core.dll и mscorlib.dll, содержащие основные .NET-типы.

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

ИмяМодуля.Имя

или

ИмяПространстваИменNET.Имя

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

Упрощенный синтаксис модуля

Упрощенный синтаксис модулей без разделов интерфейса и реализации имеет вид:

unit имя модуля;

раздел описаний

end.

или

unit имя модуля;

раздел описаний

begin

раздел инициализации

end.

В разделе описаний описываются константы, переменные, процедуры, функции, классы, интерфейсы. Все имена экспортируются. Упрощенный синтаксис модулей удобно использовать при начальном обучении - модуль отличается от программы только заголовком и, возможно, отсутствием раздела операторов.

Циклические ссылки между модулями

Циклические ссылки модулей в интерфейсных частях запрещены. Например, следующая ситуация ошибочна:

unit A;

interface

uses B;

implementation

end.

unit B;

interface

uses A;

implementation

end.

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

Однако, если одна ссылка находится в интерфейсной части, а вторая - в части реализации, или обе - в частях реализации, то циклические ссылки в этом случае разрешены:

unit A;

interface

implementation

uses B;

end.

unit B;

interface

uses A;

implementation

end.

Библиотеки dll

Библиотеки dll (dynamically linked libraries):

* содержат группу взаимосвязанных подпрограмм

* находятся в откомпилированном файле

* предназначены для обращения к ним из различных программ

Они находятся в файле с расширением .dll либо в текущем каталоге приложения (локальные), либо в системном каталоге (глобальные библиотеки). Глобальными библиотеками могут пользоваться одновременно несколько приложений.

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

Отличия библиотек от модулей

* При создании из модулей исполняемого файла .exe программа-линковщик помещает в него только те подпрограммы, переменные, типы и константы, которые используются (вызываются) в основной программе. При компиляции же библиотеки в нее добавляются все подпрограммы, потому что неизвестно, какие подпрограммы потребуются конкретному приложению.