Главная » Delphi » Пакеты CLX

0

Компоненты CLX (так  же, как и компоненты VCL) для использования в интегри рованной среде  Kylix или  Delphi  должны  быть  помещены внутрь  пакетов. При  этом важно  отметить, что  откомпилированный пакет  Delphi 6, содержащий компоненты CLX, не может  быть установлен в Kylix. Это связано с тем, что пакеты Windows реали зованы в виде специальных библиотек DLL, в то время  как пакеты Linux  реализованы в виде  файлов распределенных объектов с расширением .so. К счастью, формат и синтаксис файлов с исходным кодом пакетов идентичны для обеих платформ.

Тем не менее, информация, включаемая в пакеты для среды  Windows,  отличается от аналогичной информации для среды  Linux.  Например, в разделе requires пакета времени выполнения для Linux  обычно указываются пакеты baseclx и visualclx, а пакет baseclx в Delphi 6 не используется. В среде Windows в пакетах  времени выпол нения, содержащих компоненты CLX, указывается только  пакет  visualclx. Как и в случае  с пакетами VCL, при  разработке пакетов CLX потребуются пакеты времени выполнения, содержащие новые  пользовательские компоненты CLX.

Соглашения об именовании

Представленные в данной главе  компоненты CLX содержатся в пакетах, перечис ленных в табл. 13.1 и 13.2. В первой из таблиц  указаны файлы .BPL, созданные в среде Windows,  а также  пакеты, необходимые при  разработке любого  пользовательского пакета.  В табл. 13.2 перечислены пакеты, необходимые для разработки новых  паке тов,  и файлы распределенных объектов, созданные в среде  Linux.  Исходный код па кетов  идентичен для обеих  таблиц.  Обратите внимание на соглашения, которые ис пользуются для названий пакетов.

Исходный код пакета

Откомпилированная версия

Раздел requires

QddgSamples.dpk

QddgSamples60.bpl

visualclx

QddgSamples_Dsgn.dpk

QddgSamples_Dsgn60.bpl

visualclx designide QddgSamples

QddgDBSamples.dpk

QddgDBSamples60.bpl

visualclx dbrtl visualdbclx QddgSamples

QddgDBSamples_Dsgn.dpk

QddgDBSamples_Dsgn60.bpl

visualclx QddgSamples_Dsgn QddgDBSamples

Таблица 13.2.  для Linux (Kylix)

Исходный код пакета

Откомпилированная версия

Раздел requires

QddgSamples.dpk

bplQddg6Samples.so.6

baseclx visualclx

QddgSamples_Dsgn.dpk

bplQddgSamples_Dsgn.so.6

baseclx visualclx designide QddgSamples

QddgDBSamples.dpk

bplQddgDBSamples.so.6

baseclx visualclx visualdbclx dataclx QddgSamples

QddgDBSamples_Dsgn.dpk

bplQddgDBSamples_Dsgn.so.6

baseclx visualclx QddgSamples_Dsgn QddgDBSamples

В названия пакетов CLX, которые используются в Windows, обычно входит  версия продукта.  Например, название QddgSamples60.bpl означает, что этот  файл  предна значен для  Delphi   6  и,  судя  по  расширению .bpl,  является библиотекой пакетов Borland (Borland Package  Library). В Linux  была выбрана традиционная для этой  опе рационной системы практика присвоения имен  распределенным объектам. Напри мер,  вместо  расширения, соответствующего типу файла, для идентификации пакета используется префикс bpl. Borland также  иногда  в начале  названий пакетов времени разработки использует префикс dcl. Но авторы не одобряют подобную  практику, по тому что пакеты времени разработки лучше идентифицировать при  помощи суффик са _Dsgn. В дополнение следует отметить следующее:  для всех пакетов (как времени выполнения, так и времени разработки) в среде  Windows  используется расширение

.bpl. В этом  случае  использование префикса bpl для  всех  пакетов в среде  Linux обеспечивает необходимую степень соответствия. Для идентификации распределен ных  объектов Linux  обычно используется суффикс .so, после  которого следует  но мер версии. Выбор префикса и суффикса при генерации откомпилированных пакетов контролируется при помощи соответствующих параметров.

Также  обратите внимание, что  в названиях исходных файлов отсутствует  номер версии. В предыдущих версиях Delphi  распространенной практикой было добавление к названию пакета  суффикса для определения версии требуемого пакета  VCL. Но,  на чиная  с Kylix и Delphi 6, Borland добавила несколько новых  параметров контроля за названиями компилируемых пакетов. В пакетах Delphi 6, перечисленных в табл. 13.1, для  идентификации версии 60 используется  новый параметр {$LIBSUFFIX}. При компиляции пакета   Delphi   автоматически  добавляет к  названию файла   соответст вующий  суффикс. В пакетах Kylix, перечисленных в табл. 13.2,  для  добавления пре фикса  bpl используется директива {$SOPREFIX}, а для добавления суффикса 6 — ди ректива {$SOVERSION}.

