
- •Введение
- •Структура модуля
- •Заголовок модуля
- •Подключение модулей
- •Раздел интерфейса
- •Раздел реализации
- •Раздел инициализации
- •Раздел деинициализации
- •Разработка приложений с использованием модулей
- •Организация файлов в каталоге программы
- •Оформление Windows программ
- •Стандартные модули
- •Модуль System
- •Модуль Math
- •Модуль SysUtils
- •Задания к лабораторной работе
- •Вопросы к лабораторной работе
- •Приложение А

Лабораторная работа №8 Модули
Введение
В лабораторной работе рассмотрены модули Object Pascal, назначение каждой секции модуля, приведен пример модуля. Также рассмотрены некоторые стандартные модули Object Pascal. Приведен пример работы с файлами ресурсов Windows.
Модуль – это автономно компилируемая программная единица, включающая в себя различные компоненты интерфейсного раздела (типы, константы, переменные, подпрограммы) и, возможно, некоторые операторы инициирующего раздела. Объекты описанные в интерфейсной части доступны для других модулей и основной программы. Тела процедур и функций располагаются в разделе реализации модуля и скрыты от пользователя.
Структура модуля
Модуль в Object Pascal имеет следующую структуру:
unit <имя_модуля>; interface
<раздел интерфейса>
implementation
<раздел реализации>
initialization
<раздел инициализации>
finalization
<раздел деинициализации>
end.
Рассмотрим подробнее назначение каждого элемента модуля.
<имя_модуля> |
– правильный идентификатор Object Pascal, заголовок модуля; |
interface |
– зарезервированное слово, начинает раздел интерфейса модуля; |
implementation |
– зарезервированное слово, начинает раздел реализации модуля; |
initialization |
– зарезервированное слово, начинает раздел инициализации модуля; |
finalization |
– зарезервированное слово, начинает раздел деинициализации модуля; |
end |
– зарезервированное слово, признак конца модуля. |
Таким образом модуль состоит из заголовка и четырех разделов. Обязательным является только раздел интерфейса и реализации, остальные разделы могут отсутствовать. Обратите внимание, что если присутствует секция деинициализации, то секция инициализации является обязательной.

Заголовок модуля
Заголовок модуля состоит из зарезервированного слова unit и следующего за ним имени модуля. Имя модуля – правильный идентификатор Object Pascal, совпадающий с именем файла модуля. Например если модуль имеет имя Unit1, то имя файла модуля Unit1.pas.
Подключение модулей
Для подключения модуля к основной программе или к другому модулю необходимо использовать следующую конструкцию
uses <имя_модуля>, < имя_модуля >, ...;
где uses – зарезервированное слово.
Объявление uses может следовать за зарезервированными словами interface, implementation в модулях. Например:
unit MyUnit; interface
uses Windows, MySecondUnit;
<раздел интерфейса>
implementation
<раздел реализации>
end.
Для подключения модуля к программе необходимо разместить uses сразу после объявления program, перед любыми другими объявлениями, например:
program TestPrg;
uses Windows, MySecondUnit;
begin
end.
Возможен еще один вариант подключения, с явным указанием положения файла модуля.
uses <имя_модуля> in '<имя файла>', ...;
После in указывается полное или относительное имя файла, например
uses test in 'test.pas'; //в каталоге программы
uses test in 'units\test.pas'; //в подкаталоге units каталога программы
uses test in '..\units\test.pas';//в подкаталоге units, родительского каталога
uses test in 'c:\lib\test.pas';//абсолютный путь
Вобщем случае компилятор ищет файлы модулей по следующему алгоритму:
•если явно указан путь до файла, то проверяется его наличие;
•если путь явно не указан, то поиск происходит в следующем порядке:
◦каталог программы;
◦каталоги для поиска указанные в настройках среды.
Для установки списка каталогов в которых необходимо осуществлять поиск модулей необходимо вызвать диалоговое окно из меню Option>Directories, рисунок 1. На вкладке units можно ввести дополнительные пути для поиска. Кроме того, в путях возможно использование переменных приведенных в таблице 1, а также знаков «*» и «?». Для использования переменной передней нужно указать знак «$» (рисунок 1).

Таблица 1 – Переменные доступные для использования в путях поиска
После компиляции модуля создаются файлы с расширением ppu, содержащие описания типов, требуемые o-файлы и другую информацию. Файлы с расширением о содержат машинный код модуля программы.
При компиляции программы компилятор сначала ищет откомпилированные файлы модулей и, если они отсутствуют, то сначала компилирует исходные файлы модулей в ppu и o файлы, а затем «собирает» приложение используя данные из откомпилированных модулей. Если файл исходного текста модуля доступен и «младше» чем файлы откомпилированного модуля, то ppu и o файлы будут удалены, а компиляция модулей будет выполнена повторно.
Для удачной перекомпиляции программы не требуются исходные файлы модулей (pas), а достаточно лишь откомпилированных файлов модулей (ppu и o). Следует иметь ввиду, что внести изменения в откомпилированные файлы модулей невозможно. Поэтому если возможность внесения изменений в текст модуля является важной, то необходимо также сохранять исходные файлы модулей. Преимуществом использования откомпилированных файлов модулей является то, что возможна поставка библиотек функций без раскрытия исходного кода, что часто применяется при коммерческой поставке библиотек подпрограмм.
Раздел интерфейса
Раздел интерфейса модуля открывается зарезервированным словом interface. В этом разделе содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:
unit Tables;

interface |
|
|
type TStudent=record |
|
|
name |
:string[12]; |
//имя |
familia |
:string[16]; |
//фамилия |
gruppa |
:Integer; |
//группа |
end; |
|
|
//выводит меню, возвращает результат выбора function ShowMenu:Integer;
//добавление записи в конец массива procedure AddRecord;
//печать таблицы
procedure ShowAllRecord;
Если включить этот модуль в состав предложения uses в другом модуле или программе, то в них будут доступны тип TStudent и перечисленные подпрограммы.
Раздел реализации
Раздел реализации начинается зарезервированным словом implementation и содержит обязательно содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты – вспомогательные типы, константы, переменные и подпрограммы, а также метки, если они используются в разделе инициализации.
Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных параметров (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, например:
unit Tables;
interface
type TStudent=record
name :string[12]; //имя familia:string[16]; //фамилия gruppa :Integer; //группа end;
//выводит меню, возвращает результат выбора function ShowMenu:Integer;
//добавление записи в конец массива procedure AddRecord;
implementation |
|
|
const n=10; |
//емкость массива |
|
var Table:array [1..n] of TStudent; |
//таблица |
Count:integer; //число строк в таблице
function ShowMenu:Integer; begin
writeln;
writeln('Viberite deistvie'); writeln('0 - Exit program');