Линкфилд
Здесь может быть ваша реклама
|

 Глава 20. Пакеты компонентов

Глава 20. Пакеты компонентов

Пакеты - это специальные динамически присоединяемые компоненты (аналоги файлов so - разделяемых объектов, Shared Objects). По своему использованию пакеты делятся на:

пакеты, загружаемые во время работы приложения (runtime packages), мы их будем далее называть пакетами времени выполнения. Они содержат в себе код, компоненты и используются приложением во время выполнения. Если ваше приложение ссылается на отсутствующий пакет - оно не будет работать;

пакеты, используемые во время разработки приложения (design-time packages), будем их называть пакетами разработки. Пакеты разработки содержат в себе компоненты, редакторы свойств, мастера и другие элементы, предназначенные для работы в среде Kylix;
пакеты, которые могут работать как во время разработки приложения, так и во время работы приложения;

пакеты, не являющиеся ни пакетами времени выполнения, ни пакетами разработки. Данный вид пакетов предназначен для использования их другими пакетами. На них не могут ссылаться ни приложение, ни сама среда Kylix.

Для того чтобы пакеты можно было отличить от других динамически присоединяемых библиотек, имеющих расширение so, для пакетов используется следующее правило наименования: ЬрКимя пакетаХзо. Первые три буквы обозначают пакет библиотеки Kylix (Borland Package Library).
Так же, как и остальные динамические библиотеки, пакеты содержат код. который может быть использован одновременно несколькими приложениями. Например, самым часто используемым пакетом Kylix является bplclx. Когда вы создаете практически любое приложение в Kylix, вы используете данный пакет. Сама среда Kylix также использует данный пакет. При этом достаточно, чтобы в памяти компьютера находилась всего одна копия данного пакета для скольких угодно приложений, использующих bplclx. Ту же копию пакета будет использовать и сама среда Kylix.
Вы можете строить ваши приложения с помощью пакетов или без них. Но вы хотите использовать в своем приложении самостоятельно создан-компоненты, вам придется установить пакет, применяемый во время разработки приложения и содержащий данные компоненты.
В этой главе мы рассмотрим, для чего предназначены пакеты, как они применяются в приложениях и как можно их динамически загружать. Кроме того, рассмотрим процедуру инсталляции пакетов компонентов, научимся создавать новые пакеты и редактировать уже имеющиеся и изучим общую структуру пакета.

Для чего используются пакеты
Как мы уже говорили выше, пакеты разработки предназначены для упрощения задачи распределения и установки компонентов, созданных разработчиком. Программирование с помощью пакетов разработки, по определению, имеет некоторое преимущество по сравнению с обычным программированием, Главное преимущество - сокращение размера кода. Например, все приложения, включая среду программирования Kylix, могут одновременно использовать стандартные компоненты Kylix, расположенные в одном и том же пакете. Так как приложения не содержат отдельные копии библиотек компонентов, их размер намного меньше. Более того, время компиляции пакетов намного меньше, т. к. для конкретного приложения компилируется тот код, который ему необходим.
Для того чтобы приложение использовало пакеты, необходимо установить флажок Build with runtime package в диалоговом окне Project Options на странице Packages. Для открытия этого диалогового окна используйте пункт главного меню Kylix Project/Options. При такой компиляции приложения оно значительно сократится в размерах (примерно в 8-10 раз), но вам придется при распространении приложения передавать и все применяемые им пакеты.
Рассмотрим, когда нужно использовать пакеты, а когда - стандартные библиотеки разделяемых объектов Linux:

если вы хотите внедрить самостоятельно созданные компоненты в среду Kylix - создавайте пакеты. Помните, что пакеты Kylix поддерживаются только приложениями, созданными в Kylix или Borland Delphi 6;

если же вы хотите использовать созданную вами библиотеку различными приложениями, созданными в разных средах программирования, вам необходимо создать библиотеку разделяемых объектов (so).
С файлами пакетов связаны следующие расширения (табл. 20.1):

