Как перемещать компонент мышкой во время работы программы?

Перехватить событие OnMouseDown, запомнить x и y координты курсора мыши. Отслеживать движение мыши по событию OnMouseMove и перемещать компонент вслед за курсором мыши до тех пор пока не произойдет событие OnMouseUp. В примере показано перемещение компонента TButton. Перемещение начинается, когда пользователь "берет" TButton мышью, удерживая нажатой клавишу "Сontrol".
type
        TForm1 = class(TForm)
                Button1: TButton;
                procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
                                Shift: TShiftState; X, Y: Integer);
                procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
                                Y: Integer);
                procedure Button1MouseUp(Sender: TObject; Button: 
                                TMouseButton; Shift: TShiftState; X, Y: Integer);
        private
                {Private declarations}
        public
                {Public declarations}
                MouseDownSpot : TPoint;
                Capturing : bool;
end;

var
        Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
                                        Shift: TShiftState; X, Y: Integer);
begin
        if ssCtrl in Shift then
        begin 
                SetCapture(Button1.Handle);
                Capturing := true;
                MouseDownSpot.X := x;
                MouseDownSpot.Y := Y;
        end;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
begin
        if Capturing then
        begin
                Button1.Left := Button1.Left - (MouseDownSpot.x - x);
                Button1.Top := Button1.Top - (MouseDownSpot.y - y);
        end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button:
                        TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
        if Capturing then
        begin
                ReleaseCapture;
                Capturing := false;
                Button1.Left := Button1.Left - (MouseDownSpot.x - x);
                Button1.Top := Button1.Top - (MouseDownSpot.y - y);
        end;
end;