Итак, в основном вот что я сделал:

Я создал новое приложение FMHD и разместил на нем TTabControl и Button. Затем я разработал интерфейс IFoo. Чтобы не усложнять, давайте представим, что у него только одна процедура:

type
  IFoo = interface
  ['{D035-N07-M4773R-...}']

    procedure makeTab(tc : TTabControl);

  End;

Я реализовал этот интерфейс в DLL. DLL загружается через LoadLibrary и экспортирует
function getFoo : IFoo;

MakeTab в основном создает TTabItem и устанавливает tc как родительский:

procedure TFoo.makeTab(tc : TTabControl);
var
  tab
  : TTabItem;
begin
  tab := TTabItem.Create(tc);
  tab.text := 'Hi, I am Tab';
  tab.Parent := tc;
  // ...
end;

Если я что-то забыл, мне очень жаль. В настоящий момент у меня нет точного источника.

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

0
Marco Alka 12 Июл 2013 в 22:36
3
Вам нужно использовать пакеты. Потому что в вашем приложении есть два экземпляра FMX. Один в exe и один в DLL.
 – 
David Heffernan
12 Июл 2013 в 22:40
Да, спасибо, это работает! Послушайте ... может быть, вы могли бы написать решение в качестве ответа, чтобы я мог принять его в качестве ответа?
 – 
Marco Alka
14 Июл 2013 в 01:51

1 ответ

Лучший ответ

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

Это та же хорошо известная проблема, которая существует с VCL, и по этой причине были разработаны пакеты среды выполнения. И это ваше решение для FMX. Если вам нужно разделить типы классов Delphi между модулями, вам нужно, чтобы было одно определение типа. И исполняемые пакеты - это механизм, который делает это возможным.

Итак, прекратите использовать библиотеки DLL, переместите код в пакет времени выполнения, убедитесь, что RTL и FMX связаны с помощью пакетов времени выполнения, и эта проблема будет решена.

1
David Heffernan 14 Июл 2013 в 02:23
Мне по-прежнему приходится использовать DLL для своих целей. Но теперь я использую пакет времени выполнения FMX. Проблема решена. Спасибо!
 – 
Marco Alka
14 Июл 2013 в 05:00