Обязательно конвертируйте клиентские координаты Mouse X, Y, которые вы получаете из MouseMove в вашем Control, в клиент Родителя, используя ClientToScreen
и ScreenToClient
.
Следующая процедура перемещает центр элемента управления в точку (X, Y) в его клиентских координатах:
procedure MoveControl(AControl: TControl; const X, Y: Integer);
var
lPoint: TPoint;
begin
lPoint := AControl.Parent.ScreenToClient(AControl.ClientToScreen(Point(X, Y)));
AControl.Left := lPoint.X - AControl.Width div 2;
AControl.Top := lPoint.Y - AControl.Height div 2;
end;
Теперь, чтобы переместить ваш TShape при нажатии, вы должны предоставить следующий обработчик события MouseMove:
procedure TForm1.ShapeToMoveMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then // only move it when Left-click is down
MoveControl(Sender as TControl, X, Y);
end;
И чтобы проверить это, нажмите кнопку в форме с этим кодом:
procedure TForm1.ButtonTestClick(Sender: TObject);
begin
with TShape.Create(nil) do
begin
Name := Format('ShapeToMove%d',[Self.ControlCount + 1]);
Parent := Self; // Parent will free it
Shape := stCircle;
Width := 65;
Height := 65;
OnMouseMove := ShapeToMoveMouseMove;
end;
end;
Это минималистский пример, но он должен помочь вам начать.
Для развлечения просто подключите другие элементы управления с помощью этого обработчика событий MouseMove ...: -)