【问题标题】:Delphi XE2 assigning Application.MainForm.Handle to Application.Handle inside a DLLDelphi XE2 将 Application.MainForm.Handle 分配给 DLL 中的 Application.Handle
【发布时间】:2012-03-01 06:58:59
【问题描述】:

我对从 DLL 中创建的表单有一个小问题。

基本上,当来自 dll 的表单 (Form1) 显示时(我认为它必须保持在顶部)并且您打开另一个表单 (Form2),它是主应用程序的一部分(即不在内部) dll)。如果将光标放在 Form2 上的某个控件上以显示提示,则 Form2 将立即移到 Form1 后面。

这只发生在 MainFormOnTaskBar 为 true 的情况下。目前我们正在将主应用程序的 Application.Handle 传递给 DLL,并将其分配给 DLL 的 Application.Handle。

我已设法通过将 Application.MainForm.Handle 传递给要分配给 DLL 中的 Application.Handle 的 DLL 来解决此问题。

这样安全吗?有谁知道解决这个问题的正确方法吗?

【问题讨论】:

    标签: windows delphi dll delphi-xe2


    【解决方案1】:

    您的解决方案完全合理。我有一个 Excel COM 插件,它做的事情非常相似。在该代码中,我将 DLL 中的 Application.Handle 设置为 Excel 主窗口的窗口句柄。这与您正在做的事情类似。

    问题是您需要正确设置窗口所有权。您需要所有权链一直返回到您的应用程序的主窗体。 DLL 中的表单不知道主表单是什么,因此您必须提供该知识。

    请注意,我说的是 Windows 使用的窗口所有者的概念,而不是完全不同的 VCL 的所有者概念。在 VCL 术语中,这被称为弹出父级,您可以通过将 DLL 表单的弹出父级显式设置为主表单来解决您的问题。相关属性是 PopupMode 和 PopupParent。对于存在于主应用程序中的表单,VCL 自然会将其弹出父级作为主表单。

    但是,在谈到显式设置弹出父级之后,我要强调您当前的解决方案更简单、更方便。

    这两种解决方案的作用是确保所有辅助表单都归主表单所有。这意味着这些表单始终位于主表单之上。这意味着如果主窗体被最小化,辅助窗体将被最小化。在此处阅读有关自有窗口的信息:Window Features

    顺便说一句,如果您使用的是运行时包而不是 DLL,则包中的代码将连接到与主窗体相同的 VCL。因此打包后的代码将能够看到主窗体并适当地设置窗口所有者。这当然是使用包的优势之一。当然,您需要使用 DLL 而不是包可能有充分的理由。

    【讨论】:

    • 谢谢。我只是想知道是否需要在 DLL 中包含的应用程序对象上将 MainFormOnTaskBar 属性设置为 true?
    • 由于 DLL 中的应用程序对象没有主窗体,所以我想我们不需要或不应该在应用程序对象上将 MainFormOnTaskBar 设置为 true
    • 同意,没有必要,这实际上并不重要,因为我认为 Application.MainForm 未分配,因为您从未调用 Application.CreateForm。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多