拖放操作是 Windows 環境下極具直覺性的交互方式,作為深度整合 Windows 平台的開發工具,Delphi 提供了完善且強大的拖放程式設計支援。所有能獲得輸入焦點的控件皆內建拖放屬性、事件與方法,讓開發者能輕鬆實現豐富的拖放功能,充分展現 Delphi 的開發效能與便利性。
在拖放操作中,控件扮演兩種角色:源控件(被拖動者)與目標控件(接收者)。絕大多數控件可同時兼任兩種角色,但也存在僅支援單一角色的特例。
拖放行為主要由源控件的兩個屬性控制:
dmAutomatic:按下滑鼠即自動啟動拖動。dmManual(預設):需在滑鼠事件中手動判斷並啟動拖動(透過 BeginDrag 方法),提供更精細的控制。crDrag。一般建議遵循介面規範保持預設,但在特定業務場景下可指定自訂游標以增強用戶體驗。拖放互動由三大核心事件驅動,前兩者由目標控件響應,最後一者由源控件響應:
Source)、游標座標(X, Y)、拖動狀態(State)與接受標誌(var Accept: Boolean)。透過判斷來源類型、具體物件、游標位置或拖動狀態(dsDragEnter 進入、dsDragLeave 離開、dsDragMove 移動),動態決定 Accept 值,唯有 Accept=True 才會觸發後續的放下事件。Target)與釋放座標;若 Target=nil 表示未被任何控件接受。常用於清理拖動狀態、更新源控件顯示等收尾工作。雖非專屬拖放事件,但在 DragMode = dmManual 時,拖動的啟動邏輯通常寫在該事件處理程序中(呼叫 BeginDrag)。
procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
if Target <> nil then FileList.Update;
end;
此範例展示在 OnEndDrag 中檢查目標是否存在,若拖放成功(Target <> nil)則刷新檔案列表,確保介面與資料同步。
掌握上述屬性與事件機制,即可構建靈活多樣的拖放介面。下一節將深入探討拖放操作的完整開發步驟與進階應用實例。