Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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 уже не отрабатывает. Как сохранить эту привязку к курсору и после смены родителя панели?
Ответить с цитированием
  #2  
Старый 10.03.2017, 11:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

c:\>______
Цитата:
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;
SetCapture(TControl(Sender).Parent.Handle);
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;
ReleaseCapture;
FMoving := False;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Aptyp (10.03.2017)
  #3  
Старый 10.03.2017, 12:06
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Супер, спасибо, а то я уже голову поломал.

Только наверное правильнее будет написать:

Код:
SetCaptureControl(TControl(Sender));

Дабы следить непосредственно за объектом, а не за панелью, хотя в моём случае без разницы.
Ответить с цитированием
  #4  
Старый 10.03.2017, 12:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

SetCaptureControl делает тоже самое, что и API SetCapture в примере, только большим количеством строк кода, вместо одной. В исходнике можно посмотреть. Потому что TShape не является окном!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 10.03.2017, 12:35
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
SetCaptureControl делает тоже самое, что и API SetCapture в примере, только большим количеством строк кода, вместо одной. В исходнике можно посмотреть. Потому что TShape не является окном!
В том то и дело, что у меня там может быть и TShape и TImage и всё что угодно.
Ответить с цитированием
  #6  
Старый 10.03.2017, 13:42
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

SetCaptureControl это VCL обертка над SetCapture. Поэтому работает и то и другое.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram