问题标签 [stayontop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4644 浏览

delphi - 德尔福 fsStayOnTop 古怪

这是交易。主窗体设置为fsNormal. 这个主窗体是最大化的,带有一个浮动工具栏的全屏。工具栏是标准形式,样式设置为fsStayOnTop.

大多数情况下,这按预期工作。主窗体显示,工具栏浮在其顶部。

有时(这是一个寻找可重复的步骤集的麻烦)当 alt-tabbing 与其他应用程序之间(或单击任务栏上的 Delphi 应用程序图标时)可能会发生以下症状:

  1. 当 alt-tab 离开 Delphi 应用程序时,浮动的最上面fsStayOnTop的表单保持在其他应用程序的顶部。因此,如果我 alt-tab 切换到 Firefox,那么浮动菜单也会保留在 Firefox 之上。

  2. 当从另一个应用程序切换到 Delphi 应用程序时,浮动菜单不可见(因为它位于主窗体后面fsNormal)。

这是一个已知的错误还是有任何黑客迫使它工作?当应用程序的多个副本正在运行时,这似乎也最常发生(它们之间没有交互,应该在自己的窗口“沙箱”中运行)。

就好像 Delphi 混淆了哪个窗口应该在最上面并交换它们或将浮动形式更改为 stayontopofeverything 模式。

还是我误解了fsStayOnTop?我假设设置表单样式以fsStayOnTop使其保持在当前应用程序中的所有其他表单之上,而不是其他正在运行的应用程序中的所有窗口。

0 投票
4 回答
4838 浏览

delphi - fsStayOnTop 表单隐藏的模态表单

我有一个表单(在下面的示例中为 TBigForm),它允许操作一些复杂的数据并需要显示其他信息。我将此信息放在 fsStayOnTop 表单(示例中为 OnTopForm)中,以确保它始终可见,但如有必要可以将其移开。现在,当 TBigForm 中的某些用户操作显示模态表单时,这通常会隐藏在 OnTopForm 后面,这会使应用程序看起来冻结。我怎样才能避免这种情况?(搜索产生了很多很多点击,但我无法从中提炼出解决方案。)

在我的真实应用中,有很多地方会显示模态表单,所以我想避免更改所有这些调用。

示例:创建一个新的 VCL 应用程序,在 Form1 上放置一个 TButton,双击该按钮并将生成的 Button1Click 实现存根替换为以下内容:

启动应用程序,点击“Button1”,然后点击“Freeze!”。

(顺便说一句:我们使用 D2007。)

0 投票
4 回答
9715 浏览

python - PyQt4:如何切换“保持领先”行为?

我想创建一个应用程序,用户将在其中决定主窗口将始终位于其他应用程序之上。

在 PyQt4 中,很容易创建一个始终位于顶部的窗口。这在这里介绍:PyQt:始终在最前面

我想要一个可以打开或关闭此行为的小部件(菜单项、复选框等)。到目前为止,我还没有找到重置原始行为的方法。

谢谢你

更新在 İsmail 'cartman' Dönmez 的建议之后,我进行了更多搜索,并在 PyQt4 中找到了 WindowFlags 示例的实现。

可以在这里找到

0 投票
2 回答
5743 浏览

delphi - 上面的控件,像TPanel可以做什么?

我的程序正在执行一项耗时的任务,我想在应用程序窗口的中间显示一个 TImage,但它不会保持在顶部 - 我的 VST 总是在顶部。但是,当我使用 TPanel 时,它会保持在顶部吗?我怎样才能让我的 TImage 做到这一点?

事实上,适用于所有控件的解决方案将非常棒:)

谢谢!

0 投票
1 回答
3270 浏览

delphi - 我怎样才能让 FindDialog 保持在顶部(Delphi)?

在 Delphi 2009 中,我做了一个简单的操作:

FindDialog 窗口应保持在我的程序主窗口的顶部。

但是,如果我通过我自己的程序窗口从其他程序打开另一个窗口,则 FindDialog 窗口仍位于另一个窗口的顶部。

如果我用另一个程序(例如记事本)中的 FindDialog 尝试此操作,则不会发生这种情况。通过记事本打开另一个程序的窗口及其 FindDialog 将覆盖记事本和 FindDialog 窗口。这似乎是正确和预期的行为。

这是我做错了什么还是德尔福实现 FindDialog 的方式有问题?我能做些什么让它以记事本的方式工作吗?


谢谢大家的意见。您无法重现我的问题这一事实已经表明这是其他原因造成的。这将帮助我追踪它。当我发现一些东西时,我会进行更多研究并在此处发布其他信息。


很有意思。我的 PrintDialog 没有保持在顶部。仍然不知道为什么我的 FindDialog 会。还在研究...


我将调用更改为: FindDialog.Execute(Handle); 还是在上面。


我在主窗体中添加了另一个 FindDialog(这次是 FindDialog1),并在程序启动时执行它。它具有相同的保持领先的行为。这至少表明它与我的 FindDialog 或我所做的自定义无关。所以它必须是我的主要形式中的一个设置。


