Реализация внешних модулей

Каков наилучший способ реализации системы внешних модулей для приложения DELPHI?

То, что мне нужно, действительно очень просто:

  • Основное приложение определяет наличие модуля и загружает его (время выполнения)
  • Модули могут хранить форму
  • Модули могут хранить DataModules
  • Модули могут хранить код

Мне нужно использовать формы магазина внутри других форм, и только в качестве самостоятельного

Я использую что-то вроде этого

        if Assigned(pNewClass) then begin
            Application.CreateForm(pNewClass, _lFrm);
            _lFrm.Hide;
            _lFrm.BorderStyle := bsNone;
            _lFrm.Parent := pBasePNL //(TPanel);
            _lFrm.Align := alClient;
        end;

Поэтому я создаю TForm, но помещаю его в TPanel.

Что касается DataModules, я обычно храню ImageLists, поэтому идея состоит в том, чтобы изменить ICO приложения, просто немного изменив внешний модуль.

Так каков наилучший способ достичь этого?

Посмотрел BPL во время выполнения, но, похоже, не понимал, как это сделать. Благодарю.

ОБНОВИТЬ: .....................................

После прочтения некоторых связанных вопросов и ответов, я думаю, что нашел свой ответ и решение.

http://edn.embarcadero.com/article/27178

Статья старая, но удивительно простая.

Ну, логика есть, я просто не понимаю, чтобы показать формы 

Я просто тестирую пример 2

Он загружает BPL, но не получает форму:

AClass := GetClass('TForm2');

Всегда возвращай 'ноль'

Но БПЛ как то прописал

RegisterClass(TForm2);

Может ли кто-нибудь помочь с этим.

2 ответа

Решение

Я сделал вам демо, так легко начать! Однако... Начато не закончено.

Каждый раз, когда я начал использовать плагины, я потом сожалел об этом. Однако, как вы говорите, вам нужна бинарная система плагинов. Так что BPL - это правильное решение. Дэвид предлагает использовать интерфейсы (с простыми библиотеками DLL вместо полного пакета времени выполнения BPL), и это решит некоторые из часто встречающихся проблем нестабильности BPL из-за отсутствия контроля версий ваших классов и, следовательно, ваших зависимостей Application-and-package-binary-compatibility, должным образом. Если вам не нужно совместно использовать память и не нужно использовать borlandmm.dll (управление общей памятью), тогда прямая DLL с интерфейсами будет работать нормально.

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

Помните, что использование BPL (Runtime Packages) сопровождается множеством побочных эффектов, которых вы, возможно, не ожидали. Самые большие приложения на основе BPL, над которыми я работал, были более беспорядочными и менее стабильными, чем любые монолитные приложения, над которыми я работал. Кажется, что можно только тоскать по пакетам, пока ты не попробуешь их, а потом я обнаружу, что тоскую по монолитам снова.

Если вы правильно используете пакеты BPL и правильно устанавливаете свои плагины, все в порядке. BPL отличные. Но в реальном мире кажется, что разумное управление версиями, совместимость и совместимость ABI, а также стабильность стоят на первом месте.

Обновление: я сделал вам демо, это здесь (plugin_r2.zip). Это было сделано в Delphi XE, но если вы используете более старую версию delphi, вы просто удаляете файлы.dproj и открываете файл.dpr для основного приложения и файл.dpk для пакета.

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

Я лично предпочел бы раскрыть функциональность приложения через ряд интерфейсов. Это позволяет получить доступ с языков, отличных от Delphi.

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

Другие вопросы по тегам