在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中移动表单?
答案 0 :(得分:8)
使用Form的StartWindowDrag方法更容易。这样它既可以在Windows和MacOS中使用,也可以在一行代码中使用。像这样:
procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
Self.StartWindowDrag;
end;
答案 1 :(得分:1)
如果要复制的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;