DragMode为dmAutomatic时如何使TScrollBox自动滚动?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DragMode为dmAutomatic时如何使TScrollBox自动滚动?相关的知识,希望对你有一定的参考价值。

我有一个ScrollBox,其中有一个GridPanel,其中有按钮。我将所有按钮的DragMode设置为dmAutomatic,以便可以左右移动按钮(拖放)。

但是我有一个问题:因为GridPanel大于ScrollBox,所以ScrollBox的垂直滚动条可见。我想使ScrollBar自动向下滚动,以便可以将底部从可见(顶部)行放到底部无法访问的行中(这是所有Windows程序的典型行为,对吗?)

我有执行此操作的简单代码:在MouseMove中,我检测到鼠标何时靠近ScrollBox的底部,并调整ScrollBox.VertScrollBa.Position向下滚动。仅当我不处于“拖放”模式(如果我不拖动按钮)时,此方法才有效。

如果我开始拖放操作NO mouse events are fired

即使我处于“拖放”模式,我该怎么办才能接收MouseMove事件?解决方案是不使用dmAutomatic并实现我自己的拖放替代方案(基于mousedown,mousemove,mouseup)。这些是更快的解决方法吗?

答案

在拖放操作期间,VCL将创建一个TDragObject来管理所述拖放操作。只要拖动持续,此TDragObject-或派生类-将开始接收和处理鼠标事件。反过来,它将生成特定于拖放的事件,例如TDragObjectOnDragOver,这些事件可以由-潜在目标-当前鼠标位置下的控件处理。

这将使您在无拖放发生时都处理OnDragOver。另外,以类似方式处理OnDragDrop来捕获当前拖动时的鼠标移动。

以上是关于DragMode为dmAutomatic时如何使TScrollBox自动滚动?的主要内容,如果未能解决你的问题,请参考以下文章

更改 T 的属性时如何使 LiveData<MutableList<T>> 更新?

T-SQL:如何使单元格值唯一?

如何使返回类型以可选参数为条件

如何使 SET XACT_ABORT ON 回滚事务?

如何使用泛型类型接口在接口内使参数有条件

如何使用 async 和 await 使方法异步?