实现目的:
实现MainForm中对DockForm的停靠,相当于VC中的工具栏停靠。
结果先让大家看看:
(靠!看不到!)
说明:
在开始停靠的时候我们先了解一下下停靠在Delphi7,在Delphi7中原来就有对Form等有依靠功能,分别是以下属性:
属性 | 值 | 说明 |
DrawMode | dmAutomatic | 是否是拖放 |
DrawKind | dkDock | 拖拽,停靠方法 |
DockSite | true | 是否允许被停靠 |
了解了以上属性我们再来了解一下下停靠的几个过程:
1.OnDockOver(Sender: TObject;
Source: TDragDockObject;
X, Y: Integer;
State: TDragState; var Accept: Boolean);//当你把要停放的对象划过停放区时会有的效果
你一定希望会有一个框可以让你看到停放后会有什么效果吧
2.OnDockDrop(Sender: TObject; Source: TDragDockObject;
X, Y: Integer);//当你放手让你要把停放的东西停放下来时也就是最后时出现的效果
你一定会希望他可以停放出一个你希望的效果吧
3.OnGetSiteInfo(Sender: TObject; DockClient: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);//这是在移动时触发的
4.OnStartDock(Sender: TObject;
var DragObject: TDragDockObject);//开始放工具栏时你希望出现的效果
5.OnEndDock(Sender, Target: TObject; X, Y: Integer);//放好工具栏时你希望出现的效果
6.OnUnDock(Sender: TObject; Client: TControl;
NewTarget: TWinControl; var Allow: Boolean);//当你移走你的工具栏时希望有的效果
在以上上面的几个函数最重要的是onDockOver,onDockDrop和OnUnDock这是必要的东西的几个过程
OnDockOver(Sender: TObject;
Source: TDragDockObject;//这是你要停靠的信息信息,其停靠效果全由他来定
X, Y: Integer; //这是鼠标所在的地方
State: TDragState;//这里可以判断你当前的动作是进入还是移出
var Accept: Boolean);//Accept这是为false就是不可以停靠,为true就是可以停靠。
介绍上了面大家应该还是不很理解吧!那我在进一步解说我说的程序,你可以在我上传的代码中找到你想要的程序(“停靠窗口”)。
我在这里说明我是如何处理的:
第一步:在MainForm(我的MainForm就是你们的form1)中加入一个LeftDockPanel(是你们的Panel1)再加入一个LeftSplitter(是你们的Splitter)除了MainForm外其他的Align都设置为alLeft全是靠左边的,LeftDockPanel的width设置为0不要让别人看到他,我们主要是让dockForm(这是你们的form2)放置在LeftDockPanel上,做到一个假的停靠效果。对了属性还没有设置把LeftDockPanel的dockSite设置为true让别人可以依靠。DockForm的Drawkind设置为dkDock,还有DrawMode设置为dmAutomatic。好累完事了第一步。
第二步:现在是代码啦
procedure TMainForm.LeftDockPanelDockOver(Sender: TObject;
Source: TDragDockObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
var
ARect:TRect;
begin
Accept:=true;
ARect.TopLeft:=LeftDockPanel.ClientToScreen(Point(0,0));
ARect.BottomRight:=LeftDockPanel.ClientToScreen(
Point(Self.ClientWidth div 3, LeftDockPanel.Height));
Source.DockRect:=ARect;
end;
procedure TMainForm.LeftDockPanelDockDrop(Sender: TObject;
Source: TDragDockObject; X, Y: Integer);
begin
LeftDockPanel.Width:=ClientWidth div 3;
LeftSplitter.Left:=LeftDockPanel.Width+LeftSplitter.Width;
end;
以上代码是在LeftDockPanel中的event找到的DockOver和DockDrop两个方法。加上以上代码试一试,MainForm和DockForm我就不介绍怎么动态创建了在我上传的代码里面有!
第三步:不是还有很onunDock没做么!?你自己看着办吧!我的代码里面有!嘻嘻!
在这里感谢http://www.host01.com/article/software/Delphi/20060917183659893.htm是他让我知道停靠是多么神奇的!那里面有更细的说明我这里主要是提供一个完整代码供大家参考!