Как я могу сообщить IDE о единицах, используемых в проекте, в котором используется мой пакет? - PullRequest
2 голосов
/ 27 сентября 2019

Я пишу пакет для пользовательского компонента.Этот пакет позволяет пользователю / разработчику включить в свой проект множество предварительно написанных модулей, которые явно предназначены для работы с этим пользовательским элементом управления, или написать свой собственный, чтобы сделать то же самое, что и один из существующих.Думайте об этом как о «плагине», где код реализован в своем собственном модуле, который наследует конкретный объект и выполняет пользовательскую реализацию этого общего объекта.

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

Например,этот пользовательский элемент управления имеет свойство:

property PluginIndex: Integer read FPluginIndex write SetPluginIndex;

Внутренне этот индекс соответствует одному из «плагинов», который был зарегистрирован в разделе initialization соответствующего блока.

Эти«Плагины» регистрируются через глобальный объект, который создается следующим образом при первом использовании:

function Plugins: TMyPluginList;

implementation

var
  _Plugins: TMyPluginList;

function Plugins: TMyPluginList;
begin
  if _Plugins= nil then
    _Plugins:= TMyPluginList.Create;
  Result:= _Plugins;
end;

Сложность состоит в том, что, поскольку элемент управления реализован в пакете (и установлен в IDE), все же "«модули» модуля «используются» из другого проекта, пакет не определяет наличие этих модулей, и поэтому этот пользовательский элемент управления также не может получить доступ к глобальному списку, поскольку он находится в совершенно ином контексте.

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

Как мне сделать это так, чтобы мое приложение использовало этот пользовательский элемент управления (которое зависит от использования клиентом каждого модуля «плагина»)) может на самом деле обнаружить эти используемые единицы измерения?


РЕДАКТИРОВАТЬ

Конечная цель того, что я делаю, состоит в том, чтобы этот единственный пользовательский элемент управления былпросто поместите в форму, затем укажите конкретные единицы, «используемые» в той же форме, и, наконец, в этом единственном экземпляре пользовательского элемента управления выберите индекс, который из этих «плагинов» будет фактически использоваться в любой момент времени.Я пытаюсь инкапсулировать и автоматизировать как можно большую часть процесса, чтобы разработчику было проще отказаться от этого пользовательского элемента управления и не нужно писать кучу другого кода, чтобы он работал.


РЕДАКТИРОВАТЬ

Я понимаю, что это может быть истолковано как эти "подключаемые" модули, являющиеся частью пакета.Это не относится к делу.Хотя в настоящее время у меня нет выбора, кроме как добавить эти «подключаемые» модули в пакет, чтобы обеспечить правильную работу во время разработки, я не хочу, чтобы он был частью пакета, а скорее до разработчика, использующего этот кастомконтроль.Они могут добавить комбинацию как готовых «подключаемых» модулей, так и пользовательских, просто «используя» их в своем приложении.

...