Delphi: BeginDrag (False) и OnStartDrag - PullRequest
       18

Delphi: BeginDrag (False) и OnStartDrag

1 голос
/ 20 ноября 2010

Я вызываю BeginDrag (False, 10) в событии OnMouseDown. Почему OnStartDrag вызывается немедленно?

Я использую OnStartDrag для некоторой «тяжелой» инициализации и не хочу, чтобы она запускалась даже при простом щелчке.

Поведение мыши в порядке (курсор изменяется после перемещения мыши), но запуск события в ближайшее время!

Пожалуйста, помогите !!!

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

Почему OnStartDrag вызывается немедленно?

Поскольку BeginDrag почти ничего не делает с параметрами Immediate и Threshold (за исключением проверки, является ли Threshold отрицательным числом), и просто передает их DragInitControl в ControlsБлок.

Процедура DragInitControl сначала проверяет, является ли DragKind значением dkDrag, если это так;затем он вызывает метод DoStartDrag, который вызывает событие OnStartDrag.Позже, в конце кода DragInitControl, вызывается DragInit, который выполняет фактическую работу по перетаскиванию.

Я не знаю, является ли это намерением, или ошибка в реализации перетаскивания в VCL.В документации Delphi это говорит :

Если Immediate равен false, указатель мыши не изменяется на значение свойства DragCursor, и перетаскивание не начинается, пока пользователь не перемещает мышьуказатель на количество пикселей, указанное параметром Threshold.

Также для OnStartDrag документация говорит :

Происходит, когда пользователь начинает перетаскиватьэлемент управления или объект, который он содержит, щелкнув левой кнопкой мыши элемент управления и удерживая кнопку мыши нажатой.

Для меня это означает, что если Immediate имеет значение False и мышь не перемещена, перетаскивание не начинается;следовательно, OnStartDrag не должен вызываться.

0 голосов
/ 20 ноября 2010

Это ошибка, по крайней мере, я столкнулся с ней, используя BDS 2006, хотя не знаю о более новых версиях Delphi.

...