Delphi. Урок 20. Юниты

Уроки для начинающих   23 октября 2013  Автор статьи: admin 

Юниты в Delphi служат для вынесения каких-либо классов, процедур, функций, переменных и объектов в отдельные файлы. Это позволяет грамотно организовать структуру проекта в IDE RAD Studio. В очень маленьких проектах, состоящих из 100-500 строк можно обойтись и без создания отдельных юнитов, но если же вы рассчитываете, что ваш проект разрастется хотя бы до пары тысяч строк кода, то без грамотной организации структуры кода обойтись будет просто невозможно. Юниты (unit) позволяют разделить ваш проект на различные «группы», содержащие классы и их реализации. Ведь согласитесь, что будет гораздо удобнее в отдельном файле кода иметь реализацию пользовательского интерфейса (User Interface), в отдельном файле — реализацию логики работы, базовые классы, выполняющие основной функционал, а в отдельный юнит можно вынести, например, какие-либо утилитарные функции. Создать новый юнит в проекте очень просто. Достаточно обратить внимание на Project Manager, в нем выбрать нужный проект (Project1.exe) в группе проектов (ProjectGroup1), кликнуть по нему правой кнопкой мыши и выбрать «Add New -> Unit»:
Project Manager, создание юнита в проекте
Итак, в проекте был создан пустой юнит. Выглядеть он должен так:

unit Unit2;

interface

implementation

end.
Теперь его необходимо сохранить в папку с нашим проектом, и его имя будет соответствовать названию файла, которое мы зададим при сохранении. Кстати говоря, если сохранить файл юнита не прямо в папку с проектом, а например создать в этой папке подпапку, то в Project Manager этот юнит также отобразится внутри папки. Это бывает удобно в крупных проектах, т.к. можно поделить все юниты еще и на какие-то смысловые категории. Выглядеть это будет так:
Project Manager, добавление unit в проект
Рассмотрим синтаксис нашего нового юнита:
[cc lang=»delphi»]unit Unit2;

interface

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

{Область Interface. Здесь находятся описания типов, объектов и процедур, которые БУДУТ ВПОСЛЕДСТВИИ ВИДНЫ в других
модулях, если к ним подключить данный}

type
{описания типов и классов, к которым БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный}
var
{описания объектов и переменных, к которым БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный}

implementation {Реализация}

uses {здесь могут быть перечислены имена юнитов, которые могут использоваться только в реализации классов или функций/процедур }

type
{описания типов и классов, к которым НЕ БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный}
var
{описания объектов и переменных, к которым НЕ БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный}

{реализация классов, описанных выше в разделе type областей interface и implementation данного юнита}

end.[/cc]
По логике вещей это тот же самый юнит, который создается автоматически при создании VCL приложения, но только он абсолютно пустой. После ключевого слова unit следует название самого юнита, которое должно соответствовать имени файла (без расширения). Это название нам потом пригодится, для того чтобы подключать одни юниты к другим, тем самым разрешая использовать возможности данного юнита в другом.
[important]Все, что описано в области interface, будет доступно из других модулей, если данный модуль к ним подключить. Здесь могут находиться описания классов (только описания!), описания процедур и функций (если они не являются методами класса, то тогда достаточно будет просто указать их заголовок с параметрами в области interface), переменные, объекты, константы. Вся реализация должна находиться после ключевого слова implementation (которое в переводе как раз и означает «реализация»). В «реализации» также могут находиться описания и других типов, классов, переменных, объектов, процедур, но только тогда они никак не могут быть доступными из других юнитов.[/important]
[tip]Чтобы сделать «что-то» доступным для других юнитов (при условии подключении данного юнита в разделе uses), необходимо описание «этого» поместить в область interface.[/tip]
Теперь поговорим о подключении юнитов друг к другу. Делается это, как вы уже поняли, для возможности использовать то, что описано в interface у подключаемых юнитов. Например, когда вы создаете новый VCL проект, то в разделе uses в области interface уже указано некоторое количество юнитов:
[cc lang=»delphi»]uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, unit2;[/cc]
Все эти юниты — это то самое многообразие классов, функций, методов и прочего, которые мы используем при разработке VCL приложения. Например, процедура ShowMessage описана в модуле Vcl.Dialogs. Если у вас версия RAD Studio ниже XE2, то названия ваших юнитов не содержат точку и приставку «System» или «Vcl» (вместо «Vcl.Dialogs» — «Dialogs»).
Ну и соответственно, чтобы подключить другой юнит к данному, нужно добавить в его раздел uses название другого юнита. Но вопрос только в какой из этих uses? Ведь в примере, представленном выше, их два. После interface и после implementation. Ответ прост. Если вы хотите использовать другой юнит не только в реализации (после implementation), но и в interface, то вам необходимо добавить этот юнит в interface. Если же использование возможностей некоторого модуля необходимо только в реализации (после ключевого слова implementation), то достаточно его добавить в uses после implementation.
[warning]Необходимо учесть, чтобы два модуля не подключали друг друга в разделе uses в области interface! Это ограничение наложено компилятором Delphi, и при его нарушении вы увидите ошибку «Circular unit reference to ‘Unit1′»[/warning]
Таким образом, вы можете использовать юниты, чтобы выносить отдельные классы и их реализации в отдельные юниты. А затем обращаться к тому, что описано в этих юнитах из других юнитов, просто подключив их в раздел uses.

Научиться программировать

  • на Delphi

  • на Java

  • на C++