如何滚动 Firemonkey TListBox 而不在其控件中捕获焦点?

Posted

技术标签:

【中文标题】如何滚动 Firemonkey TListBox 而不在其控件中捕获焦点?【英文标题】:How to scroll Firemonkey TListBox without capturing focus in its controls? 【发布时间】:2017-09-15 16:09:31 【问题描述】:

我有一个TListBox,每个项目中都有控件,例如TEditTComboBoxTSwitch 等,向右对齐。此列表中大约有 20 个项目,因此它超出了屏幕范围,因此用户需要滚动(通过滑动手指)才能到达底部。

问题在于,即使在快速手势中,如果用户最初在其中一个控件上滑动手指,该控件也会获得焦点并且列表不会滚动。目前,向上或向下滚动的唯一方法是在没有任何控件的列表左侧滑动手指。我可以禁用HitTestCanFocus,但随后该控件将永远获得焦点,即使用户想要实际点击它。

如何允许用户在这些控件上向上或向下滑动以滚动列表该控件不会获得焦点?

【问题讨论】:

您使用的是 Tokyo 的修补程序还是以前的版本? @AlbertoMiola 我正在使用 Delphi 10 Seattle。 @AlbertoMiola 您是否建议在东京修补程序中修复此问题? 我要发布一个答案,但我测试了它并没有真正起作用。我很久以前遇到过同样的问题,但我真的无法解决问题。我刚刚禁用了 CanFocus :( 并不是真正的解决方案... 我还没有测试它是否有效,但也许一个可能的解决方案是编辑组件的自定义样式。我想过这个,但最后我选择了 CanFocus = false。这也是我不太喜欢的东西,但我想除非“硬编辑”(编辑样式),否则我们无能为力! 【参考方案1】:

我遇到了同样的问题。

为了使用 TListBox 解决这个问题,我使用了一个 TVertScrollBox,里面有一个布局。

每个控件都与顶部对齐,为了使其正常工作,我需要一个 VKVertScrollBox 来自: https://github.com/DelphiWorlds/KastriFree/tree/master/Demos/VKVertScrollbox

这样做您将拥有一个可滚动的组件列表,您可以在其中向下滑动手指并查看它的移动。

此外,为避免在滑动时对每个组件进行输入和 getFocus,您可以在每个组件上使用帮助程序通过覆盖 MouseDown、MouseMove 和 MouseUp 来捕捉移动,并防止在移动时进入覆盖 doEnter(也被覆盖)(捕获在 MouseMove 方法上)。

【讨论】:

以上是关于如何滚动 Firemonkey TListBox 而不在其控件中捕获焦点?的主要内容,如果未能解决你的问题,请参考以下文章

如何“刷新” TListBox?

如何自定义排序 VCL TListBox?

Firemonkey:如何定义一个包含另一个组件的组件?

如何在Delphi FireMonkey中发送iOS的推送通知

如何使用 FireMonkey 创建托盘图标?

为啥我的 tlistbox 要求我将 & 符号加倍? [复制]