1

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でフォームを移動するにはどうすればよいですか?

4

2 に答える 2

11

フォームのStartWindowDragメソッドを使用する方が簡単です。このようにして、WindowsとMacOSの両方で機能し、コードは1行だけです。そのようです:

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
    Self.StartWindowDrag;
end;
于 2014-02-20T06:20:53.090 に答える
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;
于 2013-03-13T13:14:50.380 に答える