Таблица 20.1. Типы файлов пакетов

Расширение файлаСодержание файла
dpk Исходный файл пакета, содержащий список модулей данного пакета. Он создается при запуске редактора пакета (по своему назначению и функциональности похож на файл проекта Kylix .dpr)
dcpДвоичный файл, содержащий заголовок пакета и описание всех файлов dcp пакета, включая всю символьную информацию, которая требуется для компилятора. Всего один файл данного типа создается для одного пакета
dpuДвоичный файл, содержащий текст модуля, находящийся в пакете. Для каждого модуля создается один файл dpu
soФайл пакета, используемого во время работы приложения. Этот файл является аналогом библиотеки разделяемых объектов (so) Linux, которая содержит специфичные характеристики среды Kylix. Если это пакет времени выполнения, то вы должны передавать данный пакет пользователю вместе с файлом приложения. В случае, если это пакет разработки, он должен распространяться среди программистов, использующих его для написания приложений

Использование пакетов в приложениях
Для того чтобы приложение, которое использует пакеты, благополучно запустилось, должны присутствовать в наличии все необходимые приложению файлы. Файлы so должны быть прописаны в путях приложения.

Примечание
При разработке коммерческих приложений обратите внимание на то, чтобы пользователи получили правильную версию файлов пакетов (so).

Для использования пакетов времени выполнения в вашем приложении нужно проделать следующие шаги:
1. Загрузите или создайте новый проект в среде Kylix.
2. В главном меню Kylix выберите Project/Options.
3. В открывшемся диалоговом окне выберите вкладку Packages (рис. 20.1).
4. Установите флажок Build with runtime package. Затем в открывшееся поле введите одно или несколько названий пакетов, которые вы хотите использовать в своем приложении. Вы можете воспользоваться также кнопкой Add для поиска необходимого пакета
(рис. 20.2).



Рис. 20.1. Вкладка Packages диалогового окна Project Options

Примечание
При изменении пути поиска (Search path) в диалоговом окне добавления пакета (см. рис. 20.2) вы измените глобальные настройки путей к библиотекам Kylix.

Рис. 20.2. Окно добавления пакета в проект

(При вводе имени пакета с клавиатуры (в поле для редактирования без применения кнопки Add) вам не потребуется вводить расширение пакета. Обратите внимание, что названия пакетов записываются через точку с запятой:
baseclx; visualclx; visualdbclx; dataclx
Пакеты, перечисленные в поле для редактирования, при компиляции вашего приложения будут автоматически связаны с ним. Если в поле для ввода имен пакетов не будет ни одного названия пакета, ваше приложение откомпилируется как не использующее пакеты. В случае, если один и тот же пакет будет записан в поле для редактирования несколько раз, все лишние записи будут проигнорированы.

Примечание
Вся информация об используемых приложением пакетах будет сохранена только для данного приложения. Если вы хотите, чтобы настройки сохранялись для других приложений, установите флажок Default, находящийся в нижней части диалогового окна Project Options.
Очень важно помнить, что даже если вы используете в своем приложении пакеты, вы все равно должны прописывать имена модулей среды Kylix в блоке uses:

unit MainForm;
interface
uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs;

Хотя все из вышеперечисленных модулей входят в один пакет bplclx, если убрать их описание из блока uses, компилятор сгенерирует ошибку.

Динамическая загрузка пакетов
Иногда требуется загружать необходимый пакет во время работы приложения. Для этой цели служит функция LoadPackage. Данная функция находится в модуле Kylix SysUtils. Описание этой функции имеет следующий вид:

function LoadPackage(const Name: string): HMODULE;

В качестве передаваемого функции параметра служит имя файла пакета типа string. Вызов данной функции очень прост:

LoadPackage('Имя файла пакета');

Для динамической выгрузки пакета применяется процедура unloadPackage. Эта процедура также содержится в модуле SysUtils. Ее описание имеет вид:

procedure UnioadPackage(Module: HMODULE);

При вызове данной процедуры будьте осторожны, чтобы не уничтожить экземпляры классов, определенных в пакете.
Среда Kylix поставляется с уже установленными пакетами компонентов, которые поддерживают основные компоненты, необходимые для создания стандартных приложений Linux. Наибольшее число стандартных компонентов Kylix содержится в уже знакомом нам пакете bplclx. Но данный пакет не одержит многие компоненты, например компоненты для работы с базами
данных. Эти компоненты находятся в других пакетах Kylix (например, компоненты, предназначенные для работы с базами данных, находятся в пакете pldataclx). Однако, несмотря на это, для работы с базами данных вам понадобятся оба пакета: bplclx и bpldataclx. В табл. 20.2 перечислены пакеты времени выполнения, поставляемые с Kylix, а также модули (units), входящие в данные пакеты.

Таблица 20.2. Основные runtime пакеты Kylix

Имя файла пакетаМодули, входящие в пакет
bplclx.SO.6Classes, Consts, Contnrs, IniFiles, MaskUtils, QactnList, QButtons, Qclipbrd, QcomCtrls, QcomStrs, QConsts, Qcontrols, QDialogs, QextCtrls, QForms, Qgraphics, QGrids, QlmgList, QMask, QMenus, Qsearch, QStdActns, QStdCtrls, QStyle, QTypes, SyncObjs, Typlnfo
bpldataclx.SO.6DB, DBClient, DBCommon, DBConnAdmin, DBConsts, DBXpress, DSIntf, MidConst, Midas, Provider, QDBCtrls, QDBGrids, SqlConst, SqlExpr

Рассмотрим теперь пакеты разработки, которые поставляются вместе с Kylix табл. 20.3). Напомним, что данные пакеты используются IDE Kylix для установки компонентов в палитру компонентов, задания свойств компонентов и многого другого.

 

