开发拖放功能的一般步骤
拖放作为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