procedure ObjectDragDrop(Sender,Source:TObject;X,Y:Integer);
参数Sender和Source分别代表目标对象B及被拖动的对象A,
参数X,Y代表拖动结束时的位置坐标,此坐标是以目标对象的坐标为参考的,
而实际上拖动中的对象并不是真的移动,所以以X,Y的值将对象移到新的位置。
(三)停止拖动
如果要停止拖动,可以使用对象方法EndDrag来完成;其语法如下:
procedure ObjectEndDrag(Drop:Boolean);
参数Drop若是Ture,被拖动的对象将被放置于与目前所在的位置;
否则,对象的拖动就被放弃,而回到原来的位置。
例如下面的程序段就代表对象Lable1放弃拖动,并恢复原状:
Lable1.EndDrag(False);
而停止拖动会触发事件OnEndDrag,其语法如下:
Procedure ObjectEndDrag(Sender,Target:TObject;X,Y:Integer);
不管是放弃拖动或是对象已经拖动到目标对象,均会触发这个事件。
参数Sender和Target分别指向被拖动对象(源)及目标对象,但是如果拖动没有成功,则Target值为nil。
补充:
DELPHI中拖放的操作
拖放(DragDrop)是Windows提供的一种快捷的操作方式。作为基于Windows的开发工
具,Delphi同样支持拖放操作,而且开发应用
系统的拖放功能十分方便,真正体现了
Delphi 的强大功能和方便性。
Delphi提供的所有控件(Control,即能获得输入焦点的部件)都支持拖放操作,并有
相应的拖放属性、拖放事件和拖放方法。下面我们先介绍控件的拖放支持,而后再给出开
发拖放操作的一般步骤和应用实例。
9.1控件的拖放支持
拖放操作中控件可以分为源控件和目标控件两类。绝大部分
控件既可以作为源控件
也可以作为目标控件。但也有一部分控件只能支持其中的一种。
9.1.1拖放属性
拖放属性主要有两个:
●DragMode:拖动模式
它们都是在拖放的源控件中设置。DragMode控制用户在运行时间内当在控件上按
下鼠标时控件如何反应。
如果DragMode置为dmAutomatic,那么当用户在控件上按下鼠
标时拖动自动开始;
如果DragMode置为dmManual(这是缺省值),则将通过处理鼠标事件
来判断一个拖动是否可以开始。
●DragCursor
用于选择拖动时显示的光标,缺省值是CrDrag,一般不要去修改它。
在程序
设计过程中通用的界面规范应该得到开发者的尊重。但有时候为了特定的目的,
开发者也可以把自己设计的光标赋给DragCursor。
9.1.2拖放事件
拖放事件主要有三个(?):
●OnDragOver:拖动经过时激发
●OnDragDrop:拖动放下时激发
●OnEndDrag:拖动结束时激发
●OnStartDrag:拖动开始时激发(?)
前两个事件由目标控件响应,后一个事件由源控件响应。
●OnDragOver事件最主要的功能是确定当用户就地放下拖动时控件是否可以接受。
它的参数包括:
Source:TObject;{源控件}
X,Y:Integer; {光标位置}
State:TDragState;{拖动状态}
var Accept:Boolean {能否接受}
●TDragState是一个枚举类型,表示拖放项目与目标控件的关系。
type TDragState = (dsDragEnter, dsDragLeave, dsDragMove);
不同取值的意义如下表:
表9.1 DragState的取值与意义
━━━━━━━━━━━━━━━━━━━━━━━━━━━
取值意义
───────────────────────────
dsDragEnter拖动对象进入一个允许拖动对象放的控件中。为缺省状态。
dsDragLeave拖动对象离开一个允许拖动对象放下的控件。
dsDragMove拖动对象在一个允许拖动对象放下的控件内移动。
━━━━━━━━━━━━━━━━━━━━━━━━━━━
用户可以利用提供的参数来确定放下的拖动是否可被接受,如:
●判断源控件类型:
Accept := Source is TLabel;
●判断源控件对象:
Accept := (Source = TabSet1);
●判断光标位置:
见(9.2),(9.3)中的例程。
●判断拖动状