I have a ScrollBox in which I have a GridPanel in which I have Buttons. I set DragMode to dmAutomatic for all buttons so I can move the buttons around (drag and drop).
But I have a problem: because the GridPanel is larger than the ScrollBox, the ScrollBox has the vertical scrollbar visible. I want to make the ScrollBar to automatically scroll down so I can drop a bottom from the visible (top) rows into the inaccessible rows at the bottom (this is typical behavior for all Windows programs, right?)
I have simple code that is doing this: In MouseMove I detect when the mouse is getting close to the bottom of the ScrollBox and I adjust ScrollBox.VertScrollBa.Position to scroll down. This works ONLY if I am NOT in "drag and drop" mode (if I am not dragging a button).
If I start a drag and drop operation NO mouse events are fired.
What can I do to receive MouseMove event even if I am in "drag and drop" mode?
A solution would be not to use dmAutomatic and implement my own drag and drop alternative (based on mousedown, mousemove, mouseup). Is these a quicker fix?
During drag-and-drop operations the VCL will create a TDragObject
to manage said drag-and-drop operation. This TDragObject
- or a derived class - will start receiving and handling mouse events as long as dragging lasts. In turn, it will generate drag-and-drop specific events like OnDragOver
and OnDragDrop
which can be handled by - potential target - controls under current mouse position.
This will allow you to handle OnMouseMove
whenever no drag-and-drop is happening. In addition handle OnDragOver
in a similar way to catch mouse movements when currently dragging.