Delphi XE - TRibbon 操作始终将焦点发送到 MainForm
当我将 TRibbon 控件放置在不是应用程序 MainForm 的窗体上时,TRibbon 的操作(即剪切、粘贴)将始终在执行操作后将焦点返回到 MainForm。
即使保存 TRibbon 的 TForm 不是 MainForm 的子级,也会发生这种情况。
我使用的是 Windows 7 64 位、Embarcadero RAD Studio XE 版本 15.0.3953.35171。
我是否错误地使用了 TRibbon 控件,或者这是 TRibbon 的问题吗?
When I place a TRibbon control on a form that is not the MainForm of the application, that TRibbon's actions (i.e. Cut, Paste) will always return focus to the MainForm after the action is executed.
This occurs even if the TForm that holds the TRibbon is not a child of the MainForm.
I am using Windows 7 64-bit, Embarcadero RAD Studio XE Version 15.0.3953.35171.
Am I using the TRibbon control incorrectly, or is this an issue with the TRibbon?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这显然是设计使然。来自“ribbonactnctrls.pas”的示例代码片段:
如您所见,没有检查任何条件来帮助我们避免调用。菜单项选择和按键处理程序中也有相同的代码。
我可能会修改注释焦点调用的源代码,并尝试查看是否有任何副作用。
作为替代方案,您可以在切换到主窗体后将焦点恢复到窗体。假设“ActionList1”是包含非主窗体上的标准操作的 TActionList:
但这将导致主窗体在每次执行操作时短暂闪烁。如果您不希望这样,您可以更改设计,以便主窗体知道何时获得不需要的焦点,并假装它没有获得焦点。
In unit1:
in unit2:
但是,如果您没有在项目源代码中设置“MainFormOnTaskBar”,这还不够,因为这样主窗体不仅会获得焦点,而且会被带到前面。在这种情况下,两种形式都可以通过冻结其 z 顺序来响应不需要的焦点更改/激活。代码将变为 for unit1:
和 for unit2:
This is evidently by design. Sample code snippet from 'ribbonactnctrls.pas':
As you see there are no conditions checked that would help us avoid the call. There's the same code also in menu item selection and key press handlers.
I would probably modify the source commenting the focus calls, and try to see if there're any side effects.
As an alternative you can restore the focus back to your form after it is switched to the main form. Suppose 'ActionList1' is the TActionList that contains standard actions on the not main form:
This will however cause the main form to flash briefly every time an action is executed. If you don't want that, you can change the design so that the main form knows when it is getting an unwanted focus, and fake that it's not focused.
In unit1:
in unit2:
However, this is not enough if you don't have 'MainFormOnTaskBar' set in project source, since then the main form will not only gain focus but will be brought to front. In this case both forms could respond to the unwanted focus change/activation by freezing their z-orders. The code would then become for unit1:
and for unit2: