Циклические ссылки между модулями возможны при определенных ограничениях.
Раздел 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
begin
System.Console.WriteLine('PascalABC.NET');
end.
По умолчанию в каждой секции uses неявно первым подключается системный модуль PABCSystem, содержащий стандартные константы, типы, процедуры и функции. Даже если секция uses отсутствует, модуль PABCSystem подключается неявно. Кроме того, по умолчанию с помощью неявной директивы $reference подключаются сборки System.dll, System.Core.dll и mscorlib.dll, содержащие основные .NET-типы.
Поиск глобальных имен осуществляется вначале в текущем модуле или основной программе, затем во всех подключенных модулях и пространствах имен, начиная с самого правого в секции uses и заканчивая самым левым. При этом считается, что пространство имен более правого модуля вложено в пространство имен более левого. Таким образом, конфликта имен не происходит. Если необходимо использовать имя из конкретного модуля или пространства имен, следует использовать запись
или
В качестве имени модуля может выступать также имя основной программы если у нее присутствует заголовок 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 программа-линковщик помещает в него только те подпрограммы, переменные, типы и константы, которые используются (вызываются) в основной программе. При компиляции же библиотеки в нее добавляются все подпрограммы, потому что неизвестно, какие подпрограммы потребуются конкретному приложению.
* Библиотеки .dll при выполнении программы полностью загружаются в оперативную память.