【问题标题】:Delphi FMX Add GUI Elements in Host's Form from DLLDelphi FMX 在 DLL 中以主机形式添加 GUI 元素
【发布时间】:2013-07-12 18:36:32
【问题描述】:

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

我创建了一个新的 FMHD 应用程序并在其上放置了一个 TTabControl 和一个按钮。然后我设计了一个接口IFoo。为了简单起见,我们假设它只有一个过程:

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

    procedure makeTab(tc : TTabControl);

  End;

我在 DLL 中实现了这个接口。 DLL 通过 LoadLibrary 加载并导出a
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 中创建此选项卡(和几个子组件)?

【问题讨论】:

  • 你需要使用包。因为您的应用程序中有两个 FMX 实例。一个在 exe 中,一个在 DLL 中。
  • 是的,谢谢,这行得通!母猪...也许您可以将解决方案写为响应,以便我可以接受它作为答案?

标签: delphi firemonkey delphi-xe3


【解决方案1】:

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

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

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

【讨论】:

  • 我仍然必须使用 DLL 来实现我的意图。但我现在使用 FMX 运行时包。问题已经解决了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多