Vi el Truco enviado por FER, este es parecido, pero utilizando la API.
Se puede utilizar para cualquier objeto que tenga los eventos Drag y sobre un Form, Panel, ScrollBox, etc.. Además sólo se utiliza el evento OnMouseDown del Objeto.
En este ejemplo utilizaremos un TImage sobre un TScrollBox:
Antes en las propiedades del TImage debemos colocar:
Código:
DragMode en dmManual
Y si quieres:
Código:
Cursor en crHandPoint
En el evento MouseDown:
Código Delphi
[-]
procedure TForm.Image1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
ImagenPos, MousePos: TPoint;
begin
ImagenPos.X := Image1.Width;
ImagenPos.Y := Image1.Height;
While DragDetect(ScrollBox1.Handle, ImagenPos) do
begin
GetCursorPos(MousePos);
Windows.ScreenToClient(ScrollBox1.Handle, MousePos);
Image1.Left:=MousePos.X-15;
Image1.Top :=MousePos.Y-15;
Application.ProcessMessages;
End;
end;
Nota: Al cambiar la posicion de la imagen, te daras cuenta que le disminuyo 15 pixels a cada posicion, es porque por lo general agarramos el objeto del punto medio del mismo y como el movimiento se basa en la posicion del mouse, la imagen en un primer momento se movería sobre la punta superior izquierda del puntero de mouse y no de donde lo agarraste.
Sugiero que se debería disminuir la mitad de las dimensiones del objeto a cada posicion.