Реализация внешних модулей - PullRequest
5 голосов
/ 20 августа 2011

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

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

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

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

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

        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 приложения, просто немного изменив внешний модуль.

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

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

ОБНОВЛЕНИЕ: .....................................

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

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

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

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

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

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

AClass := GetClass('TForm2');

Always retrievex 'nil'

Но BPL, как он зарегистрировал:

RegisterClass(TForm2);

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

Ответы [ 2 ]

4 голосов
/ 20 августа 2011

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

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

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

3 голосов
/ 01 сентября 2011

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

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

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

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

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

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

...