所以基本上就是我所做的:
我制作了一个新的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中创建此选项卡(以及几个子组件)?
答案 0 :(得分:1)
这里的基本问题是你不能使用DLL在模块之间共享Delphi类类型。原因是需要单个类型的多个版本。可执行文件中的一个版本,以及每个使用它的DLL中的一个版本。
这与VCL存在的同样众所周知的问题也是开发运行时包的原因。这也是您对FMX的解决方案。如果需要在模块之间共享Delphi类类型,则需要对类型进行单一定义。运行时包是使这成为可能的机制。
因此,停止使用DLL,将代码移动到运行时包中,确保使用运行时包链接RTL和FMX,这个问题将得到解决。