【发布时间】:2012-11-25 20:29:52
【问题描述】:
我知道我可能遗漏了一些东西,但我不明白是什么。 我刚刚创建了一个包含 2 个表单(Form1、Form2)的测试应用程序。 我在 OnClick 事件处理程序中使用以下代码向 Form1 添加了一个按钮:
Application.CreateForm(TForm2,Form2);
Form2.Show;
当我单击该按钮时,会按原样显示第二个表单,但如果我单击 Form1,即使它的属性 TopMost 设置为 true,我也无法将其置于最前面。
我错过了什么? 我该如何解决? 我需要展示一些必须始终位于顶部的子表单和主表单。
【问题讨论】:
-
看起来 form1 是 form2 的所有者。我的意思是 Windows 意义上的所有者。在 VCL 中,术语将是弹出父级。
-
是的,由 FMX 创建的所有表单都在
TPlatformWin.CreateWindow中设置了ParentWnd。创建的第一个表单使用GetDesktopWindow,这似乎是个糟糕的主意。后续表单使用第一个表单的窗口句柄。这意味着后续表单始终由创建的第一个表单拥有。这太糟糕了。不知道如何解决它,因为我不使用 FMX。我希望我永远不必这样做。 -
在 XE2 上它按预期工作。如果我使用 XE3 编译,我可以使用 WinDowse 将第一个表单置于顶部(选项卡修改 -> 留在顶部)。但我不知道他们使用哪些 API 和参数来施展魔法……
-
是的,代码似乎已从 XE2 更改为 XE3。在 XE2 中,所有者始终为
GetDesktopWindow。好吧,模态形式得到特殊处理,但那是题外话。在我看来,这只是 FMX 中的一个设计限制。
标签: delphi delphi-xe3 firemonkey-fm2