欢迎来到天天文库
浏览记录
ID:25401329
大小:239.00 KB
页数:26页
时间:2018-11-20
《delphi高级停靠(dock)技术的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、高级停靠(Dock)技术的实现介绍所谓停靠就是可以用鼠标拖动窗体或者控件,并将其从一个父窗体移出或者移动到另一个父窗体上,可以按水平,垂直方向整齐排列,并且可以停靠在分页控制组件上。下面的示意图是一个DelphiIDE的窗口停靠示意图:考察一些常用的软件如Office等大型软件,会发现大多提供窗体停靠的功能。微软的MFC很早就引入了工具条的拖放功能,可以将工具条上窗口上边拖放到窗口下边。而Borland则最早在Delphi4中开始引入停靠功能支持,它实际上就是基于前面我们讲到的VCL拖放技术基础之上的,后面我们会看到两者有多么的类似。Borlan
2、d提供了停靠功能的一个演示程序,可以在..DemosDocking目录下找到它,不过这个例子的问题就是太过复杂,使用了很多的高级技巧,不易理解。所以我将抛开复杂的示例,一步一步的揭开停靠的秘密。一个简单的停靠实现工具条的停靠功能是最常见的功能需求,新建一个程序,在窗体上放置一个工具条,然后任意添加几个按钮,为了让工具条能够从窗体上移出,最简单的办法是设定工具条的DragMode属性为dmAutomatic,将DragKind属性设定为dkDock。就像在拖放类一章我们说的,DragMode设定为dmAutomatic表示当鼠标在工具条上点击并
3、移动后,会自动发起拖放动作。而DragKind为dkDock表示接下来的操作是一个停靠操作而不是普通的拖放操作。运行这个简单的程序,然后拖放工具条,我们发现确实可以将工具条拖离主窗体使其变成一个浮动的工具条。注意在工具条从窗体拖离时,VCL会在屏幕上画一个矩形表示工具条,我们称其为停靠图像。见下图: 可以看到,VCL强大的停靠支持使我们不用写一行代码就可以实现简单的停靠功能了,但是上面的程序存在几个问题:1、 由于使用了dmAutomatic属性,哪怕是单击一下工具条不做任何拖动,都会使它变成浮动的工具条。2、 拖离窗体后变成浮动的工具条无法
4、停靠回原来的位置。3、 浮动的工具条窗口可以被关闭,而关闭后再也没办法调出工具条了。 对于第一个问题,为了实现工具条在鼠标点击后,必须拖放几个像素后才能被拖离界面,可以像前面拖放类章节中所讲的那样,设定工具条的DragMode为dmManual的手工模式,然后在工具条的OnMouseDown事件中使用拖放函数BeginDrag来发起拖离的动作:procedureTForm1.ToolBar1MouseDown(Sender:TObject;Button:TMouseButton; Shift:TShiftState;X,Y:Integer);b
5、egin Toolbar1.BeginDrag(False);end; 而为了让浮动工具条能够被停靠回主界面,我们需要设定窗体的DockSite属性为True,表示窗体是一个停靠的锚点,允许别的控件停靠在它上面。 而当关闭浮动工具条窗口时,VCL其实并没有销毁工具条,它只是将工具条的Visible属性设为False,使其不可见,为了重新显示工具条,我们可以通过一个菜单命令,将其属性设为True。下面是添加的察看工具条的Action的代码,其中Update事件判断工具条是否可见,如果不可见,则允许执行Action的OnExecute事件:proce
6、dureTForm1.ActionViewToolBarUpdate(Sender:TObject);begin (SenderasTAction).Enabled:=notToolbar1.Visible;end; procedureTForm1.ActionViewToolBarExecute(Sender:TObject);begin Toolbar1.Visible:=True;end; 再次运行修改后的停靠程序,多拖放停靠几次后,我们又会发现一个新的问题,那就是虽然浮动工具条可以被停靠回主界面,但是位置不再是同界面顶部对齐,而是可以停靠
7、在任意位置上,这显然不是我们想要的效果,什么原因造成的呢?怎么解决呢?原来,VCL在拖离任何控件后,都会将控件的Align属性修改为alNone,要想解决这个问题,就需要在工具条停靠在窗体上之后将工具条的Align属性重新设定为alTop。幸好同拖放操作一样,在停靠组件时,VCL同样会产生一系列的事件,其中OnEndDock事件会在停靠完成后发生,正好满足我们的需要,实现的工具条的OnEndDock事件如下:procedureTForm1.ToolBar1EndDock(Sender,Target:TObject;X,Y:Integer);beg
8、in Toolbar1.Align:=alTop;end; 复杂界面的停靠上面的停靠功能可以满足简单界面的需求了,那么考虑一个复杂的界面
此文档下载收益归作者所有