看来我不是唯一遇到这种情况的人。请参阅:Resource Tuner:版本历史,它似乎是一个 Delphi 应用程序,在 1.99 版下它指出:“修正:(搜索)对话框预览窗口在切换到另一个应用程序时保持在顶部。” 我可能会尝试联系他们,看看他们是否记得他们的解决方法是什么。


我在表单中添加了一些新对话框,并将这些调用放在一个地方:

FindDialog 和 ReplaceDialog 位于其他窗口前面。PrintDialog 和 FontDialog 不会停留在最上面并按应有的方式工作。

那么让前两个做错的两组对话框有什么不同呢?


此外,这个问题发生在我用 Delphi 4 编译的旧版本的程序中。哎呀。现在我看到这个问题在我使用 Delphi 4 的旧版本中没有发生。

是一个用户报告了这个问题。他使用 Windows XP,而我在 Vista 上开发,所以它发生在不同的操作系统下。


确认:是的,我创建了一个新表单并在其上添加了 FindDialog。FindDialog 没有问题。这表明我的程序中的某些内容导致 FindDialog 保持在顶部。现在,我只需要找出那是什么。还有什么想法吗?如果有人给我一个答案,甚至给我一个线索来帮助我解决这个问题,那么他们将得到接受的答案。


解决方案:Sertac 对他的回答的编辑给了我解决方法:

当应用程序不是 TopMost 时,这样做可以防止 FindDialog 成为 TopMost。

...但我仍然真的不明白这一点(NormalizeTopMosts 上的 Delphi 帮助)非常令人困惑,并不表示它应该这样做。

希望这个“修复”不会导致其他问题。

0 投票
1 回答
21348 浏览

delphi - 如何在其所有者表单之上显示模式表单(其所有者是否设置为 fsStayOnTop),就像 TOpenDialog 一样

总结:

请参阅下面来自 Craig 和 Sertac 的有用评论。

==================================================== ====

如以下最小化代码所示,TForm10设置为fsStayOnTop. TForm10.btnTryDlgClickcall dlgOpen1.Execute,显示的对话框与预期的一样。但是,当我调用TForm11.Create(Self).ShowModalinside时TForm10.btnTryFormClick,表单隐藏在 TForm10 后面。我想知道如何理解这种行为,为什么标准 TOpenDialog 可以按预期显示?任何评论表示赞赏!

PS:一种解决方法是覆盖 TForm11 的 CreateParams 过程,并将 Params.wndParent 设置为 0。但在我看来,使用此解决方法会破坏窗口层次结构。

PS:Remy 在以下相关 SO 页面中提到了另一种解决方法: setting the modal Form's PopupParent property to be the StayOnTop Form. 但在随后的评论中,Sertac 提到这种解决方法也会破坏窗口层次结构。

PS:可能相关的 SO 页面:
由 fsStayOnTop 表单隐藏的模态表单
如何使 FindDialog 保持在顶部(Delphi)?
如何确保对话框始终位于主窗口的前面
当调用 ShowModal 时,窗体隐藏在其他窗体后面
使 2 个窗体能够相互重叠?
多表单 Delphi 应用程序和对话框
新创建的模式窗口在 Windows Vista 中失去焦点并变得无法访问
Delphi - 如何防止 Forms/MsgBoxes 在先前的表单下移动?
如何
使用 Show 在主窗体 Fake 模态对话框后面允许 Delphi 辅助窗体?
Delphi MainFormOnTaskBar 模态窗口错误

单元 10 的来源:

单元 10 的 DFM:

单元 11 的来源:

单元 11 的 DFM:

0 投票
1 回答
1617 浏览

delphi - Delphi TColorDialog 在 stayOnTop 窗体后面打开

我有一个主窗体 (form1),它调用 form2,它是一个留在顶部的窗体。form2 调用模态表单 (form3),它也是一个留在顶部的表单。当 form3 模态窗体调用 colordialog 时,颜色对话框在 form3 后面打开。

什么设置在form3前面打开颜色对话框?

我正在使用 D2009

谢谢

0 投票
2 回答
2675 浏览

delphi - Delphi XE 中的“保持领先”主窗体和模式对话框

在 Delphi XE Update 1 中,如果父(主)表单的 FormStyle 设置为fsStayOnTop,我会得到看似随机的模态表单行为

1)使用 MainFormOnTaskbar := False (旧方式),一切都“正常工作”。使用新的 MainFormOnTaskbar := True,当主窗体设置为“留在顶部”时,模式窗体会隐藏在主窗体后面。在大多数情况下说

就在调用 modalForm.ShowModal 似乎有帮助之前。但不总是。

2)我所有的模态表单都很简单,没有多余的装饰,位于 MainFormCenter,不使用表单继承等。然而 PopupParent 修复只适用于其中的一半,而另一半仍然隐藏在主表单后面。最奇怪的是,在一种情况下,不相关的代码行的顺序会中断或导致。请参阅此代码中标记为 (1) 和 (2) 的行:

