首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 拖放編程核心:控件屬性、事件、方法詳解、DragMode 模式、DragCursor、OnDragOver/OnDragDrop/OnEndDrag 參數應用

     編輯:Delphi

9.1 控件的拖放支持

Delphi 所有控件(Control,可獲焦點組件)均支持拖放,有相應屬性、事件、方法。控件分源控件和目標控件,大多數雙重身份,部分僅支持一種。

9.1.1 拖放屬性

  • DragMode:拖動模式
    • dmAutomatic:按下鼠標自動開始拖動
    • dmManual(默認):處理鼠標事件判斷是否開始
  • DragCursor:拖動時光標,默認 crDrag,一般不修改,尊重通用界面規範。特殊目的可指定自定義光標。

均在源控件設置。

9.1.2 拖放事件

事件觸發時機響應者
OnDragOver拖動經過目標控件
OnDragDrop拖動放下目標控件
OnEndDrag拖動結束源控件

OnDragOver 參數

Source: TObject;      // 源控件
X, Y: Integer;        // 光標位置
State: TDragState;    // 拖動狀態
var Accept: Boolean;  // 能否接受

TDragState 枚舉:

值含義
dsDragEnter拖動對象進入允許放下的控件(默認狀態)
dsDragLeave拖動對象離開允許放下的控件
dsDragMove拖動對象在允許放下的控件內移動

Accept 判斷常用模式

  • 判斷源控件類型:Accept := Source is TLabel;
  • 判斷源控件對象:Accept := (Source = TabSet1);
  • 判斷光標位置:見 9.2/9.3 例程
  • 判斷拖動狀態:
    if (Source is TLabel) and (State = dsDragMove) then
    begin
      Source.DragIcon := 'New.ico';
      Accept := True;
    end else Accept := False;

Accept=True 時目標控件可響應 OnDragDrop 處理放下後邏輯。

OnDragDrop 參數

源控件、光標位置,用於確定處理方式。

OnEndDrag 參數

Target: TObject(目標控件)、放下坐標。Target=nil 表示未被任何控件接受。拖動結束包含放下被接受和釋放於不可接受控件。

文件拖放成功後更新列表示例

procedure TFMForm.FileListEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  if Target <> nil then FileList.Update;
end;

9.1.3 拖放方法

方法功能
BeginDrag手動模式下開始拖動,參數 Immediate:True 立即開始,False 移動 5 像素後開始(允許處理 OnClick 不拖動)
EndDrag中止拖動,參數 Drop:True 在當前位置放下(能否接受由目標決定),False 就地取消
Dragging判斷控件是否正被拖動

EndDrag 取消拖動示例

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;

Dragging 改變窗口顏色示例

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;

OnMouseDown 在手動模式拖動開始中的作用

非專門拖放事件,但手動模式下拖動開始在其處理過程中實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved