鼠标拖放

开发拖放功能的一般步骤 

  拖放作为Windows提供的一种方便操作对象的功能,在Delphi中可以很容易地开发出来。根据拖放操作的过程可以把开发步骤划分为四个阶段,即:

  ● 开始拖动操作

  ● 接收拖动项目

  ● 放下拖动项目

  ● 终止拖动操作 

  在介绍过程中我们将结合一个TabSet(标签集)的拖放操作实例。界面设计如图。在运行时当用户把一个标签拖动到另一个标签的位置时,该标签将移动到该位置并引起标签集的重新布置。

9.2.1 开始拖动操作 

  当拖动模式(DragMode)设置为dmAutomatic时,用户在源控件上按下鼠标时拖动自动开始;当设置为dmManual时通过处理鼠标事件来决定拖动是否开始。如果想开始拖动调用BeginDrag方法。

  在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。首先判断按下的是否是左键,而后再判断项目是否合法。 

 1 procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;
 2 
 3 Shift: TShiftState; X, Y: Integer);
 4 
 5 var
 6 DragItem: Integer;
 7 
 8 begin
 9 
10 if Button = mbLeft then
11 
12 begin
13 
14 DragItem := TabSet1.ItemAtPos(Point(X, Y));
15 
16 if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then
17 
18 TabSet1.BeginDrag(False);
19 
20 end;
21 
22 end;

9.2.2 接收拖动项目 

  一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的。在TabSet拖动中,主要是利用鼠标的位置进行判断。  

 1 procedure TForm1.TabSet1DragOver(Sender, Source: TObject; X, Y: Integer;
 2 
 3 State: TDragState; var Accept: Boolean);
 4 
 5 var
 6 
 7 DropPos: Integer;
 8 
 9 begin
10 
11 if Source = TabSet1 then
12 
13 begin
14 
15 DropPos := TabSet1.ItemAtPos(Point(X, Y));
16 
17 Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and
18 
19 (DropPos < TabSet1.Tabs.Count);
20 
21 end;
22 
23 else
24 
25 Accept := False;
26 
27 end;

9.2.3 放下拖动项目 

  当OnDragOver事件处理过程返回的Accept为True且项目被放下时,由OnDragDrop事件处理过程来完成拖动放下后的响应。在TabSet拖放实例中是改变标签的位置。 

 1 procedure TForm1.TabSet1DragDrop(Sender, Source: TObject; X, Y: Integer);
 2 
 3 var
 4 
 5 OldPos: Integer;
 6 
 7 NewPos: Integer;
 8 
 9 begin
10 
11 if Source = TabSet1 then
12 
13 begin
14 
15 OldPos := TabSet1.TabIndex;
16 
17 NewPos := TabSet1.ItemAtPos(Point(X, Y));
18 
19 if (NewPos > -1) and (NewPos <> OldPos) then
20 
21 TabSet1.Tabs.Move(OldPos, NewPos);
22 
23 end;
24 
25 end;

9.2.4 结束拖动操作 

  结束拖动操作的方式有两种:或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动。结束拖动操作的后果有两种:放下被接受或放下被忽略。

  拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag。

原文链接:http://www.ntgs.com.cn/cjp/TUTORIAL/delphi/delphi9.1.htm

原文地址:https://www.cnblogs.com/zhrong/p/5680560.html