按此顺序执行时,模态表单正确显示在主表单的顶部。但是当我反转线条时,模态表单隐藏在 main 后面。标记为 (1) 的行设置了模态表单的属性,这导致在 TRzCheckGroup 中未选中的多个复选框被选中,位于 TRzPageControl(来自 Raize 组件)上。这是上面第 (1) 行执行时运行的 setter 方法:

如果第 (1) 行和第 (2) 行的顺序颠倒,这足以让模态表单显示在主表单后面。

这可能指向 TRzCheckGroup(它在设置器代码运行时被操纵),但我有两种其他形式显示相同的问题并且不使用 TRzCheckGroup(或 TRzPageControl)。而且我无法通过使用 Raize 组件的单独示例应用程序重现该问题。在设置器的持续时间内禁用表单、页面控件或 TRzCheckGroup 无效。

这似乎不是时间问题,因为当模态表单显示隐藏一次时,它总是如此。行为的改变仅来自重新排列代码行。

3)最后一个观察:我的模态表单相当简单,所以它们几乎可以立即显示,没有明显的延迟。但是当主窗体是 fsStayOnTop 时,我经常可以看到模态窗体显示在它上面,然后看到它被“推”到后面。然后,在按下 Esc 时,(不可见的)模态窗体会在主窗体顶部显示几分之一秒,然后关闭。

要么我错过了事后看来显而易见的东西,要么这是对心理调试的呼吁,我不知道。请问有什么想法吗?


更新。我试图在它发生的另一种形式上追踪问题。它有几个按钮(Raize)和一个 TSyntaxMemo(来自 eControl.ru 的增强备忘录组件)。这种形式与遇到问题的其他形式几乎没有任何共同之处。删除部分代码并进行测试后,我现在可以通过对将字符串分配给备忘录组件的方法进行微小更改来重现该问题:

这是我的原始代码,它导致包含编辑器的表单隐藏在主表单后面:

当我将分配更改为空字符串时,表单会正确显示:

当我为编辑器分配一个字符时,表单再次开始隐藏:

当然,其他两种有问题的形式不使用此编辑器组件或其任何单元。

我已经尝试删除备忘录控件并再次添加它(想想创建顺序等),但它没有效果。如果我在代码中创建备忘录也是一样的。一旦将非空字符串分配给备忘录的 Text 属性,表单就会隐藏。

0 投票
1 回答
17984 浏览

vb.net - 将 VB.Net 窗口置于所有窗口之上

我有一个窗口应该停留在 Power point 幻灯片放映的顶部。所以它应该在所有窗口的顶部。我使用 VB 6 使用 Lib "user32" 轻松做到了这一点,但它似乎对 VB.net 很困难。

这似乎不起作用,因为它只在程序中起作用。

这也会报错!任何帮助是极大的赞赏!提前致谢,

问候

曼朱拉

0 投票
1 回答
206 浏览

android - 在通话期间显示交互式浮动布局

背景

有一些不错的应用程序在顶部显示一些布局,而用户正在拨打电话或接听电话(如“当前呼叫者 ID ”)。

我需要创建一个能够在通话期间在顶部显示某些内容并允许它进行交互的应用程序。

问题

使用 broadcastReceiver 、前台服务和 SYSTEM_ALERT 权限,我已成功在通话期间在屏幕上显示某些内容。

只要显示的内容是静态的,我就没有问题。

但是,我注意到当我尝试使内容显示为交互式时,我遇到了一些问题:

  1. 一切都是跳跃的,这不仅包括动画,还包括将可见性设置为可见/消失。当我需要让事情变得可拖动时,我讨厌思考它会如何工作。

  2. 不确定这是否是原因,但使用 SlidingDrawer 使整个宽度属于 SlidingDrawer 并且您无法单击它。这意味着如果它的位置在底部,当有人打电话给你时,你不能触摸“接听”按钮。

问题

这些问题的原因是什么?

我怎样才能修复它们并能够正确显示?

其他应用程序如何正确处理它?


编辑:关于 SlidingDrawer ,它的位置和大小以及内容区域似乎有可怕的错误,即使它没有向用户显示并且用户可以看穿,它也无法被触及。不过,我不知道为什么,以及如何解决它,我也不知道为什么与普通应用程序相比,事情如此跳跃(可能是因为过度绘制,但它真的很慢)。

也许这个问题应该更笼统:如何制作像AirCalc上的浮动窗口,可以轻松移动但仍然相当快。

对于拖动功能,我尝试获取我显示的根视图(类型为 WindowManager.LayoutParams )的 layoutParams,更新它并再次设置它,但由于某种原因它没有做任何事情。想知道我做错了什么。

编辑:看来我应该使用 windowManager.updateViewLayout 来更新 layoutParams。使用这篇文章,我使它完全可以拖动。