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”。这是正确的方法吗?
由于
答案 0 :(得分:2)
通常你会传递nil
作为拥有者,这意味着该组件将是无主的。这意味着您的代码将负责以后调用Free
来销毁组件。
如果你的组件不能接受无主,那么我担心隐藏的形式或类似形式可能是最权宜的解决方法。
您可以考虑与组件供应商联系以获得他们的支持。毕竟,他们比任何人都更了解组件。也许问题只不过是这个控件中的一个简单错误。
您还可以避免使用第三方控件并托管TWebBrowser
。
我猜您需要注意的一件事是您的弹出式窗口所有者是如何设置的。这与组件所有者不同。窗口所有者在Delphi术语中称为弹出父级。窗口始终显示在其所有者上方。您将要确保Excel窗口是窗口的所有者。