9.2.2 接收拖動項目
一個控件能否接收拖動項目是由該控件的OnDragOver事件決定的。在TabSet拖動中,主要是利用鼠標的位置進行判斷。
procedure TForm1.TabSet1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
DropPos: Integer;
begin
if Source = TabSet1 then
begin
DropPos := TabSet1.ItemAtPos(Point(X, Y));
Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and
(DropPos < TabSet1.Tabs.Count);
end;
else
Accept := False;
end;
9.2.3 放下拖動項目
當OnDragOver事件處理過程返回的Accept為True且項目被放下時,由OnDragDrop事件處理過程來完成拖動放下後的響應。在TabSet拖放實例中是改變標簽的位置。
procedure TForm1.TabSet1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
OldPos: Integer;
NewPos: Integer;
begin
if Source = TabSet1 then
begin
OldPos := TabSet1.TabIndex;
NewPos := TabSet1.ItemAtPos(Point(X, Y));
if (NewPos > -1) and (NewPos <> OldPos) then
TabSet1.Tabs.Move(OldPos, NewPos);
end;
end;
9.2.4 結束拖動操作
結束拖動操作的方式有兩種:或者是用戶釋放了鼠標鍵或者是程序用EndDrag方法強行中止拖動。結束拖動操作的後果有兩種:放下被接受或放下被忽略。
拖動操作結束後源控件都要收到一條消息響應拖動結束事件OnEndDrag。