Delphi:BeginDrag(False) 和 OnStartDrag
我在 OnMouseDown 事件中调用 BeginDrag(False, 10) 。 为什么立即调用OnStartDrag?
我使用 OnStartDrag 进行一些“繁重”的初始化,并且我不希望它被触发,即使是简单的单击。
鼠标行为正常(鼠标移动后光标发生变化),但事件触发太快了!
请帮忙!!!
I call BeginDrag(False, 10) in OnMouseDown event.
Why OnStartDrag is called immediately?
I use OnStartDrag for some "heavy" initialization and I don't want it to be fired even on simple click.
Mouse behavior is ok (cursor is changed after mouse move), but event trigerring is to soon!
Please help!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为BeginDrag几乎对Immediate和Threshold参数不做任何事情(除了检查Threshold是否为负数),只是将它们传递给Controls单元中的DragInitControl。
DragInitControl过程首先检查DragKind是否为dkDrag,如果是;然后它调用 DoStartDrag 方法,该方法调用 OnStartDrag 事件。稍后,在 DragInitControl 代码的末尾,调用 DragInit 来执行实际的拖动工作。
我不知道这是设计使然,还是在 VCL 中实现拖动时的一个错误。在Delphi文档中说:
另外,对于 OnStartDrag,文档说:
对我来说,这意味着,如果 Immediate 为 False,并且鼠标未移动,则不会开始拖动;因此,不应调用 OnStartDrag。
Because BeginDrag almost does nothing with Immediate and Threshold parameters (Except checking if Threshold is a negative number), and just passes them to DragInitControl in Controls unit.
DragInitControl procedure first checks if DragKind is dkDrag, if it is; then it calls DoStartDrag method which invokes OnStartDrag event. Later, at the end of DragInitControl code, DragInit is called which does the actual dragging job.
I don't know if this is by design, or a bug in implementing dragging in VCL. In Delphi documentation it says:
Also for OnStartDrag the documentation says:
To me it means, if Immediate is False, and mouse is not moved, dragging is not started; therefore, OnStartDrag shouldn't be invoked.
这是一个错误,至少我在使用 BDS 2006 时遇到过它,但不知道较新的 Delphi 版本是否如此。
It is a bug, at least I've encounter it using BDS 2006, don't know about newer Delphi versions though.