程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第九章-Delphi拖放編程(2)

第九章-Delphi拖放編程(2)

編輯:Delphi

9.1.3 拖放方法 

拖放方法有三個:

●BeginDrag : 人工方式下開始一個拖動

●EndDrag : 結束一個拖動

●Dragging : 判斷一個控件是否正被拖動 

這三個方法都被源控件使用。

當DragMode置為dmManual時,拖動必須調用控件的BeginDrag方法才能開始。BeginDrag有一個布爾參數Immediate。如果輸入參數為True,拖動立即開始,光標改變到DragCursor的設置。如果輸入參數為False,直到用戶將光標移動了一定的距離(5個象素點)後才改變光標,開始拖動。這就允許控件接受一個OnClick事件而並不開始拖動操作。

EndDrag方法中止一個對象的被拖動狀態。它有一個布爾參數Drop。如果Drop設置為True,被拖動的對象在當前位置放下(能否被接受由目標控件決定);如果Drop設置為False,則拖動就地被取消。

下面一段程序表明當拖動進入一控制面板時拖動被取消。     

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;

Draging方法判斷一個控件是否正被拖動。在下面的例子中當用戶拖動不同的檢查框時窗口改變為不同的顏色。 

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; 

9.2 開發拖放功能的一般步驟 

拖放作為Windows提供的一種方便操作對象的功能,在Delphi中可以很容易地開發出來。根據拖放操作的過程可以把開發步驟劃分為四個階段,即:

● 開始拖動操作

● 接收拖動項目

● 放下拖動項目

● 終止拖動操作 

在介紹過程中我們將結合一個TabSet(標簽集)的拖放操作實例。界面設計如圖。在運行時當用戶把一個標簽拖動到另一個標簽的位置時,該標簽將移動到該位置並引起標簽集的重新布置。

9.2.1 開始拖動操作 

當拖動模式(DragMode)設置為dmAutomatic時,用戶在源控件上按下鼠標時拖動自動開始;當設置為dmManual時通過處理鼠標事件來決定拖動是否開始。如果想開始拖動調用BeginDrag方法。

在TabSet拖放中,我們用下面的MouseDown事件處理過程來開始一個標簽的拖動。首先判斷按下的是否是左鍵,而後再判斷項目是否合法。 

procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

DragItem: Integer;

begin

if Button = mbLeft then

begin

DragItem := TabSet1.ItemAtPos(Point(X, Y));

if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then

TabSet1.BeginDrag(False);

end;

end; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved