Почему OnStartDrag вызывается немедленно?
Поскольку BeginDrag почти ничего не делает с параметрами Immediate и Threshold (за исключением проверки, является ли Threshold отрицательным числом), и просто передает их DragInitControl в ControlsБлок.
Процедура DragInitControl сначала проверяет, является ли DragKind значением dkDrag, если это так;затем он вызывает метод DoStartDrag, который вызывает событие OnStartDrag.Позже, в конце кода DragInitControl, вызывается DragInit, который выполняет фактическую работу по перетаскиванию.
Я не знаю, является ли это намерением, или ошибка в реализации перетаскивания в VCL.В документации Delphi это говорит :
Если Immediate равен false, указатель мыши не изменяется на значение свойства DragCursor, и перетаскивание не начинается, пока пользователь не перемещает мышьуказатель на количество пикселей, указанное параметром Threshold.
Также для OnStartDrag документация говорит :
Происходит, когда пользователь начинает перетаскиватьэлемент управления или объект, который он содержит, щелкнув левой кнопкой мыши элемент управления и удерживая кнопку мыши нажатой.
Для меня это означает, что если Immediate имеет значение False и мышь не перемещена, перетаскивание не начинается;следовательно, OnStartDrag не должен вызываться.