TabSet 实现拖动后并保存配置
一、实现拖动
在运行时当用户把一个标签拖动到另一个标签的位置时,该标签将移动到该位置并引起
标签集的重新布置。
1.1开始拖动操作
当拖动模式(DragMode)设置为dmAutomatic时,用户在源控件上按下鼠标时拖动自动
开始;当设置为dmManual时通过处理鼠标事件来决定拖动是否开始。如果想开始拖动调
用BeginDrag方法。
在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。
首先判断按下的是否是左键,而后再判断项目是否合法。
procedure TFormMain.TabSetDJNRMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var DragItem: Integer; begin DragItem := TabSetDJNR.ItemAtPos(Point(X, Y)); if (DragItem > -1) and (DragItem < TabSetDJNR.Tabs.Count) then TabSetDJNR.BeginDrag(False); end;
1.2接收拖动项目
一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的。在TabSet拖动中,主要是利用鼠标的位置进行判断。
procedure TFormMain.TabSetDJNRDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var DropPos: Integer; begin if Source = TabSetDJNR then begin DropPos := TabSetDJNR.ItemAtPos(Point(X, Y)); Accept := (DropPos > -1) and (DropPos <> TabSetDJNR.TabIndex) and (DropPos < TabSetDJNR.Tabs.Count); end else Accept := False; end;
1.3放下拖动项目
当OnDragOver事件处理过程返回的Accept为True且项目被放下时,由OnDragDrop事
件处理过程来完成拖动放下后的响应。在TabSet拖放实例中是改变标签的位置。
procedure TFormMain.TabSetDJNRDragDrop(Sender, Source: TObject; X, Y: Integer); var OldPos: Integer; NewPos: Integer; bcanchange: Boolean; begin if Source = TabSetDJNR then begin OldPos := TabSetDJNR.TabIndex; NewPos := TabSetDJNR.ItemAtPos(Point(X, Y)); if (NewPos > -1) and (NewPos <> OldPos) then TabSetDJNR.Tabs.Move(OldPos, NewPos); TabSetDJNRChange(self, NewPos, bcanchange);//刷新拖动后的页内容 end; end;
参考文档:http://blog.csdn.net/cureshy/article/details/177420
二、实现拖动页与页内容对应
在change事件中改变页的顺序
procedure TFormMain.TabSetDJNRChange(Sender: TObject; NewTab: integer; var AllowChange: Boolean); begin if TabSetDJNR.Tabs[NewTab]='选项卡1' then begin NotebookDJNR.PageIndex := 0; end else if TabSetDJNR.Tabs[NewTab] = '选项卡2' then begin NotebookDJNR.PageIndex := 1; end else begin NotebookDJNR.PageIndex := 2; end; end;
三、保存拖动后的界面配置到磁盘中
1.1保存配置
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction); begin TabSetDJNR.Tabs.SaveToFile( 'c:\\temp\TabSet.ini'); end;
1.2加载配置
procedure TFormMain.FormCreate(Sender: TObject); var strTmp: string; nmrts: integer; begin if FileExists('c:\\temp\TabSet.ini') then begin TabSetDJNR.Tabs.LoadFromFile('c:\\temp\TabSet.ini'); end; end;