2013-10-05 9 views
1

我試圖在屏幕上拖出一個表格,即我可以抓住它並在屏幕上移動它。它的透明並且沒有邊界,但是圖像可以作爲其他控制的背景。我想使用圖像的事件來控制窗體的拖動。我怎樣才能做到這一點?如何通過另一個對象在屏幕上拖動無邊界FMX表單?

我找到了具有此TDragObject參數的DragEnter,DragLeave,DragStart方法,我不知道。

有人可以幫忙嗎?

+0

這也正是執行包含爲單位的不WinAPI.Windows,WinAPI.Messages也不在Windows中。 –

+0

Perform是TControl的一種方法。與SendMessage類似,但它直接將消息傳遞給WindowProc。 –

+2

好吧,但我似乎無法在FMX中找到它的單元...我有這些用途; WinAPI.Windows,WinAPI.Messages,Windows,System.SysUtils,System.Types,System.Rtti,System.Classes,System.UITypes,System.Variants,System.Math,FMX.Types,FMX.Controls,FMX.Forms, FMX.Dialogs,FMX.Layouts,FMX.Objects,FMX.ListBox,FMX.Edit,FMX.Effects,FMX.TreeView,FMX.Grid,FMX.TabControl,FMX.Memo,Data.Bind.EngExt,Fmx.Bind。 DBEngExt,Data.Bind.Components,FMX.Ani; –

回答

1

基本上你必須手動完成。

下面是從一種形式的一些德爾福/ Windows代碼上有一個透明的圖片(TransImage),無國界等 的事件是在形式的圖像,最&左指TMainScanForm.Top/Left。

這會拖累你的周圍形成使用圖像事件檢測點擊和移動

... 

// Mouse Drag Control 
MouseDown: Boolean; 
TopLeft, 
MouseStart: TPoint; 

... 

procedure TMainScanForm.TransImageMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    MouseDown := (Button = mbLeft); 
    if MouseDown then 
    begin 
    MouseStart.X := X; 
    MouseStart.Y := Y; 
    TopLeft := ClientToScreen(MouseStart); 
    TopLeft.X := TopLeft.X - X; 
    TopLeft.Y := TopLeft.Y - Y; 
    end; 
end; 

procedure TMainScanForm.TransImageMouseMove(Sender: TObject; 
            Shift: TShiftState; 
            X, Y: Integer); 
var 
    NewPoint: TPoint; 
begin 
    if MouseDown then 
    begin 
    NewPoint.X := X; 
    NewPoint.Y := Y; 
    NewPoint := ClientToScreen(NewPoint); // On Screen 
    NewPoint.Y := NewPoint.Y - MouseStart.Y; // New Onscreen 
    NewPoint.X := NewPoint.X - MouseStart.X; 
    Top := NewPoint.Y; 
    Left := NewPoint.X; 
    Refresh; 
    end; 
end; 

procedure TMainScanForm.TransImageMouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    MouseDown := False; 
end; 
+0

非常聰明,我會在幾天內嘗試一下。 –

+0

爲什麼在您更改表單的位置後有'刷新'調用? FMX表格的某些特性是否需要在其位置發生變化時被迫重新繪製? – TLama

+0

此代碼是爲VCL編寫的。對於Firemonkey來說這不是一個好的解決方案。它在快速鼠標移動時失敗,如果鼠標光標靠近窗體邊緣則失敗。 Firemonkey中的鼠標事件(向下/移動/向上)與VCL幾乎不同。 –

相關問題