Таблица 20.3. Основные design-time пакеты Kylix

Имя файла пакетаВкладки палитры компонентов
dclstdStandard, Additional, Common Controls, Dialogs
dcldbdesignData Controls, dbExpress, Data Access
dclnetInternet
dclindyIndy Clients, Indy Servers, Indy Misc

Всe вышеперечисленные пакеты разработки вызывают при своей работе пакеты времени выполнения. Например, пакет dclstd вызывает bplclx. Первый пакет содержит код, который позволяет делать доступными многие компоненты, входящие во второй пакет на палитре компонентов Kylix.
В дополнение ко всем рассмотренным выше пакетам вы можете устанавливать в IDE пакеты собственного производства, а также пакеты, созданные другими разработчиками. Пакет Kylix dclusr является стандартным компонентом для новых компонентов.

Установка пакетов компонентов
Для того чтобы установить собственные пакеты или пакеты, созданные другими разработчиками, вам необходимо выполнить следующие шаги:

В случае, когда вы устанавливаете новый пакет, скопируйте файлы пакета в каталог библиотеки Kylix. Убедитесь, что скопировали все необходимые файлы пакета (имеющие расширения so, dcp, dcu).

В главном меню Kylix выберите команду Component/Install Packages либо воспользуйтесь вкладкой Packages диалогового окна свойств проекта, вызываемого командой главного меню Kylix Project/Options (рис. 20.3).

Рис. 20.3. Окно просмотра компонентов, входящих в пакет

В вызванном диалоговом окне вы можете увидеть список всех доступных пакетов. Для инсталляции любого пакета, имеющегося в списке, установите флажок напротив наименования пакета. Для удаления пакета из проекта уберите флажок напротив наименования пакета. Для просмотра компонентов, входящих в пакет, щелкните мышкой на имени пакета и нажмите кнопку Components в окне настройки проекта (см. рис. 20.1). На рис. 20.3 показан список компонентов, входящих в состав пакета Borland Database Components.

Для добавления нового пакета в список нажмите кнопку Add и в открывшемся окне выберите файл пакета.

Чтобы удалить пакет из списка, выберите пакет и нажмите кнопку Remove (см. рис. 20.1).
Компоненты пакета устанавливаются на вкладке палитры компонентов Kylix.

