0

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

我制作了一个新的 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 中创建此选项卡(和几个子组件)?

4

1 回答 1

1

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

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

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

于 2013-07-13T22:23:38.780 回答