Пакеты времени выполнения

В листингах 13.7 и 13.8 представлен исходный код двух пакетов времени выполне ния. Первый из них содержит компоненты, которые не взаимодействуют, а второй — компоненты, которые взаимодействуют с базами  данных.  Обратите внимание на ис пользование условных  директив со значениями MSWINDOWS и LINUX, а также  содер жимое   раздела   requires.  Значение  MSWINDOWS используется  при   компиляции  в Delphi  6, а LINUX — при компиляции в Kylix.

Листинг 13.7. QddgSamples.dpk — исходный  код пакета CLX времени выполнения, содержащего компоненты, которые не взаимодействуют с базами данных

package QddgSamples;

{$R *.res}

{$ALIGN 8}

{$ASSERTIONS ON}

{$BOOLEVAL OFF}

{$DEBUGINFO ON}

{$EXTENDEDSYNTAX ON}

{$IMPORTEDDATA ON}

{$IOCHECKS ON}

{$LOCALSYMBOLS ON}

{$LONGSTRINGS ON}

{$OPENSTRINGS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

{$RANGECHECKS OFF}

{$REFERENCEINFO OFF}

{$SAFEDIVIDE OFF}

{$STACKFRAMES OFF}

{$TYPEDADDRESS OFF}

{$VARSTRINGCHECKS ON}

{$WRITEABLECONST ON}{$MINENUMSIZE 1}

{$IMAGEBASE $400000}

{$DESCRIPTION ‘DDG: CLX Components’}

{$IFDEF MSWINDOWS}

{$LIBSUFFIX ’60’}

{$ENDIF}

{$IFDEF LINUX}

{$SOPREFIX ‘bpl’}

{$SOVERSION ‘6’}

{$ENDIF}

{$RUNONLY}

{$IMPLICITBUILD OFF}

requires

{$IFDEF LINUX}

baseclx,

{$ENDIF}

visualclx;

contains

QddgSpin in ‘QddgSpin.pas’,

QddgDsnSpn in ‘QddgDsnSpn.pas’,

QddgILSpin in ‘QddgILSpin.pas';

end.НА ЗАМЕТКУ

Для выделения участков кода, специфических для конкретной платформы, используй- те отдельные блоки вида {$IDFEF}..{$ENDIF}, как это показано в примере исходно- го кода пакета. В частности, избегайте использования конструкций, наподобие сле- дующей:

{$IFDEF MSWINDOWS}

// Здесь расположен код для Windows

{$ELSE}

// Здесь расположен код для Linux

{$ENDIF}

Если Borland когда-либо решит реализовать поддержку для других платформ, то такая конструкция приведет к использованию кода Linux для любой системы, которая не от- носится к Windows.

Листинг 13.8. QddgDBSamples.dpk — исходный  код для пакета CLX времени выполнения, который содержит компоненты, взаимодействующие с базами данных

package QddgDBSamples;

{$R *.res}

{$ALIGN 8}{$ASSERTIONS ON}

{$BOOLEVAL OFF}

{$DEBUGINFO ON}

{$EXTENDEDSYNTAX ON}

{$IMPORTEDDATA ON}

{$IOCHECKS ON}

{$LOCALSYMBOLS ON}

{$LONGSTRINGS ON}

{$OPENSTRINGS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

{$RANGECHECKS OFF}

{$REFERENCEINFO OFF}

{$SAFEDIVIDE OFF}

{$STACKFRAMES OFF}

{$TYPEDADDRESS OFF}

{$VARSTRINGCHECKS ON}

{$WRITEABLECONST ON}

{$MINENUMSIZE 1}

{$IMAGEBASE $400000}

{$DESCRIPTION ‘DDG: CLX Components (Data-Aware)’}

{$IFDEF MSWINDOWS}

{$LIBSUFFIX ’60’}

{$ENDIF}

{$IFDEF LINUX}

{$SOPREFIX ‘bpl’}

{$SOVERSION ‘6’}

{$ENDIF}

{$RUNONLY}

{$IMPLICITBUILD OFF}

requires

{$IFDEF MSWINDOWS}

dbrtl,

{$ENDIF}

{$IFDEF LINUX} baseclx, dataclx,

{$ENDIF}

visualclx, visualdbclx, QddgSamples;

contains

QddgDBSpin in ‘QddgDBSpin.pas';

end.

Пакеты времени разработки

Компоненты можно  помещать и в комбинированные пакеты (времени выполне ния  и разработки), но такой  подход  использовать не рекомендуется. Фактически па кет времени выполнения и разработки можно  использовать только  в том случае, если он не содержит редакторов компонентов. А для такого  пакета  потребуется пакет designide, который нельзя включать в состав инсталляционного комплекта.

Поэтому  пакеты времени разработки с пакетами времени выполнения лучше  не

объединять. В листингах 13.9 и 13.10 представлен исходный код двух пакетов времени разработки. Первый из них содержит компоненты не взаимодействующие, а второй — компоненты, взаимодействующие с базами  данных.  И  вновь  обратите внимание на директивы условной  компиляции со значениями MSWINDOWS и LINUX, а также  на со держимое раздела  requires.

Листинг 13.9. QddgSamples_Dsgn.dpk — исходный  код пакета CLX времени разработки, содержащего компоненты, не взаимодействующие с базами данных

package QddgSamples_Dsgn;

{$R *.res}

{$R ‘QddgSamples_Reg.dcr’}

{$ALIGN 8}

{$ASSERTIONS OFF}

{$BOOLEVAL OFF}

{$DEBUGINFO OFF}

{$EXTENDEDSYNTAX ON}

{$IMPORTEDDATA ON}

{$IOCHECKS ON}

{$LOCALSYMBOLS OFF}

{$LONGSTRINGS ON}

{$OPENSTRINGS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

{$RANGECHECKS OFF}

{$REFERENCEINFO OFF}

{$SAFEDIVIDE OFF}

{$STACKFRAMES OFF}

{$TYPEDADDRESS OFF}

{$VARSTRINGCHECKS ON}

{$WRITEABLECONST ON}

{$MINENUMSIZE 1}

{$IMAGEBASE $400000}

{$DESCRIPTION ‘DDG: CLX Components’}

{$IFDEF MSWINDOWS}

{$LIBSUFFIX ’60’}

{$ENDIF}

{$IFDEF LINUX}

{$SOPREFIX’bpl’}{$SOVERSION ‘6’}

{$ENDIF}

{$DESIGNONLY}

{$IMPLICITBUILD OFF}

requires

{$IFDEF LINUX}

baseclx,

{$ENDIF}

visualclx,

designide,

QddgSamples;

contains

QddgSamples_Reg in ‘QddgSamples_Reg.pas’,

QddgDsnEdt in ‘QddgDsnEdt.pas’,

QddgRgpEdt in ‘QddgRgpEdt.pas';

end.НА ЗАМЕТКУ

Для того чтобы исходный файл пакета можно было использовать и в Kylix, и в Delphi 6, в названиях пакетов, указанных в разделе requires, должен учитываться регистр символов. Например, в VCL часто используется название DesignIDE, а в Linux — designide. Если в исходном коде пакета используется первый вариант названия, то Kylix не сможет найти файл designide.dcp, потому что в среде Linux Desig- nIDE.dcp и designide.dcp — это не одно и то же.

Листинг 13.10. QddgDBSamples_Dsgn.dpk — исходный  код пакета CLX времени разработки, содержащего компоненты, взаимодействующие с базами данных

package QddgDBSamples_Dsgn;

{$R *.res}

{$ALIGN 8}

{$ASSERTIONS OFF}

{$BOOLEVAL OFF}

{$DEBUGINFO OFF}

{$EXTENDEDSYNTAX ON}

{$IMPORTEDDATA ON}

{$IOCHECKS ON}

{$LOCALSYMBOLS OFF}

{$LONGSTRINGS ON}

{$OPENSTRINGS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

{$RANGECHECKS OFF}

{$REFERENCEINFO OFF}{$SAFEDIVIDE OFF}

{$STACKFRAMES OFF}

{$TYPEDADDRESS OFF}

{$VARSTRINGCHECKS ON}

{$WRITEABLECONST ON}

{$MINENUMSIZE 1}

{$IMAGEBASE $400000}

{$DESCRIPTION ‘DDG: CLX Components (Data-Aware)’}

{$IFDEF MSWINDOWS}

{$LIBSUFFIX ’60’}

{$ENDIF}

{$IFDEF LINUX}

{$SOPREFIX ‘bpl’}

{$SOVERSION ‘6’}

{$ENDIF}

{$DESIGNONLY}

{$IMPLICITBUILD OFF}

requires

{$IFDEF LINUX}

baseclx,

{$ENDIF}

visualclx,

QddgSamples_Dsgn,

QddgDBSamples;

contains

QddgDBSamples_Reg in ‘QddgDBSamples_Reg.pas';

end.

Модули регистрации

Как можно  заметить, в приведенных листингах пакетов времени разработки для регистрации компонентов используются специальные модули регистрации. Обычно при  создании компонентов  VCL модули  регистрации (QddgSamples_Reg и  Qddg- DBSamples_Reg) включаются только  в пакеты времени разработки. В листинге 13.11 представлен исходный код модуля QddgSamples_Reg.pas, который отвечает за ре гистрацию компонентов, не предназначенных для работы с базами  данных, а также редакторы компонента TddgRadioGroupEditor.

Листинг 13.11. QddgSamples_Reg.pas — модуль регистрации для компонентов CLX, не взаимодействующих с базами данных

unit QddgSamples_Reg;

interface

procedure Register;

implementation uses

Classes, DesignIntf, DesignEditors, QExtCtrls, QddgSpin,

QddgDsnSpn, QddgILSpin, QddgRgpEdt;{===========================}

{== Процедура регистрации ==}

{===========================}

procedure Register;

begin

{== Регистрация компонентов ==}

RegisterComponents( ‘DDG-CLX’,

[ TddgSpinner,

TddgDesignSpinner,

TddgImgListSpinner ] );

{== Регистрация редакторов компонентов ==} RegisterComponentEditor( TRadioGroup, TddgRadioGroupEditor );

end;

end.

Пиктограммы компонентов

Для идентификации созданного компонента CLX в палитре компонентов необхо димо  создать   соответствующую  пиктограмму.  Она  представляет собой   16 цветный растровый рисунок  размером 24×24  пикселя. В интерактивной справочной системе Kylix и Delphi рекомендуется создавать отдельные файлы ресурсов для каждого  моду ля компонента.

В любом  случае,  редактор пакетов ищет  соответствующий файл  с расширением

.dcr для каждого  указанного в пакете  модуля. К сожалению, этот  поиск  выполняется как для пакетов времени выполнения, так и для пакетов времени разработки. Учиты вая это,  включать пиктограммы в пакеты времени разработки не имеет  смысла,  так как они все равно  не будут использованы и только  займут место.

Следовательно, вместо  создания отдельного файла  с расширением .dcr для моду лей каждого  компонента лучше просто создать  один файл,  содержащий пиктограммы всех компонентов. К счастью, файлы ресурсов Kylix такие  же, как и в Delphi. Испол няемые файлы, созданные Kylix, могут  использоваться только  в среде  Linux, а вот формат подключаемых ресурсов  аналогичен формату Win32.  В результате файлу  ре сурса Windows  с расширением .res можно  просто присвоить расширение .dcr. На пример, на рис. 13.9 показано содержимое файла  QddgSamples_Reg.dcr в графиче ском редакторе Image Editor.Обратите внимание: имя  файла  ресурса  совпадает с именем модуля регистрации. Благодаря этому при добавлении модуля регистрации в пакет  времени разработки до бавляется также и файл ресурса. Как уже упоминалось, в пакетах времени выполнения модули  регистрации не  используются,  поэтому  в них  также  не  будут включаться и пиктограммы компонентов.

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

Рис. 13.9. При создании файлов .DCR для компонентов CLX можно использовать редактор Image Editor

Резюме

Преобразовывая компоненты VCL в CLX, в их исходный код следует внести неко торые изменения. Во первых, везде,  где это  возможно, используйте уже существую щие  оболочки VCL. Например, вместо  прямых обращений к функциям интерфейса GDI лучше использовать методы  класса  TCanvas. К тому же вместо  обработки сооб щений окон,  наподобие wm_LButtonDown, необходимо использовать переопреде ленные обработчики событий (в данном  случае —  MouseDown()), так как в Linux  со общения, наподобие wm_LButtonDown, не  используются. Кроме  того  для  изоляции кода,  характерного для  конкретной  платформы, рекомендуется создавать собствен ные абстрактные классы.Библиотека CLX была разработана после VCL, однако  для переноса существующих компонентов VCL в CLX придется приложить некоторые усилия. Количество вызовов специфических системных функций, наподобие API Win32 или libc, необходимо све сти к минимуму или,  по крайней мере,  они  должны  быть  заключены в соответствую щих условных  директивах. Несмотря на все вышеизложенное, можно  создать  компо нент CLX на основе одного  файла  исходного кода, который будет использоваться как в Delphi  под Windows, так и в Kylix под Linux.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии