第九章-Delphi拖放编程(2)2007-05-079.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);beginAccept := False;if (Source is TLabel) and (State = dsDragEnter) then(Source as TLabel).EndDrag(False);end;Draging方法判断一个控件是否正被拖动。在下面的例子中当用户拖动不同的检查框时窗口改变为不同的颜色。 procedure TForm1.FormActivate(Sender: TObject);beginCheckBox1.DragMode := dmAutomatic;CheckBox2.DragMode := dmAutomatic;CheckBox3.DragMode := dmAutomatic;end; procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;State: TDragState; var Accept: Boolean);beginif CheckBox1.Dragging thenColor := clAqua;if CheckBox2.Dragging thenColor := clYellow;if CheckBox3.Dragging thenColor := 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);varDragItem: Integer;beginif Button = mbLeft thenbeginDragItem := TabSet1.ItemAtPos(Point(X, Y));if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) thenTabSet1.BeginDrag(False);end;end;