DragMode为dmAutomatic时,如何让TScrollBox自动滚动?

How to make the TScrollBox automatically scroll when DragMode is dmAutomatic?

我有一个 ScrollBox,其中有一个 GridPanel,其中有按钮。 我将所有按钮的 DragMode 设置为 dmAutomatic,这样我就可以四处移动按钮(拖放)。

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

我有执行此操作的简单代码:在 MouseMove 中,我检测到鼠标何时接近 ScrollBox 的底部,然后我调整 ScrollBox.VertScrollBa.Position 以向下滚动。这仅在我不处于 "drag and drop" 模式时有效(如果我没有拖动按钮)。

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

即使我处于 "drag and drop" 模式,如何接收 MouseMove 事件?
一种解决方案是不使用 dmAutomatic 并实现我自己的拖放替代方案(基于 mousedown、mousemove、mouseup)。这些是更快的解决方法吗?

在拖放操作期间,VCL 将创建一个 TDragObject to manage said drag-and-drop operation. This TDragObject - or a derived class - will start receiving and handling mouse events as long as dragging lasts. In turn, it will generate drag-and-drop specific events like OnDragOver and OnDragDrop,它可以由当前鼠标位置下的 - 潜在目标 - 控件处理。

这将允许您在没有发生拖放时处理 OnMouseMove。此外,以类似的方式处理 OnDragOver 以捕捉当前拖动时的鼠标移动。