Delphi 2007 - ManualFloat 导致小部件控件浮动在所有其他窗口之上

Posted

技术标签:

【中文标题】Delphi 2007 - ManualFloat 导致小部件控件浮动在所有其他窗口之上【英文标题】:Delphi 2007 - ManualFloat causes widget controls to float above all other windows 【发布时间】:2016-11-11 01:17:51 【问题描述】:

我们在 Delphi 2007 应用程序中有一些 Widget 控件。小部件继承自 TWinControl。在小部件上,我们调用 TControl 方法 ManualFloat 来取消停靠小部件。

问题是,当 MainFormOnTaskBar 为 true 时,调用 ManualFloat 会给小部件 StayOnTop 类似的行为,导致它浮动在包括其他应用程序在内的所有窗口之上。这是一个问题,因为如果您从表单打开模式对话框,那么它会出现在小部件的后面。当 MainFormOnTaskBar 为 False 时,模式对话框会出现在小部件的顶部。

有谁知道我如何通过不允许小部件成为最顶层或至少阐明可能的解决方案/解决方法来解决此问题?我的猜测是该小部件正在成为 Application.MainForm.Handle 的父级,这就是我得到这种行为的原因。

提前致谢。

【问题讨论】:

你为什么要猜测出身?当您单步执行代码时,调试器会告诉您什么?如果调试器干扰了行为,那么当您在代码中抛出一些 OutputDebugString 调用时会看到什么?我们如何调试我们看不到的代码?我们如何重现该问题? ManualFloat 不是(afaik)任何标准(即“在框中)Delphi VCL 控件的属性。Delphi 控件通常也不称为“小部件”。我怀疑您所描述的是某个 3rd 方或自定义控件库,因此除非您至少告诉我们您实际处理的是什么控件库(或控件),否则没有人能够提供帮助。 打开 DockEx 示例。将工具按钮添加到顶部工具栏。将此代码添加到其单击处理程序:DockWindows[0].ManualFloat(Rect(0, 0, 320, 240)); 运行程序。单击“白色”按钮。停靠白色窗口。按下您添加的按钮,白色窗口将“手动浮动”。注意它不是“StayOnTop”。 如果你能做一个简单的测试,看看你是否可以在发布问题之前自己在一个新项目中复制你的问题,那就太好了。 @Deltics - It's 是IDE uses 的对接机制的一部分。 【参考方案1】:

您是否尝试强制您的 Widget 的父窗体作为主窗体?

MyWidget.manualFloat(screenpos);    
MyWidget.Parent := MyMainForm;
MyWidget.ParentWindow := MyMainForm.Handle;
MyWidget.left := left desired 
MyWidget.Top := Right.desired; 

【讨论】:

以上是关于Delphi 2007 - ManualFloat 导致小部件控件浮动在所有其他窗口之上的主要内容,如果未能解决你的问题,请参考以下文章

Delphi2007升级到Delphi 2010总结

Delphi 2007 从应用程序拖动

我在用delphi2007打开一个delphi工程文件的时候,出现下列错误: 请高手指点

在 Delphi 2007 中丢失了一些调试功能

如何使delphi2007在打开的时候不打开默认的网页?

TstringBuilder Delphi2007版