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

Delphi 当DragMode为dmAutomatic时,如何使TScrollBox自动滚动?,delphi,mouseevent,c++builder,onmouseover,Delphi,Mouseevent,C++builder,Onmouseover,我有一个滚动框,其中有一个网格面板,其中有按钮。 我将所有按钮的DragMode设置为dmAutomatic,以便可以在拖放时移动按钮 但我有一个问题:因为GridPanel比ScrollBox大,所以ScrollBox具有可见的垂直滚动条。我想让滚动条自动向下滚动,这样我就可以将底部从可见的顶部行放到底部不可访问的行中。这是所有Windows程序的典型行为,对吗 我有一个简单的代码可以实现这一点:在MouseMove中,我检测鼠标何时接近滚动框的底部,并调整ScrollBox.vertsoll

我有一个滚动框,其中有一个网格面板,其中有按钮。 我将所有按钮的DragMode设置为dmAutomatic,以便可以在拖放时移动按钮

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

我有一个简单的代码可以实现这一点:在MouseMove中,我检测鼠标何时接近滚动框的底部,并调整ScrollBox.vertsollba.Position向下滚动。仅当我未处于拖放模式且未拖动按钮时,此选项才有效

如果我开始拖放操作

即使在拖放模式下,我也可以如何接收MouseMove事件?
一个解决方案是不使用dmAutomatic,而是基于mousedown、mousemove、mouseup实现我自己的拖放选项。这是更快的解决方案吗

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


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

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


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

如果我没有记错,TDragObject将在拖放过程中接收和处理鼠标消息。但是你应该得到例如DragOver事件。@nil-我想我明白了:把代码从MouseMove移到DragOver。我试试看。谢谢也许,如果不拖动时收到MouseMove,拖动时收到DragOver,这是真的。@nil-它可以工作。你能把你的评论作为一个答案,这样我就可以接受了吗?150万谢谢。即使我处于拖放模式,我也能做些什么来接收MouseMove事件没有什么你不能。有关说明,请参阅MSDN上的SetCapture文档。从TDragObject.Capture调用。如果我没记错,TDragObject将在拖放过程中接收并处理鼠标消息。但是你应该得到例如DragOver事件。@nil-我想我明白了:把代码从MouseMove移到DragOver。我试试看。谢谢也许,如果不拖动时收到MouseMove,拖动时收到DragOver,这是真的。@nil-它可以工作。你能把你的评论作为一个答案,这样我就可以接受了吗?150万谢谢。即使我处于拖放模式,我也能做些什么来接收MouseMove事件没有什么你不能。有关说明,请参阅MSDN上的SetCapture文档。从TDragObject.Capture调用。