【问题标题】:Delphi - Creating component in a DLL when I have no ParentDelphi - 当我没有父级时在 DLL 中创建组件
【发布时间】:2014-11-07 15:27:04
【问题描述】:

Delphi XE6 - 我正在使用 AddInExpress 创建一个基于 COM 的 Excel 插件。到目前为止一切正常。我添加了一个功能区菜单,用户可以单击它来显示特定信息。我想在一个名为 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”。这是正确的做法吗?

谢谢

【问题讨论】:

    标签: delphi dynamic dll com parent


    【解决方案1】:

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

    如果您的组件不能接受无主,那么我担心隐藏表单或类似表单可能是最方便的解决方法。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多