Реализация внешних модулей
Каков наилучший способ реализации системы внешних модулей для приложения 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 и будет экспортировать функцию, которую приложение будет вызывать для передачи в корневой интерфейс, представляющий приложение. Затем плагин вызывает методы этого интерфейса, устанавливая двустороннее взаимодействие.