Модули. Секции декларации, интерфейса и реализации. Области видимости.

На самом деле общая структура модуля при наличии в нем класса несколько сложнее. Обсудим ее более подробно.

Написание собственного модуля (unit) начинается с указания имени модуля. В нашем случае он называется myFigure. Он должен храниться в файле с тем же именем, но с расширением .pas (файл языка PASCAL), т.е. myFigure.pas.

unit myFigure;

{- секция декларации -}

interface

uses ... , m1,…; {наш модуль кроме списка модулей, автоматически созданного Delphi, использует модули m1 и т. Д.}

type

tDot=

object

active:Boolean;

X,Y:integer;

procedure Show;

procedure Hide;

procedure MoveBy(dX,dY:Integer);

procedure MoveTo(NewX_,NewY_:Integer);

procedure Init(X_,Y_,:Integer);{процедура инициализации объекта}

{если в объекте есть поля X и Y, то эти имена нельзя использовать в

качестве формальных параметров. Выход из этой ситуации — добавлять

символ _ после имени, чтобы было понятно, к использованию какого поля

объекта относится передаваемый параметр}

end;

tCircle=

object(tDot)

...

end;

procedure... {описание процедур и функций, видимых в других модулях}

var... {описание глобальных переменных, видимых в других модулях}

{- секция реализации -}

implementation

uses m2,m3; {модули m2 и m3 доступны процедурам и функциям области

реализации}

var ...; {описание глобальных переменных,доступных только в данном модуле}

{-описание реализации методов объектов-}

procedure tDot.Show;

begin

...

end;

procedure tDot.Hide;

begin

...

end;

procedure tDot.Move(dX,dY:Integer);

begin

...

end;

procedure tDot.MoveTo(NewX,NewY:Integer);

begin

...

end;

procedure tDot.Init(X_,Y_:Integer);

begin

X:=X_;

Y:=Y_;

tDot.Hide;

end;

procedure tCircle...;

begin

...

end;

...

begin {секция инициализации — обычно пустая}

end.

Декларация использования других модулей в области интерфейса аналогична вставлению соответствующих модулей (а на самом деле ссылки на модуль) вместо этой декларации. Поэтому в интерфейсе модуля m1 нельзя писать uses myFigure, т.к. тогда получилось бы, что в модуль myFigure вложен модуль m1, который, с свою очередь, вложен в модуль myFigure, т.е. myFigure вложен сам в себя. Для раздела реализации подобных ограничений нет, и в модулях m2 и m3 может стоять ссылка uses myFigure. В интерфейсе всегда надо ссылаться на модули, в которых описаны классы-прародители, а также на те, из которых надо брать определенные в них типы для использования в интерфейсе своего модуля.