Delphi формы в DLL - PullRequest
       54

Delphi формы в DLL

2 голосов
/ 27 апреля 2011

Это хорошая идея, чтобы поместить формы, которые имеют полную функциональность в DLL.И главное приложение вызовет функцию dll, которая возвращает объект формы.

Ответы [ 5 ]

7 голосов
/ 27 апреля 2011

Принятый способ сделать это в Delphi - это использовать пакеты, а не библиотеки DLL.

Пакеты - это, по сути, библиотеки DLL, но с особыми возможностями Delphi, которые позволяют использовать объекты VCL через границы пакета.* Попытка сделать это с помощью DLL приведет к множеству проблем, с которыми сталкиваются пакеты.Недостатком пакетов является то, что все модули должны быть скомпилированы с одной и той же версией Delphi.Но если вы хотите обмениваться объектами через границы модулей, то вы столкнетесь с тем же ограничением, если будете использовать библиотеки DLL.

Документация Delphi имеет широкий охват пакетов .

Сказав все это, я бы добавил, что если вы можете поместить весь свой код в один модуль (.exe или .dll), то это сделает жизнь намного проще.

5 голосов
/ 27 апреля 2011

Добавление к ответам об использовании пакетов:

  • Пакеты могут использоваться только в том случае, если и основное приложение, и все dll (плагины) написаны на Delphi , а написаны с использованием одной и той же версии Delphi
  • Библиотеки DLL могут быть написаны на любом языке программирования, который может их создавать, и может использоваться любой программой независимо от языка программирования

Итак, использование dlls, а не пакетов, имеет смысл.

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

Также обратите внимание: TObject вашего dll отличается от TObject вашего приложения. То же относится и к другим часто используемым классам и переменным, таким как (Forms.) Application.

Я сделал это, и это была боль в пояснице, но это было не невозможно. Основная программа была написана на Visual Basic 6, некоторые модули были написаны на Delphi 6, другие написаны на Delphi 7 и Delphi 2007.

Вывод: если вы уверены, что никогда не будете использовать что-то отличное от Delphi для своего приложения и для ваших dll (плагинов) и готовы всегда перекомпилировать все, когда вы переключаете версии Delphi, вам следует использовать пакеты. В противном случае может быть лучше использовать обычные библиотеки DLL. (И вы уверены, что вы всегда будете единственным, кто пишет эти dll? Может быть, когда-нибудь будет сторонний разработчик для одного из dll, у которого нет нужной ему версии Delphi.)

2 голосов
/ 28 апреля 2011

IMO, это иногда очень хорошая идея и единственный путь - по причинам, упомянутым другими, я не фанат пакетов, и я очень доволен DLL.В настоящее время я добавляю функциональность в приложение, написанное на Delphi 5 с использованием Delphi XE - оно либо использовало DLL, либо записывалось на D5 - конечно, я выбрал первое: приложение D5 вызывает DLL, написанные на XE, которые содержат все самые последние и лучшие функции.(Первые проекты, которые я делал в Delphi, были выполнены с помощью старого Borland Paradox - приложение Paradox вызывало DLL, написанные на Delphi 1!)

Но я не отправляю форму или модуль из DLL обратно на главнуюприложение - я просто отправляю модулю DLL структуру, содержащую то, что ему нужно знать, чтобы выполнить свою работу, и когда это делается и форма DLL закрывается, он очищается, а затем возвращает обратно вызывающему абоненту числовой код или структуру, указывающую на успех, неудачуи т. д. (старомодно, но очень эффективно).

Передача экземпляра формы из DLL обратно в основное приложение через пороговое значение DLL может быть проблематичной - обратите внимание на превосходный ответ @ dummzeuch выше с некоторыми полезными советами о том, как решить некоторые из этих проблем, если вы решите, что это вашеЕдинственное решение.

2 голосов
/ 27 апреля 2011

+ 1 за все, что говорит Дэвид Хеффернан.

В стратегическом плане вам действительно нужно , что нужно для реализации форм (или других функций) во внешних файлах, если вы внедряете подключаемый модуль.

Если вы собираетесь разрешить создание плагинов на любом языке, то DLL - единственный путь.

Если ваша система плагинов будет доступна только разработчикам с той же версией Delphi (возможно, той же командой?), То используйте BPL. Дополнительным недостатком пакетов Delphi, с моей точки зрения, является необходимость развертывания VCL BPL с вашим приложением, которое всегда больше Мб, чем один скомпилированный модуль.

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

0 голосов
/ 29 сентября 2011

Если вы поместите форму в обычную dll, форма не сможет перехватить TAB или клавиши со стрелками. Мне сказали, что это связано с тем, что OnKeyDown не будет пропущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...