2013-03-13 3 views
0

В формах VCL я использую WM_SYSCOMMAND, но в firemonkey он не объявлен.Перемещение формы без полей в 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?

+1

Вы также можете использовать 'WM_SYSCOMMAND'. Это не определено, определите его. –

+0

Как я могу определить 'WM_SYSCOMMAND'? – sma6871

+1

'WM_SYSCOMMAND = $ 0112' http://msdn.microsoft.com/en-gb/library/windows/desktop/ms646360.aspx –

ответ

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; 
+0

Спасибо, и последнее, что «использует FMX.Platform.Win' ;-) – sma6871

+0

$ F012 = (SC_MOVE или HTCAPTION) – pani

5

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

procedure TForm4.dragPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); 
begin 
    Self.StartWindowDrag; 
end;