Где искать DsgnIntf.dcu, DesignIDE.dcu и Proxies.pas?
Где искать DsgnIntf.dcu, DesignIDE.dcu и Proxies.pas?
Где искать DsgnIntf.dcu, DesignIDE.dcu и Proxies.pas? На часть этого вопроса, касающуюся DsgnIntf.dcu ответ прост и не вызывает затруднений в реализации. Модуль DsgnIntf.dcu достается "в наследство" с компонентами, разработанными в версии Дельфи ниже шестой. Он содержал интерфейсы и базовые классы, их реализующие, для разработки дизайнеров компонент и редакторов свойств, а также редакторы и дизайнеры для стандартных типов свойств: Integer, Set, Enum, String, TStrings, Variant, TComponentName и т.д., и элементы заимодействия со средой разработки, такие как двойной щелчок на компоненте или выбор соответствующего пункта контекстного меню. Начиная с шестой версии Дельфи этот модуль был разделен на два самостоятельных модуля: DesignIntf и DesignEditors, в первый из которых были перемещены интерфейсы и базовые классы редакторов и дизайнеров, а во второй - редакторы стандартных типов свойств. Поэтому теперь, чтобы адаптировать компонент, разработанный, допустим, в четвертой версии Дельфи, в разделе USES необходимо заменить ссылку на модуль DsgnIntf ссылками на модули DesignIntf и DesignEditors. Большая универсальность достигается при использовании директив условной компиляции, таких как {IFDEF}..{ELSE}..{ENDIF}, где в качестве условия компиляции можно проверить версию компилятора: {IFDEF VER120} uses DsgnIntf; {ELSE} uses DesignIntf, DesignEditors; {ENDIF} В этом случае для компилятора Дельфи 4 (VER120) будет использоваться строка uses DsgnIntf, иначе - uses DesignIntf, DesignEditors;. Ниже приведен список предопределенных в Дельфи символов условной компиляции, определяющих версию компилятора: VER80 -- Delphi 1 VER90 -- Delphi 2 VER93 -- C++Builder 1 VER100 -- Delphi 3 VER110 -- C++Builder 3 VER120 -- Delphi 4 VER130 -- Delphi 5 VER140 -- Delphi 6 VER150 -- Delphi 7 Однако чаще всего одной подмены ссылок оказывается недостаточно и компиляция компонента прерывается с грозным сообщением, что IDE не может отыскать DesignEditors.dcu или Proxies.pas. Первым делом программисты, впервые с этим столкнувшиеся, пытаются отыскать эти файлы в каталоге установки Дельфи, потом на диске с дистрибутивом, и, наконец, расширяют круг поиска на весь Интернет. Решение в итоге находится, но большинство программистов, в особенности начинающих, оно мало удовлетворяет. Самый распространенный ответ: "Просто реорганизуйте ваш проект на использование runtime пакетов и добавьте "DesignIDE" к вашему списку runtime пакетов.", мягко говоря, слишком лаконичен, чтобы внести в дело ясность. Итак, по-порядку. Вспомним, как просто в IDE Дельфи создавать, к примеру, главное или всплывающее меню. Достаточно дважды щелкнуть на компоненте TMainMenu, помещенном на форму и перед нами открывается специальный дизайнер, позволяющий добавлять и удалять пункты меню, а также удобно визуально настраивать каждый пункт в отдельности. А теперь представим, что у нас нет этого редактора и создание меню осуществляется ручным написанием соответствующего кода! Но за все приходится платить: значительная часть кода компонента, облегчающая программисту процесс разработки программы, попадает в итоге в исполняемый файл, увеличивая его объем. Частичным выходом из этого положения стало решение разработчиков Дельфи некоторую часть кода, используемую исключительно при разработке, но не требующуюся для функционирования самой программы, размещать отдельно от компонента. Эта часть компонента, включающая редакторы свойств и дизайнеры, а также всевозможные эксперты IDE, получила название интерфейса времени разработки (Design-time interface). Часть кода компонента, отвечающая за его функциональность, относится к интерфейсу времени исполнения (Run-time interface). Строго говоря, к интерфейсу времени разработки можно отнести также свойства и события, объявляемые в секции published компонента и для которых генерируется дополнительная информация о типе (RTTI - Run time type information), позволяющая редактировать их в Инспекторе объектов, но эти самые свойства и события используются и при работе программы, то есть относятся в то же время и к интерфейсу времени исполнения. Можно сказать, что published свойства и события относятся к интерфейсу разработчика (Developer interface), объединяющему оба вышеописанных интерфейса. На основании приведенной информации, мы и можем провести предлагаемую в совете "реорганизацию" проекта. Для этого необходимо разделить проект как минимум на 2 пакета: в одном будет сосредоточена основная функциональность компонента (класс компонента и реализация его методов, а также процедура регистрации), во втором - функциональность компонента, определяющая его поведение в IDE (редакторы свойств, дизайнер, процедуры их регистрации). Причем во второй пакет в раздел USES необходимо добавить ссылку на первый пакет, так как процедура регистрации редактора компонента потребует указать тип компонента. Для компиляции первого пакета больше препятствий нет, но во втором нам необходимо будет предпринять еще ряд шагов. Во-первых, необходимо указать компилятору, что данный пакет должен использоваться только во время разработки программы в IDE Дельфи и не должен включаться в выходной файл. Для этого откроем окно опций проекта (выбором пункта меню Proect|Options, нажатием сочетания клавиш Shift+Ctrl+F11 или кнопки Options на панели инструментов редактора пакета), на вкладке "Description" ("Описание") в списке "Usage Options" ("Опции Использования") необходимо выбрать пункт "Designtime only" ("Только для времени проектирования"). Закрываем окно нажатием копки "Ok", чтобы сохранить изменения. В разделе Uses модуля DesignEditors присутствует сссылка на модуль Proxies, но ни в виде скомпилировнного DCU-файла, ни в виде исходного PAS-файла вы его не найдете, так как он поставляется только в виде кода, включенного в файл DesignIde.DCP (DCP - Delphi Compiled package, но мне попадались и такие расшифровки: Delphi Collection Package, Delphi Component Package). Это вызвано лицензионным ограничением BorlandR на использование Design-time пакетов вне среды Дельфи. Чтобы включить пакет DesignIde.DCP в наш проект, можно в окне редактора щелкнуть правой кнопкой мыши на пункте "Requires" ("Требуются"), в открывшемся меню выбрать "Add...", перейти в каталог $(Delphi)Lib, найти и выбрать файл designide.dcp, после чего закрыть окно нажатием кнопки "Ok". Вы увидите, что выбранный модуль добавился в секцию "Requires" нашего проекта. Теперь можно компилировать и регистрировать пакет в среде Дельфи: все нестандартные редакторы, используемые нашим компонентом, будут в нее интегрированы. Соответственно, при распространении компонента к архиву, помимо основного пакета, должен быть приложен и пакет с вашими редакторами.