Delphi:BeginDrag(False) 和 OnStartDrag

发布于 2024-10-03 16:30:48 字数 181 浏览 3 评论 0原文

我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心碎无痕… 2024-10-10 16:30:48

为什么OnStartDrag会立即被调用?

因为BeginDrag几乎对Immediate和Threshold参数不做任何事情(除了检查Threshold是否为负数),只是将它们传递给Controls单元中的DragInitControl。

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

我不知道这是设计使然,还是在 VCL 中实现拖动时的一个错误。在Delphi文档中

如果 Immediate 为 false,则鼠标
指针没有改变值
DragCursor 属性和
直到用户拖动才开始
鼠标指针移动的次数
由阈值指定的像素
参数。

另外,对于 OnStartDrag,文档

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

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

Why OnStartDrag is called immediately?

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:

If Immediate is false, the mouse
pointer does not change to the value
of the DragCursor property and
dragging does not begin until the user
moves the mouse pointer the number of
pixels specified by the Threshold
parameter.

Also for OnStartDrag the documentation says:

Occurs when the user begins to drag
the control or an object it contains
by left-clicking the control and
holding the mouse button down.

To me it means, if Immediate is False, and mouse is not moved, dragging is not started; therefore, OnStartDrag shouldn't be invoked.

青朷 2024-10-10 16:30:48

这是一个错误,至少我在使用 BDS 2006 时遇到过它,但不知道较新的 Delphi 版本是否如此。

It is a bug, at least I've encounter it using BDS 2006, don't know about newer Delphi versions though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文