Delphi 所有控件(Control,可獲焦點組件)均支持拖放,有相應屬性、事件、方法。控件分源控件和目標控件,大多數雙重身份,部分僅支持一種。
dmAutomatic:按下鼠標自動開始拖動dmManual(默認):處理鼠標事件判斷是否開始crDrag,一般不修改,尊重通用界面規範。特殊目的可指定自定義光標。均在源控件設置。
| 事件 | 觸發時機 | 響應者 |
|---|---|---|
| OnDragOver | 拖動經過 | 目標控件 |
| OnDragDrop | 拖動放下 | 目標控件 |
| OnEndDrag | 拖動結束 | 源控件 |
Source: TObject; // 源控件
X, Y: Integer; // 光標位置
State: TDragState; // 拖動狀態
var Accept: Boolean; // 能否接受
TDragState 枚舉:
| 值 | 含義 |
|---|---|
| dsDragEnter | 拖動對象進入允許放下的控件(默認狀態) |
| dsDragLeave | 拖動對象離開允許放下的控件 |
| dsDragMove | 拖動對象在允許放下的控件內移動 |
Accept := Source is TLabel;Accept := (Source = TabSet1);if (Source is TLabel) and (State = dsDragMove) then
begin
Source.DragIcon := 'New.ico';
Accept := True;
end else Accept := False;
Accept=True 時目標控件可響應 OnDragDrop 處理放下後邏輯。
源控件、光標位置,用於確定處理方式。
Target: TObject(目標控件)、放下坐標。Target=nil 表示未被任何控件接受。拖動結束包含放下被接受和釋放於不可接受控件。
procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
if Target <> nil then FileList.Update;
end;
| 方法 | 功能 |
|---|---|
| BeginDrag | 手動模式下開始拖動,參數 Immediate:True 立即開始,False 移動 5 像素後開始(允許處理 OnClick 不拖動) |
| EndDrag | 中止拖動,參數 Drop:True 在當前位置放下(能否接受由目標決定),False 就地取消 |
| Dragging | 判斷控件是否正被拖動 |
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := False;
if (Source is TLabel) and (State = dsDragEnter) then
(Source as TLabel).EndDrag(False);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
CheckBox1.DragMode := dmAutomatic;
CheckBox2.DragMode := dmAutomatic;
CheckBox3.DragMode := dmAutomatic;
end;
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if CheckBox1.Dragging then Color := clAqua;
if CheckBox2.Dragging then Color := clYellow;
if CheckBox3.Dragging then Color := clLime;
end;
非專門拖放事件,但手動模式下拖動開始在其處理過程中實現。