2

我正在 DLL 中构建一个表单,并希望将该表单嵌入到主机应用程序中。当然,我不能简单地将父控件传递给 DLL。但我必须从 EXE 表单(在 a 内)给这个 DLL 表单一个 Parent TPanel

如何在嵌入其主机应用程序的 DLL 中制作此表单,在面板中与客户端对齐?

我正在构建的是一个设置模块,它由表单左半部分的树视图和右侧的空占位符面板组成,就像一个管理单元控制台。每个可能的模块都由一个 DLL 表示,一个对应于树视图上的每个节点。


编辑

我之前没有提到的一件重要的事情是,我实现 DLL 的原因是因为每个安装模块可能是用不同的语言开发的。大多数将是Delphi,但是它所基于的软件包由使用Delphi以外的其他语言(例如C#)构建的不同应用程序组成。这些开发人员将设计自己的设置模块进行集成。

4

3 回答 3

4

I don't know if this will address all the issues (save freeing the form, I would expose functions to do anything external involving the dll form), but this should give a good start:

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;

Like was said, there might be other issues once you start adding features to the dll form, but (for me) it's putting the form designed in dllunit.pas into the main form's project with Panel1 as a parent and is operating as expected. But like was said, this was just intended as a start.

于 2013-09-03T01:35:00.933 回答
4

如果父程序是另一个 Delphi 程序,您可以简单地将您的 DLL 作为 BPL,然后您不应该遇到这样的问题。查看 JVCL 中的插件系统,了解一种可以轻松地将新功能插入到带有包的程序中的方法。

于 2013-09-02T17:59:47.237 回答
0

是的,它是句柄,只需调用它来填充任何组件,如 Groupbox 或 Panel

于 2015-07-23T17:31:05.887 回答