Delphi - 当我没有Parent时在DLL中创建组件

时间:2014-09-13 16:47:11

标签: delphi dynamic dll com parent

Delphi XE6 - 我正在使用AddInExpress为Excel创建一个基于COM的插件。一切都达到了这一点。我添加了一个功能区菜单,用户可以单击该菜单以显示特定信息。我想在组件调用HTMLPopup(由TMS Software)中显示它。它是一个弹出窗体,旨在显示基于HTML格式的信息。组件声明是

HTMLPopup := THTMLPopup.Create(AOwner: TComponent);

我的挑战是我没有(或无法弄清楚)什么是适用的所有者。由于这是一个LIBRARY / DLL,我没有“拥有”这个表单。

我尝试过设置

HTMLPopup := THTMLPopup.Create(self); // Errors on compile, SELF undeclared

当我将所有者设置为数据模块时,我会在运行时获得AV。

我尝试过设置

  HTMLPopup :=THTMLPopup.Create(Application);  //Again, error at runtime.

 as well as ...  HTMLPopup :=THTMLPopup.Create(nil);  //Again, error at runtime.

我找到了唯一的解决方法来创建一个表单,但是将其隐藏起来,然后创建我的HTMLPopup,其中所有者是我的隐藏表单。这似乎是一种“kludgey”。这是正确的方法吗?

由于

1 个答案:

答案 0 :(得分:2)

通常你会传递nil作为拥有者,这意味着该组件将是无主的。这意味着您的代码将负责以后调用Free来销毁组件。

如果你的组件不能接受无主,那么我担心隐藏的形式或类似形式可能是最权宜的解决方法。

您可以考虑与组件供应商联系以获得他们的支持。毕竟,他们比任何人都更了解组件。也许问题只不过是这个控件中的一个简单错误。

您还可以避免使用第三方控件并托管TWebBrowser

我猜您需要注意的一件事是您的弹出式窗口所有者是如何设置的。这与组件所有者不同。窗口所有者在Delphi术语中称为弹出父级。窗口始终显示在其所有者上方。您将要确保Excel窗口是窗口的所有者。