我曾试图效仿的例子:
http://docwiki.embarcadero.com/CodeExamples/Rio/en/FMXEmbeddedForm_(Delphi)
但窗体元素就是不出现。我使用的是 Delphi 10.3,并针对Windows进行编译。如果窗体和面板都在库项目或程序项目中,那么它就可以正常工作。
它需要在Windows和MacOS中工作。
我曾试图效仿的例子:
http://docwiki.embarcadero.com/CodeExamples/Rio/en/FMXEmbeddedForm_(Delphi)
但窗体元素就是不出现。我使用的是 Delphi 10.3,并针对Windows进行编译。如果窗体和面板都在库项目或程序项目中,那么它就可以正常工作。
它需要在Windows和MacOS中工作。
1条答案
按热度按时间k10s72fa1#
要在DLL中创建FMX表单,您必须创建一个DLL并添加所需的表单。在DLL中,您必须公开一个API,该API将您的DLL(一个或多个)表示为平面API,即普通函数和过程(不是方法)来创建/销毁表单,显示/隐藏表单以及您可能需要的任何其他内容。
对于窗体中的事件,您的DLL必须实现回调机制。当触发事件(例如单击按钮)时,您必须调用相应的回调。
主应用程序将像往常一样加载DLL,调用Windows LoadLibray函数。然后将调用您设计的API来创建窗体,使其可见,设置其边界并设置任何所需的回调。
在调用应用程序的FMX窗体中附加DLL中的窗体有些困难。FMX组件(TForm除外)没有窗口句柄,而要在应用程序窗体中看到DLL中的窗体,需要使用该句柄。
如果您喜欢将DLL的窗体附加到应用程序窗体中,那么这很容易,因为任何FMX窗体都有一个方法FormToHWND()来获取窗体的窗口句柄。它可以被传递给DLL。DLL必须使用该句柄来设置DLL中窗体的父窗口。
我已经创建了一个简单的应用程序和相应的DLL。DLL有一个单一的表单,其中有一个TLabel、一个TEdit和一个TButton。应用程序有一个单一的表单,其中有两个TButton(用于在DLL中创建/显示和隐藏表单),以及一个TMemo,用于显示DLL中的数据。
在DLL中,按钮用于通过回调将数据发送到主应用程序。
代码如下:
主应用程序中的表单为dfm:
DLL的代码:
最后是DLL中的表单代码:
格式为.dfm的DLL:
享受吧弗朗索瓦·皮耶特