Delphi 停靠技术的应用3(两个窗体停靠成PageControl样式, 分页停靠)
Delphi 停靠技术的应用3(两个窗体停靠成PageControl样式, 分页停靠)
因为TPageControl组件重载了TWinControl组件的DoAddDockClient和DoRemoveDockClient方法,能过自动响应停靠动作添加新的也没,而当浮动被停靠的窗口后将自动的将先前创建的TTabSheet也没删除,我们不需要写代码,只要设定基本的属性就可以实现分页停靠的功能。
一、两个窗体停靠成PageControl样式的实例
1.基本步骤:
1>、先创建一个新窗体(DockableForm):
设置属性Name:DockableForm;DockSite:True ;DragKind:dkDock;DragMode:dmAutomatic(自动停靠,表示当鼠标在工具条上点击并移动后,会自动发起拖放动作)。
DockSite必须设置为True,不然不会触发DOCKCLIENT消息处理函数,也就不能停靠了。
DragMode必须设置为dmAutomatic:不然停靠如宿主窗体之后,就不能再拖出来。
2>、再创建一个宿主窗体(TabHost):
设置属性Name:TabHost;DragKind:dkDock;在它上面放一个PageControl,设置属性Name: PageControl1;Align:alClient;DockSite:True;用于装载两个DockableForm.
说明:把宿主窗体的DragKind设置为dkDock是为了让宿主窗体也能停靠在其他可以停靠的锚点上。
3>、在DockableForm中捕获DOCKCLIENT消息,在里面完成两个窗体的相互停靠
在private中声明消息处理函数及它的实现代码:
procedure CMDockClient(var Message: TCMDockClient); message CM_DOCKCLIENT;
end;
procedure TDockableForm.CMDockClient(var Message: TCMDockClient);
var
Host: TForm;
begin
if Message.DockSource.Control is TDockableForm then
begin
Host := TTabHost.Create(Application);
Host.BoundsRect := Self.BoundsRect;
Self.ManualDock(TTabHost(Host).PageControl1, nil, alClient);
Message.DockSource.Control.ManualDock(TTabHost(Host).PageControl1, nil, alClient);
Host.Visible := True;
End;
End;
让TabHost具有停靠和被停靠的功能。还需要说明一下,TPageControl封装了一些对停靠的支持,它捕获了CM_DOCKCLIENT,CM_DOCKNOTIFICATION,CM_UNDOCKCLIENT,WM_LBUTTONDBLCLK消息处理停靠动作。具体可以查看TPageControl的原代码。
4>、就在DockableForm的OnDockOver事件里加入代码,使程序产生停靠的预览效果。
procedure TDockableForm.FormDockOver(Sender: TObject;
Source: TDragDockObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
var
ARect: TRect;
begin
Accept := Source.Control is TDockableForm;
if Accept then
begin
ARect.TopLeft := ClientToScreen(ClientRect.TopLeft);
ARect.BottomRight := ClientToScreen(ClientRect.BottomRight);
Source.DockRect := ARect;
end;
5>、在DockableForm中添加一个按钮创建新的DockableForm。
Var i: integer;
procedure TDockableForm.btn1Click(Sender: TObject);
var
AForm: TDockableForm;
begin
AForm := TDockableForm.Create(Application);
AForm.Caption := 'AForm' + IntToStr(i);
Inc(i);
AForm.Show;
end;
6>、运行程序
点击按钮生成新的DockableForm时,把其中一个拖动到另一个上,就可以实现两个窗体一起停靠在TabHost中的PageControl上显示。就可以看到每停靠一个新窗体,PageControl就会新建一个页面,每浮动一个窗体,就会删除先前的页面。但是浮动完所有的窗体时,宿主窗体并不自动关闭。所以,可以在宿主窗体中添加代码控制。
二、总结:
工具条的停靠也一样,在主窗体上放一个ControlBar或CoolBar,把他们的DockSite设成True;再在上面放ToolBar, ToolBar的DragKind属性设成dkDock,DragMode属性设为dmAutomatic。在这里,TControl有一个属性叫FloatingDockSiteClass,它的类型是TWinControl的引用(class of TWinControl),只要在主窗口创建时,把ToolBar的FloatingDockSiteClass属性设成某一个窗体A,比如在设计时A这个窗体叫ToolBarDockForm,但在程序里面不用显式的创建A,Delphi会自动创建,当ToolBar被拖动出来时,Delphi自动把它装载到ToolBarDockForm里,当然ToolBarDockForm也要象上面提到的DockableForm一样设置一定的属性和添加一些代码。
1、停靠时Delphi会产生的方法和事件
1>.TControl.ManualFloat // 和ManualDock相对应,使浮动。
2>.TControl.ReplaceDockedControl // 替换停靠控件
3>.TWinControl .DoAddDockClient
4>.TWinControl .DockDrop
5>.TWinControl .DockOver
6>.TWinControl .DoDockOver
7>.TWinControl .DoUnDock
Delphi 停靠技术的应用3(两个窗体停靠成PageControl样式, 分页停靠)的更多相关文章
- Delphi 停靠技术的应用
一.基础知识介绍 1.VCL组件的基础知识 在TWinControl类中有一个DockSite属性(boolean),它的作用是是否允许别的控件停靠在它的上面:在TControl类中有一个DragKi ...
- Delphi中停靠技术的实现
随着软件技术的不断进步,软件界面也越来越美观,操作也越来越方便.综观市面上比较专业的各种软件,我们会发现大部分都提供窗体停靠的功能,特别象工具软件,基本上都或多或少有停靠功能.自然,Delphi也支持 ...
- delphi 数据库技术沉浮录--谨给成为历史的BDE
2014年9月,delphi xe7 出来了,这次在数据库技术方面,彻底抛掉了从1995 年 delphi 1.0 就自带的(Borland Database Engine)数据库访问技术.从而宣告了 ...
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- Delphi中的操作二进制文件的两个重要函数
Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的 ...
- Swift基础之两种选择星星的评价样式并获取星星的索引值
想练练手,所以封装了一个两种选择星星的评价样式的Demo,并且可以获取到点击的星星的索引值,方便记录值,上传数据时使用 首先创建View类,设计初始化方法,并且用到了枚举类型和代理方法 方式一:默认的 ...
- winform两个窗体之间传值(C#委托事件实现)
委托 定义一个委托,声明一个委托变量,然后让变量去做方法应该做的事. 委托是一个类型 事件是委托变量实现的 经典例子:两个winform窗体传值 定义两个窗体:form1和form2 form1上有一 ...
- Clojure:将两个list合并成一个map
假设我们有两个list,分别是: (def a [“one” “two” “three”]) (def b [1 2 3]) 我们要把它们合为一个键值对应的map,做法很简单: 1. 先将a和b合为一 ...
- Visual Studio 中两个窗体(WinForm)之间相互传值的方法
编写WinowsForm应用程序时,实现两个窗体之间相互传递值的方法其实很简单.以下用一个例子说明:在名为FormMain主窗体运行过程中利用名为FormInfo窗体,获取用户输入信息,并将这些信息返 ...
随机推荐
- poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP
poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...
- Linux Home目录硬盘空间缩减
Linux Home目录硬盘空间缩减 操作 基于centos6.5 x86_64, runlevel 3,命令行模式,测试成功. 1.首先查看磁盘使用情况 [root@localhost ~]# ...
- 在doc下面执行zpl语言 Copy 文件名 lpt1
在doc下面执行zpl语言 Copy 文件名 lpt1 测试斑马条码打印机并口是否能正常通讯: 1.Zebra打印机安装好标签和碳带,且打印机进入Ready状态.2.电脑端用Notepad编写输入如下 ...
- WPF Demo10 嵌套Winform、RadGridView、
<Window x:Class="控件Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006 ...
- MFC的组合框(ComboBox)控件切换下拉样式
由于课题的需求需要做MFC串口程序,看了百度下载的串口助手的界面风格,发现这个设计很好 波特率的组合框只给出了5个可选数值,然后第6个选项是Custom,即手动输入. 实际上DCB结构的BaudRat ...
- java操作Excel之POI(4)利用POI实现数据的批量导出
后台导出方法: /** * 后台导出方法 * 利用POI实现数据的批量导出 */ public String export() throws Exception{ Connection con = n ...
- Java-Web中访问某个指定工程中的文件,报错后发现访问的文件是另一个工程里面的文件
问题: 浏览器向我的bingou项目中的UserDaoImpl.java发送请求, myeclipse报错:空指针异常 点击报错行之后,错误给定位到了另一个项目中的的一个文件 解决: 原因是文件名错误 ...
- bravado哺乳内衣适合试穿体验,分享给需要买哺乳内衣的妈妈们。
看来看去还是觉得在美德乐天猫旗舰店(www.bravadobravado.com)购买最保险. 这款内衣穿起来非常舒服,感觉一点都不勒,而且面料也很透气,我生宝宝之前怀孕的时候穿80C,这个本来一开始 ...
- python爬虫小试
- 大数据量表中,增加一个NOT NULL的新列
这次,发布清洗列表功能,需要对数据库进行升级.MailingList表加个IfCleaning字段,所有的t_User*表加个IfCleaned字段. 脚本如下 对所有的t_User表执行 a ...