Delphi FMX从DLL中添加主机表单中的GUI元素

时间:2013-07-12 18:36:33

标签: delphi firemonkey delphi-xe3

所以基本上就是我所做的:

我制作了一个新的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;

如果我忘记了什么,我很抱歉。我目前没有确切的消息来源。

当按下表单上的Button时,将调用此方法 但没有任何反应 所以我把这个方法放到我的TForm1类中。如果我现在调用它,则会创建一个选项卡 那么如何从应用程序主窗体上的DLL中创建此选项卡(以及几个子组件)?

1 个答案:

答案 0 :(得分:1)

这里的基本问题是你不能使用DLL在模块之间共享Delphi类类型。原因是需要单个类型的多个版本。可执行文件中的一个版本,以及每个使用它的DLL中的一个版本。

这与VCL存在的同样众所周知的问题也是开发运行时包的原因。这也是您对FMX的解决方案。如果需要在模块之间共享Delphi类类型,则需要对类型进行单一定义。运行时包是使这成为可能的机制。

因此,停止使用DLL,将代码移动到运行时包中,确保使用运行时包链接RTL和FMX,这个问题将得到解决。