Вступление
Технология Drag&Drop давно стала стандартом пользовательского интерфейса. Рассмотрим несколько примеров её использования, основанных на использовании метода Perform. Обратите внимание, что перемещение контролов всегда происходит относительно родительских контролов.
Задача 1
Перетаскивание формы без заголовка. Актуально для форм, построенных на регионах.
Решение
procedure TForm1.FormMouseDown(Sender: TObject; button: tmousebutton;
shift: tshiftstate; x, y: integer);
const
sc_dragmove = $F012;
begin
releasecapture;
twincontrol(application.mainform).perform(wm_syscommand, sc_dragmove, 0);
end;
Code language: Delphi (delphi)
Комментарий
Назначив обработчик формы с приведённым кодом мы получаем возможность перетаскивать форму, кликая по самой форме приложения. Если на форме находятся другие компоненты (например TLabel, TImage), добавьте им тот же самый обработчик события (ОnMouseDown), чтобы перетягивать форму, кликая по этим компонентам.
Задача 2
Перетягивание контролов на форме
Решение
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012; { a magic number }
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
Code language: PHP (php)
Комментарий
В этом примере перетягивается панелька с картинкой. Обработчик назначен как самой панели, так и её дочернему контролу.
Верификация
Delphi XE5, Win7