Создание и редактирование пакетов
Процесс создания пакета включает в себя:

задание названия пакета;

указание списка других пакетов, связанных с новым пакетом или требуемых для его работы;

составление списка файлов модулей, содержащихся в пакете или связанных с ним. По существу, пакет является лишь оболочкой для этих файлов.
Для создания пакета вам необходимо выполнить перечисленные ниже шаги:

Выберите в главном меню Kylix команду File/New.
В появившемся диалоговом окне выберите пиктограмму Package (рис. 20.4).

Рис. 20.4. Пиктограмма Package диалогового окна New Items

Сгенерированный пакет будет отображен в редакторе пакета (рис. 20.5).

Рис. 20.5. Редактор пакета

Редактор пакета включает в себя два раздела: содержания (Contains) и требований (Requires). Для добавления нового модуля в раздел содержания выберите раздел Contains щелчком мыши, затем щелкните на кнопке Add редактора пакета. Появится диалоговое окно Add (рис. 20.6).

Рис. 20.6. Вкладка Add Unit диалогового окна Add

На вкладке Add Unit диалогового окна Add запишите в поле HMCHI модуля имя файла pas, который вы хотите включить в пакет, ли пользуйтесь кнопкой Browse для непосредственного указания файла. В результате выбранный файл модуля будет добавлен в раздел Contains вашего пакета.
Можете повторить вышеперечисленные действия для добавления дополнительных модулей в пакет.
Для добавления пакетов в раздел Requires выберите этот раздел щелчком мыши, затем нажмите кнопку Add редактора пакета.
В появившемся диалоговом окне (рис. 20.7) в поле имени пакета (Package name) введите имя файла пакета (dcp), требуемого для работы вашего пакета. Вы также можете использовать кнопку Browse для непосредственного указания файла пакета. Повторяя данный шаг, вы можете добавить несколько файлов пакетов в раздел Requires вашего пакета.

Рис. 20.7. Диалоговое окно Add

Для выбора типа создаваемого пакета (runtime или design-time) щелкните на кнопке Options редактора пакета (см. рис. 20.5). Откроется диалоговое окно Project Options (рис. 20.8).

Рис. 20.8. Диалоговое окно Project Options

Теперь выберите нужный тип приложения с помощью переключателя в разделе Usage options.

Последний шаг - компиляция созданного пакета. Нажмите кнопку Compile редактора пакета.
Редактировать уже существующий файл пакета можно по-разному:

выбрать пункт главного меню Kylix File/Open и в нем уже - файл пакета, который необходимо редактировать;

выбрать пункт главного меню Kylix Component/Install Component, выбран, нужный пакет в списке пакетов и нажать кнопку Edit;

в открытом редакторе пакета выбрать в разделе Requires нужный пакет, щелкнуть на нем правой кнопкой мыши для появления контекстного меню, где выбрать пункт Open.
Кроме того, вы можете редактировать файл пакета точно так же, как и файл проекта - вручную, как текстовый файл. Файл пакета содержит в себе три раздела:

название пакета (в разделе Package);

раздел требуемых файлов для данного пакета (раздел Requires);

раздел, содержащий названия файлов модулей, входящих в данный пакет (раздел Contains).
Приведем в качестве примера содержимое файла пакета user:

Package user;
Requires baseclx, vcl, visualclx;
Contains QMyButton, Week in 'home/kylix/lib';
end.

Структура пакета
Вспомним все, что мы уже знаем о пакетах, и нам нетрудно будет понять, из чего состоит пакет.
Пакет состоит из: имени, раздела Requires и раздела Contains.

Paskage имя пакета;
Rquires файлы пакетов, необходимые для работы данного пакета;
Contains файлы модулей, входящие в состав данного пакета;

