Yo para hacer esto, suelo emplear un código parecido, aunque uso solo un evento. Por ejemplo, aquí tengo una imagen que ocupa todo el formulario (Streach:= TRUE; Align:= alClient; ) y otra mas pequeña que es la que muevo. En el evento OnMouseMove de esta última coloco los siguiente:
Código Delphi
[-]
procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
P: TPoint;
begin
GetCursorPos(P);
if ssLeft in Shift then
begin
Image2.Top:= Image2.Top + P.Y - AnteriorP.Y;
Image2.Left:= Image2.Left + P.X - AnteriorP.X;
end;
AnteriorP:= P;
end;
Siendo AnteriroP una variable declarada de la siguiente manera:
Código Delphi
[-]
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
private
AnteriorP: TPoint; public
end;
Este ejemplo, una vez coloca la propiedad DoubleBuffered a TRUE no muestra ningún tipo de parpadeo, y la imagen 2 se puede mover perfectamente.