Как сделать так, чтобы TScollBox автоматически прокручивался, когда DragMode имеет dmAutomatic? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть ScrollBox, в котором у меня есть GridPanel, в которой у меня есть кнопки.Я установил DragMode на dmAutomatic для всех кнопок, чтобы можно было перемещать кнопки (перетаскивать).

Но у меня есть проблема: поскольку GridPanel больше, чем ScrollBox, ScrollBox имеет видимую вертикальную полосу прокрутки.Я хочу, чтобы ScrollBar автоматически прокручивал вниз, чтобы я мог опустить дно из видимых (верхних) строк в недоступные строки в нижней части (это типичное поведение для всех программ Windows, верно?)

Iесть простой код, который делает это: в MouseMove я определяю, когда мышь приближается к нижней части ScrollBox, и настраиваю ScrollBox.VertScrollBa.Position для прокрутки вниз.Это работает ТОЛЬКО если я НЕ в режиме «перетаскивания» (если я не перетаскиваю кнопку).

Если я запускаю операцию перетаскивания НИКАКИЕ события мыши не запускаются .

Что я могу сделать, чтобы получить событие MouseMove, даже если я нахожусь в режиме «перетаскивания»?
Решением было бы не использовать dmAutomatic и реализовать собственную альтернативу перетаскивания (основанную на mousedown,mousemove, mouseup).Это более быстрое решение?

1 Ответ

0 голосов
/ 22 ноября 2018

Во время операций перетаскивания VCL создаст TDragObject для управления указанной операцией перетаскивания.Этот TDragObject - или производный класс - начнет получать и обрабатывать события мыши, пока продолжается перетаскивание.В свою очередь, он будет генерировать определенные события перетаскивания, такие как OnDragOver и OnDragDrop, которые могут обрабатываться - потенциальной целью - элементами управления в текущей позиции мыши.

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

...