我正在DLL中构建一个表单,并希望将该表单嵌入到宿主应用程序中。当然,我不能简单地将Parent控件传递给DLL。但是我必须从EXE表单(在TPanel
内)提供这个DLL表单。
如何在嵌入其主机应用程序的DLL中创建此表单,在面板中作为Client对齐?
我正在构建的是一个设置模块,它由表单左半部分的树视图和右侧的空占位符面板组成,就像一个管理单元控制台。每个可能的模块由DLL表示,一个对应于树视图中的每个节点。
修改
我之前没有提及的一件重要事情,我实现DLL的原因是因为每个设置模块可能是用不同的语言开发的。大多数将是Delphi,但是它所基于的软件包包含用Delphi之外的其他语言构建的不同应用程序(例如C#)。这些开发人员将设计自己的设置模块进行集成。
答案 0 :(得分:4)
如果父级是另一个Delphi程序,你可以简单地将你的DLL作为BPL,然后你不应该遇到像这样的问题。查看JVCL中的插件系统,以便通过软件包轻松地将新功能插入到程序中。
答案 1 :(得分:4)
我不知道这是否会解决所有问题(除了释放表单,我会公开函数来做任何涉及dll表单的外部事件),但这应该是一个良好的开端:
library testdll;
uses dllunit in 'dllunit.pas' {Form1}, windows;
procedure callform(ParentForm: HWnd);
// simple test, resource management is necessary on the form.
var
dllform: TForm1;
begin
dllform := TForm1.Create(nil);
dllform.Show;
Windows.SetParent(dllform.Handle, ParentForm);
end;
exports
callform;
end.
program mainprogram;
procedure callform(ParentHandle: THandle); external 'testdll.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
callform(Panel1.Handle);
end;
就像说的那样,一旦你开始在dll表单中添加功能,可能会有其他问题,但是(对我而言)它将dllunit.pas中设计的表单放入主窗体的项目中,Panel1作为父级并且正在运行预期。但就像说的那样,这只是一个开始。
答案 2 :(得分:0)
是的,它是句柄,只需调用它来填充任何组件,如Groupbox或Panel