| ||||||||||||||||||||||||||
|
3. Организация собственного модуля программиста.В Turbo Pascal возможен доступ к большому числу встроенных констант, типов данных, переменных, процедур и функций. Количество различных программ велико, но почти никогда они все сразу в программах не используются. Все эти программы разделены на связанные между собой группы, называемые модулями, и Вы можете использовать только те модули, которые Вам необходимы. В модуле можно представить набор констант, типов данных, переменных, процедур и функций. Каждый модуль аналогичен отдельной программе, т.е. имеет: главное тело, которое вызывается перед стартом программы и производит необходимые действия по инициализации, когда это необходимо. Каждый модуль - это библиотека объявлений, которую можно вставить и использовать внутри программы, что позволяет разделить программу на части и компилировать их отдельно. Например, модуль CRT содержит все объявления для программ работы с экраном. 3.1. Структура модуля.Модуль обеспечивает набор средств, благодаря возможности использования процедур и функций, поддерживающих константы, типы данных и переменных. Важно понимать, что модуль сам по себе не является выполняемой программой - его объекты используются другими программными единицами. Все программные ресурсы модуля можно разбить на две части: объекты, прямо предназначенные для использования другими программами или модулями, и объекты рабочего характера. В соответствии с этим модуль, кроме заголовка, имеет две основные части, называемые интерфейсом и реализацией. В интерфейсной части модуля сосредоточены описания объектов, доступных из других программ; такие объекты называют видимыми вне модуля. В части реализации помещаются рабочие объекты, называемые также невидимыми или скрытыми. Все объявления и описания модуля становятся доступными программе, использующей его. Структура модуля похожа на структуру программы, но имеет и
отличия: Заголовок модуля - слово UNIT, за которым следует имя модуля. Следующий элемент - ключевое слово INTERFACE. Это слово обозначает начало раздела интерфейса модуля, доступного для всех других модулей и программ, использующих этот модуль. В предложении uses указываются модули, которые может использовать этот модуль. Слово uses может появляться в двух
местах: 3.2. Раздел интерфейса.Это "открытая" часть модуля, она начинается ключевым словом INTERFACE, следующим сразу за заголовком, и ограничена ключевым словом IMРLЕMENTATION. Интерфейс определяет, что является видимым (доступным) для некоторой программы (или других модулей), использующих этот модуль. Любая программа, использующая этот модуль, имеет доступ к этим видимым элементам. В интерфейсе модуля можно объявить константы, типы данных, переменные, процедуры и функции. Процедуры и функции, доступные для программы, использующей этот модуль описываются в разделе интерфейса. А их действительные тела - операторы, реализующие их, - в разделе реализации. Объявление forward не разрешается. Тела всех обычных процедур и функций находятся в разделе реализации после раздела интерфейса, в котором перечислены их имена и заголовки. uses может появиться и в разделе implementation. Если в разделе реализации имеет место uses, то это слово следует сразу же за словом implementation. 3.3. Раздел реализации.Раздел реализации - закрытая, недоступная часть - начинается со слова IMPLEMENTATION. Все, что объявлено в части интерфейса видимо для раздела реализации: константы, типы, переменные, процедуры и функции. Кроме того, в разделе реализации могут быть свои собственные дополнительные объявления, недоступные программам, использующим этот модуль. Программы не могут обращаться и ссылаться на них. Однако эти недоступные элементы могут использоваться (и, как правило, это делается) видимыми процедурами и функциями, заголовки которых появляются в разделе интерфейса. Предложение uses может появляться в разделе implementation. В этом случае uses следует непосредственно за ключевым словом implementation. Если процедуры были объявлены как внешние, то в исходном файле должна быть директива {$L имя файла} в любом месте до конца модуля. Обычные процедуры и функции, объявленные в разделе интерфейса -
которые не являются встроенными - должны появляться в разделе реализации.
Заголовок procedure (function)
в разделе реализации должен быть такой же, как и в разделе интерфейса, или же
иметь короткую форму. В краткой форме за ключевым словом (procedure или function) следует имя
процедуры или функции. Подпрограмма содержит свои собственные локальные
объявления (метки, константы, типы, переменные, процедуры и функции). За ними
следует тело главной программы. Например, в разделе интерфейса
объявлены: Подпрограммы раздела реализации (неописанные в секции интерфейса), должны иметь полный заголовок procedure/funсtion. 3.4. Раздел инициализации.Раздел реализации модуля заключен между словами implementation и end. Но если присутствует слово begin перед end, и операторы между этими словами, то получившийся составной оператор, похожий на тело главной программы, становится разделом инициализации модуля. В разделе инициализации инициализируются структуры данных (переменных), используемые модулем или доступные программам, использующим этот модуль. Вы можете использовать этот раздел для открытия файлов. Например, стандартный модуль Printer использует этот раздел для открытия на вывод текстового файла Lst. Файл Lst впоследствии можно использовать в программах, в операторах Write или Writeln. При выполнении программы, использующей некоторый модуль, раздел инициализации вызывается перед выполнением тела главной программы. Если в программе используется несколько модулей, раздел инициализации каждого модуля вызывается (в порядке, указанном в операторе uses программы) до выполнения тела главной программы. Рассмотрим простейший пример модуля. Чтобы избежать многократного
описания в различных программах некоторых общеупотребительных типов данных,
можно сосредоточить их в одном модуле. Например, описания, связанные с датами,
месяцами, днями и т.д. Данный модуль не содержит разделов реализации и инициализации. Процедуры и функции могут использоваться в модулях наравне с другими Pascal - объектами. Можно считать, что заголовок подпрограммы является ее интерфейсом (т.к. содержит информацию, необходимую для ее вызова: ее имя, количество и типы параметров и для функций - тип результата), а тело подпрограммы - реализацией (тело подпрограммы содержит блок, раскрывающий ее алгоритм). В соответствии с этой точкой зрения в интерфейсной части модуля должны быть представлены только заголовки процедур и функций, видимые (доступные) для других программ (аналогично предварительным описаниям, но без служебного слова forward), а их полные описания будут содержаться в разделе реализации. В качестве примера разберем построение модуля, предназначенного для
построения рамки (для вывода информации в текстовом режиме): Таким образом, механизм модулей позволяет скрыть детали реализации тех или иных программных подсистем, предоставив в распоряжение использующих программ строго определенную совокупность интерфейсных объектов. Если необходимо, например, расширить модуль Servis введением новых процедур или изменить реализацию какой-либо процедуры, то если интерфейс модуля при этом останется неизменным, такая модификация никак не отразится на использующих программах. 3.5. Компиляция и использование модулей.Модуль компилируется таким же образом, как и обычные подпрограммы; возможна компиляция из интегрированной среды или с помощью командной строки. Но так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется файл с расширением .TPU (Turbo Pascal Unit), при этом имя файла (с расширением .TPU) должно совпадать с именем файла с исходным текстом модуля. С помощью режима Compile главного меню системы Турбо Паскаль откомпилируем текст Servis. Для этого в меню Compile установим опцию Destination Disk (вместо Destination Memory) и откомпилируем с помощью опции Compile. На диске создается файл SERVIS.TPU. После выполнения компиляции и создания файла SERVIS.TPU на диске элементы (процедуры и функции) библиотечного модуля Servis доступны для использования без каких-либо дополнительных описаний. Для того, чтобы получить доступ к интерфейсным объектам модуля, необходимо указать в программе имя нужного TPU-файла. Соответствующая конструкция называется спецификацией используемых модулей и имеет следующий вид: uses U1, U2, U3; где uses - служебное слово, U1, U2, U3 - идентификаторы используемых модулей. Эта специфика должна идти непосредственно после заголовка программы; если некоторый модуль использует объекты другого модуля, то такая спецификация должна следовать сразу после служебного слова interface. Например, чтобы вызвать модуль Servis нужно записать следующую
строку в программе: uses Servis;. Пользователь постепенно может расширять список процедур в библиотеке
своими, более совершенными средствами. Рассмотрим пример модуля, позволяющего
подключить к работе программы манипулятор "мышь". Для проверки работоспособности модуля запустим программу MouseDemo,
текст которой приводится ниже: |
| ||||||||||||||||||||||||
| ||||||||||||||||||||||||||
© Copyright(c) 2004 Amro Group. All rights reserved |
|