ВВЕДЕНИЕ
Модуль - это удобная возможность языка Turbo Pascal оптимизировать
свои программы и сделать их более простыми для создания и прочтения.
Кроме того, однажды созданные модули могут быть использованы после
при написании многих программ, то есть являются универсальным
инструментом. Вы уже знакомы с понятием модуля по стандартным
вроде CRT или DOS. Но до сегодняшнего дня в рассылке рассказывалось
лишь о том, как подключить к программе готовые файлы. Сегодня
я научу Вас создать свои модули, собрав их из собственных процедур
и функций. Для чего может потребоваться написание своего модуля,
понятно. При создании большой программы появляется такое огромное
количество функций, что разбираться с ними становиться тяжело.
Программа запутывается и становится трудночитаемой. Модули же
позволяют разбить функции на отдельные файлы по тематическим группам.
При этом подключать их к основной программе по мере необходимости,
то есть составлять программу по кирпичикам, из отдельных составляющих.
Вторая причина создания модуля это желание оформить частоиспользуемые
процедуры для дальнейшего их применения, то есть чтобы потом не
копировать их код в разные программы.
Итак, модуль - это отдельная, оформленная особым образом программа,
которая позволяет соединить в себе все определяемые программистом
элементы языка для дальнейшего их использования. Это процедуры,
функции, типы и переменные. К типам и переменным может относиться
все, что угодно. Например, можно переопределить тип Integer, назвав
его, скажем, Intg. Или создать свою иерархию объектов, которые
будут инкапсулировать свои методы и свойства в рамках отдельного
модуля.
КАК ВЫГЛЯДИТ МОДУЛЬ
Сам исходный текст модуля не сильно отличается от обычной программы
и имеет привычное расширение .pas. Однако присутсвуют отличия
в компиляции и формате выходного файла. Компилированные модули
в Turbo Pascal храняться в отдельных файлах с расширением .tpu
(turbo pascal unit) или .tpp (turbo pascal protect), это в случае,
если модули компилируются в защищенном режиме. При этом если данный
модуль используется в программе, требуется присутсвие самого файла
модуля. Надо отметить, что если модуль не был скомпилирован заранее,
то есть нет tpu файла, а есть лишь исходный текст модуля (pas),
то он будет скопмилирован "на лету" и после компиляции вы сможете
лицезреть не только привычный .exe, но и свежесформированный .tpu.
Также для использования модуля совсем не обязательно иметь файл
.pas, т.е. исходник этого модуля. (Вспомните стандартные модули
- исходников на них нет). То есть для использования достаточно
иметь файл .tpu.
ПОДСКАЗКА
Pretected mode (защищенный режим) - режим, который подерживает
всю оперативную память компьютера. Данный режим поддерживается
компилятором Borland Pascal. Кстати, режим, в котором мы пишем
сегодня называется real mode (реальный режим). И поддерживает
он лишь первые 640 кбт памяти.
К основной программе модуль подключается с помощью служебного
слова uses, то есть все, как с обычными стандартными модулями.
СТРУКТУРА МОДУЛЯ
Модуль состоит из двух больших частей. Первая часть содержит
заголовки описываемых процедур, переменных и типов, которые будут
доступны извне. Это часть называется интерфейсной и озаглавливается
как "interface". Вторая часть содержит уже код процедур, который
не доступен внешним программам. Эта часть называется "реализация"
и озаглавливается как implementation. В разделе implementation
помещается исходный код всех процедур.
Модуль всегда начинается служебным словом unit (модуль). Присутсвие
этого заголовка, в отличии от слова Program, обязательно. Именно
по нему Turbo pascal будет определять, что нужно компилировать
модуль, а не программу. Заметьте, модуль нельзя запустить на выполнение
(Ctrl+F9), так как он не является выполнимым.
Также в модуле может иметься раздел begin-end, в котором при
необходимости можно разместить код, выполняющийся при подключении
модуля. Если эта возможность не требуется, данный раздел можно
опустить.
Итак, давайте представим общий вид модуля на практике. Пусть
нам нужно заложить в нем одну единственную функцию, которая считает
количество строк в текстовом файле.
unit my_unit; {имя модуля. обязательно. }
{ начало интерфейсной части - описываем процедуры }
interface
Function GetLines(fName: String): Word;
{fName - имя файла. Функция возвращает кол-во строк}
{ начало выполнимой части - наш код }
implementation
Function GetLines(fName: String): Word;
var
F: Text;
S: String;
I: Word;
begin
I := 0;
Assign(F, fName);
Reset(F);
While not EOF(F) do
begin
Readln(F, S);
Inc(I);
end;
GetLines := I;
Close(F);
end;
end.
Как видите, все очень просто. Давайте представим данный исходник
в виде схемы, так многим понятнее и позволит быстрее разобраться.
1 шаг. Указываем имя модуля.
2 шаг. Раздел "interface" - опишем все, что будет доступно
извне.
3 шаг. Раздел "implementation" - исходный код модуля.
4 шаг. Конец модуля. Слово "end" или раздел "begin-end".
Вот, такие простые и понятные четыре шага. Главное запомнить
как пишутся служебные слова, особенно implementation :)
ИСПОЛЬЗОВАНИЕ МОДУЛЯ В ПРОГРАММЕ
Нет ничего проще. Мы пишем в начале программы "uses имя_модуля",
далее используем все, что нам этот модуль предоставляет, то есть
данные раздела interface. Вот программа, которая использует наш
модуль "my_unit".
Program My_program;
uses my_unit;
begin
Write(GetLines("1.txt"));
Readln;
end;
Советую протестировать ее следующим образом: прямо в среде Паскаля
создайте файл 1.txt и запишите в него любое количество строк.
Например так:
11111111
222222
33333
444444444
555
6666666
77777777777
Запустите и поймете, что произошло. Надеюсь как это произошло
тоже :))
ЭКСПОРТ ТИПОВ
В нашем примере мы экспортировали из модуля одну функцию, а как
экспортировать типы и переменные? Давайте посмотрим на наглядном
примере.
Пусть нам нужно в программе иметь тип, который представляет собой
запись с двумя полями. Для того, чтобы описать ее в модуле и использовать
в программе, нужно просто поместить в раздел interface подраздел
type и описать в нем эту запись. Вот пример такого экспорта:
unit my_unit;
interface
type
A = record
Name: string;
Phone: string;
end;
........
Соответсвенно, в основной программе мы без проблем сможем использовать
переменные данного типа.
ДРУГИЕ ВОЗМОЖНОСТИ
Существуют некоторые дополнительные возможности при написании
модуля, о которых не было сказано выше. Вот основные из них.
- Модуль может использовать любые другие модули в самом себе.
При этом они могут подключаться как в разделе interface, так
и в разделе implementation. Кстати, повторяться uses не должен,
то есть написать можно либо в interface, либо в implementation.
- В разделе implementation могут быть любые процедуры, не описанные
в interface. При этом они будут принадлежать только модулю и
недоступны извне. Та же история и с переменными, типами, константами
и т.п.
- Файл с исходником модуля должен иметь то же имя, которое указано
в заголовке unit. К примеру, модуль озаглавленный как "unit
my_unit" должен быть сохранен на диске с именем my_unit.pas.
РЕЗЮМЕ
Вот и вся основная информация по модулям Turbo Pascal. Как видите,
данная тема не отличается особой сложностью и не несет много нового
материала. Создание модулей сводиться не к умению их оформлять
(это на первых порах можно делать и с помощью подсказки), а к
умению составлять законченные процедуры и функции.
На этом все, до встречи!