Показать сообщение отдельно
  #1  
Старый 10.03.2017, 11:01
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Перемещение объекта курсором

Здравствуйте. Есть панель. На ней есть к примеру TShape.
Когда я жму на TShape я запоминаю координаты нажатия и перемещаю панель с её родителя, на другую плавающую форму FDrag. Далее при движении курсора по TShape я двигаю FDrag. И при отжатии перестаю следить за движением курсора.
Код:
procedure TShape.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FMoving := ssLeft in Shift;
  if not FMoving then Exit;  
  FdX := X;
  FdY := Y; 
  TControl(Sender).Parent.Parent := FDrag; 
  FDrag.Show;       
  FDrag.Left := Mouse.CursorPos.X - FdX;
  FDrag.Top := Mouse.CursorPos.Y - FdY;
end; 

procedure TShape.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin       
  if not FMoving then Exit;
  FDrag.Left := FDrag.Left + X - FdX;
  FDrag.Top := FDrag.Top + Y - FdY; 
end;

procedure TShape.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
msg(2340);
  if not FMoving then Exit; 
  FMoving := False; 
end;
Без изменения родителя, если панель уже находится на FDrag, перемещение работает правильно. Но если с перемещением, то TShape как-то теряет привязку к курсору и если резко дёрнуть, то курсор просто выходит за рамки TShape и естественно MouseMove уже не отрабатывает. Как сохранить эту привязку к курсору и после смены родителя панели?
Ответить с цитированием