Имя пакета должно быть уникальным внутри проекта. Например, вы назвали пакет MyPack. При этом редактор пакета создает файл ресурсов с именем MyPack.dpk. При компиляции проекта создается еще два файла с именами MyPack.so и MyPack.dcp.
Файл MyPack.so является исполняемым файлом пакета (аналог so), а файл MyPack.dcp - двоичным файлом (аналог dcu).
Имя пакета необходимо для того, чтобы вызывать его из приложения или гсывать в раздел Requires другого пакета.
Раздел Requires, как уже говорилось ранее, содержит имена файлов пакетов, необходимых для работы рассматриваемого пакета. Следует заметить, что пакеты не могут содержать круговые ссылки, т. е. не должно возникать следующих ситуаций:
пакет не должен содержать ссылку на самого себя;

если пакет Package 1 содержит в разделе Requires пакет Package2, то , Package2 не должен содержать в своем разделе Requires пакет Package 1;

если пакету Package 1 требуется пакет Package2, а пакету Package2 - Package3, то пакет Package3 не должен содержать в разделе Requires пакет Package 1.

Раздел Contains включает в себя файлы модулей (pas), входящих в проект.

Компиляция пакета
Как откомпилировать пакет, мы с вами уже знаем, осталось только рассмотреть некоторые особенности компиляции.
Для начала рассмотрим директивы компилятора, которые могут включаться (файл пакета и файлы модулей пакета (табл. 20.4).

Таблица 20.4. Директивы компилятора пакетов

ДирективаПрименение
{$IMPLICITBUILD OFF}Служит для предотвращения перекомпиляции пакета. Применяется в тех случаях, когда пакет не изменяется
{$G-} или {IMPORTEDDATA OFF)

Применяется для предотвращения размещения модуля внутри пакета. Данная директива размещается внутри модуля. Желательно, чтобы этот модуль был напрямую связан с приложением

{$WEAKPACKAGEUNIT ON}Когда в файле модуля встречается данная директива, компилятор опускает данный модуль из файла so и создает локальную копию модуля тогда, когда это необходимо (при вызове данного модуля из приложения или из пакета). Модуль, имеющий данную директиву, называется слабым пакетом (weakly packaged)
{$DENYPACKAGEUNIT ON}то же, что, и {IMPORTEDDATA OFF}
{$DESIGNONLY ON}Компилирует пакет как пакет design-time
{$RUNONLY ON}Компилирует пакет как пакет runtime

Рассмотрим более подробно директиву {$WEAKPACKAGEUNIT}.

Слабый пакет применяется, когда пакет ссылается на отсутствующие библиотеки so. Данная директива используется очень редко. Она позволяет обрабатывать специфические ситуации. Например, есть два компонента (в разных пакетах), которые обращаются к одному и тому же интерфейсному модулю so. Если приложение будет использовать сразу оба компонента, это приведет к загрузке двух экземпляров so, при этом могут возникнуть конфликты инициализации и использования глобальных переменных.

Примечание
Обратите внимание, что когда вы поставляете откомпилированную версию приложения вместе со всеми необходимыми пакетами, вам следует учитывать, что должна совпадать версия пакета. То есть пакет, созданный в Kylix более новой версии, не будет работать вместе с приложением, созданным в Kylix старой версии.

Использование компилятора командной строки
Если вы компилируете пакет из командной строки (без загруженной графической оболочки Linux), вы можете воспользоваться ключами, приведенными в табл. 20.5.

Таблица 20.5. Ключи для компиляции пакета из командной строки

КлючНазначение
-$G-Отключает создание ссылок на импортируемые данные. Использование этого ключа повышает эффективность доступа к памяти, но не позволяет компилировать пакеты, внутри которых имеются ссылки на переменные других пакетов
-LEpathОпределяет каталог, в котором будет расположен файл пакета cppackage.so
-LNpathОпределяет каталог, в котором будет расположен файл пакета package, dcp
-LUpackageЗа этим ключом перечисляются файлы использующихся пакетов
-ZПредотвращает в дальнейшем перекомпиляцию данного пакета

Примечание
Использование ключа -$с- предотвращает возможность использования пакета другими пакетами приложения.

 

 

 
MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal