Могу ли я создать компонент Delphi для добавления нескольких единиц в предложение uses?

Я работаю над некоторыми компонентами в XE2. Возможно ли иметь больше, чем компонентный компонент, добавленный к предложению uses формы, на которую он упал?

Пример: Когда я выбираю TCustomComponent из пакета, который я создал и установил блок, CustomComponent добавляется в предложение uses формы. Я хотел бы также добавить модуль GlobalConstants.

Кто-нибудь знает, можно ли это сделать?

Ответ 1

Создайте пакет времени разработки для вашего компонента (если у вас его еще нет). В этом пакете создайте класс, который реализует интерфейс ISelectionEditor (самый простой способ - извлечь из TSelectionEditor), переопределяя свой виртуальный метод RequiresUnits() для сообщения любых дополнительных единиц, которые вы хотите отобразить в предложении uses любого Form/Frame/DataModule, который использует ваш компонент. Затем, если ваша функция пакета Register() зарегистрирует этот класс, вызвав RegisterSelectionEditor() (в дополнение к RegisterComponents()).

Indy 10 делает именно это для своих компонентов TIdTCPServer, TIdCmdTCPClient и TIdUDPServer, чтобы убедиться, что IdContext и IdSocketHandle добавляются в предложения uses. Посмотрите на единицы IdCoreSelectionEditors.pas и IdRegisterCore.pas, чтобы увидеть, как Indy реализует это.

Обновление: единицы измерения IdCoreSelectionEditors.pas и IdProtocolsSelectionEditors.pas были удалены из Indy 10 в марте 2014 года. Все классы для каждого компонента SelectionEditor были заменены новым единственным классом, реализованным в IdRegisterCore само устройство. Этот новый класс SelectionEditor зарегистрирован для всех компонентов Indy и ищет все экземпляры любого компонента Indy, который был помещен во время разработки, с использованием RTTI типов данных всех параметров и возвращаемых значений для всех назначенных обработчиков событий, чтобы узнать, какие единиц для отчета для включения в предложение uses.