Переместить форму без полей в Firemonkey

В формах VCL я использую WM_SYSCOMMAND, но в firemonkey он не объявлен.

Я тестирую этот код:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  isDraging := true;
  X0 := X;
  Y0 := Y;
end;

procedure TForm4.dragPanelMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Single);
begin
  if isDraging then
  begin
    Form4.Left := Trunc(Form4.Left + X - X0);
    Form4.Top := Trunc(Form4.Top + Y - Y0);
  end;
end;

procedure TForm4.dragPanelMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  isDraging := False;
end;

это работает, но только для медленных движений!!!

Как я могу перемещать форму в Firemonkey?


person sma6871    schedule 13.03.2013    source источник
comment
Вы также можете использовать WM_SYSCOMMAND. Если это не определено, определите это.   -  person David Heffernan    schedule 13.03.2013
comment
Как я могу определить WM_SYSCOMMAND?   -  person sma6871    schedule 13.03.2013
comment
WM_SYSCOMMAND = $0112 msdn.microsoft.com/en-gb/library/windows /рабочий стол/ms646360.aspx   -  person David Heffernan    schedule 13.03.2013
comment
Спасибо, не могли бы вы ответить на этот вопрос частью исходного кода? Это мой код, который не работает!! при нажатии кнопки мыши ReleaseCapture; SendMessage(Form4.Handle, $0112, $F012, 0) ;   -  person sma6871    schedule 13.03.2013
comment
Ну, я действительно не понимаю, что вы пытаетесь сделать. Я не уверен, что такое $F012. У меня нет особой мотивации пытаться расшифровать магические константы.   -  person David Heffernan    schedule 13.03.2013
comment
У меня есть панель в верхней части моей формы, и в событии мыши она пытается использовать этот код для перемещения формы. SC_DRAGMOVE = $F012;   -  person sma6871    schedule 13.03.2013
comment
@ Дэвид, я думаю, что единственная магия в так называемой константе SC_DRAGMOVE заключается в том, что MS просто забыла включить ее в заголовочный файл winuser (и из-за этого также задокументировать ее). Я не думаю, что это какое-то волшебство. sma6871, попробуйте code like this и при необходимости переместите константы в общие.   -  person TLama    schedule 13.03.2013
comment
@TLama Моя проблема в использовании $F012. Использование SC_DRAGMOVE в порядке. И ваш код для VCL. Q — это FMX.   -  person David Heffernan    schedule 13.03.2013


Ответы (2)


Если код VCL, который вы хотите воспроизвести:

SendMessage(MyForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);

тогда эквивалент для FMX будет:

SendMessage(FmxHandleToHWND(MyForm.Handle), WM_SYSCOMMAND, SC_DRAGMOVE, 0);

Причина в том, что MyForm.Handle — это дескриптор FMX. Это не то же самое, что оконная ручка. Вы конвертируете в дескриптор окна с помощью FmxHandleToHWND().

Вам может понадобиться объявить пару констант:

const
  WM_SYSCOMMAND = $0112;
  SC_DRAGMOVE = $F012;
person David Heffernan    schedule 13.03.2013
comment
Спасибо, и напоследок uses FMX.Platform.Win ;-) - person sma6871; 13.03.2013
comment
$F012 = (SC_MOVE или HTCAPTION) - person pani; 13.03.2013

Что проще, так это просто использовать метод StartWindowDrag формы. Таким образом, он будет работать как в Windows, так и в MacOS, и это только 1 строка кода. Вот так:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
    Self.StartWindowDrag;
end;
person Chris Nillissen    schedule 20.02.2014
comment
Работает как часы! - person Andrzej; 17.03.2021