Delphi:BeginDrag(False)和OnStartDrag

Delphi:BeginDrag(False)和OnStartDrag,delphi,drag-and-drop,vcl,Delphi,Drag And Drop,Vcl,在OnMouseDown事件中,我调用BeginDrag(False,10)。 为什么立即调用OnStartDrag 我使用OnStartDrag进行一些“繁重”的初始化,我不希望它被触发,即使是简单的点击 鼠标行为正常(鼠标移动后光标会改变),但事件触发很快就会发生 请帮忙 为什么立即调用OnStartDrag 因为BeginDrag几乎不处理立即参数和阈值参数(除了检查阈值是否为负数),只将它们传递给控制单元中的DragInitControl DragInitControl procedur

在OnMouseDown事件中,我调用BeginDrag(False,10)。 为什么立即调用OnStartDrag

我使用OnStartDrag进行一些“繁重”的初始化,我不希望它被触发,即使是简单的点击

鼠标行为正常(鼠标移动后光标会改变),但事件触发很快就会发生

请帮忙

为什么立即调用OnStartDrag

因为BeginDrag几乎不处理立即参数和阈值参数(除了检查阈值是否为负数),只将它们传递给控制单元中的DragInitControl

DragInitControl procedure首先检查DragKind是否为dkDrag,如果为dkDrag;然后调用DoStartDrag方法,该方法调用OnStartDrag事件。稍后,在DragInitControl代码的末尾,调用DragInit来执行实际的拖动任务

我不知道这是出于设计,还是在VCL中实现拖动的一个缺陷。在Delphi文档中,它:

如果Immediate为false,则单击鼠标 指针不会更改为该值 DragCursor财产和 直到用户停止拖动,才开始拖动 将鼠标指针移动到 由阈值指定的像素 参数

另外,对于OnStartDrag,请参阅文档:

在用户开始拖动时发生 控件或它包含的对象 通过左键单击控件并单击 按住鼠标键


对我来说,这意味着,若Immediate为False,且鼠标未移动,则不会开始拖动;因此,不应调用OnStartDrag。

这是一个bug,至少我在使用BDS 2006时遇到过,但我不知道更新的Delphi版本。

Vcldeveloper,感谢您提供清晰详细的解释,但事实上,在我写这篇文章之前我就知道了。现在我正在寻找一个好的,干净的解决方案。我倾向于认为这是一个实现错误。有没有被修正的机会?嘿,Embarcadero?拖动过程开始时,鼠标光标将以正确的方式更改。当鼠标光标改变或者真正的拖动过程开始时,我可以截取、钩住或者可能有一些WM_uuu要捕捉吗?再次感谢。