不知道大家注意没有,Delphi代码编辑窗口的很多部分都能够单独用鼠标从主窗口中托拽出来成为单独的窗口,并且还能够托拽回去,甚至能够融入PageControl的一个Tabsheet。比如编译消息窗口就是这样的。这样的东西停靠进DockSite以后在一端大都有两个横线或者竖线,并有一个关闭样式的带叉的小按钮。我在此之前了解一些关于所谓"Dock技术"的vcl实现的方法,就是很多vcl组件都有docksite属性,设成true就能接受托来的其他控件,如果把另一个控件的dragkind设成dkDrag,dragmode设成dmAutomatic就能够从所在的DockSite托出成为单独窗口,或者托进融合到docksite里面。可是在实际的实现过程中,似乎并不像那么"智能化"。比如:
1。你无法控制(至少我不知道)"浮动控件"停泊进docksite以后的对齐方式,一个align=altop的toolbar托进align=alleft的Controlbar以后,无法自动的变成竖排的,本来横向排列的很多按钮都被隐去了,即便强制设置toolbar的autosize和align属性也不顶用。2。怎样出现那个小关闭按钮。3。不知道大家是否用过MS Visual InterDev 6,它不但能有上面叙述的功能,还能够在窗口停靠进入Docksite以后出现代表独立窗口标题栏的蓝条,而并不是两条线,这怎样实现?////////////////////////////
希望不吝赐教!!

解决方案 »

  1.   

    补充一个问题:4。怎样托进PageControl?
      

  2.   

    2. toobar1.ManualDock(coolbar1);
       在formcreate事件里
      

  3.   

    to: cxreal(夜晚的猪) 你的方案不能解决4个问题面的任何一个阿?!
      

  4.   

    http://www.pigtwo.com/CtrlData/WebSite/DockPresident.htm
    鲁小班的停靠控件虽然Bug多多,但是很不错,我一直在用
      

  5.   

    http://www.pigtwo.com有DockPresident控件下载
    带源码,你可以研究一下
      

  6.   

    1. 事實就是那樣智能化﹕就是通過你所說的方法﹐就是很多vcl组件都有docksite属性,设成true就能接受托来的其他控件,如果把另一个控件的dragkind设成dkDrag,dragmode设成dmAutomatic就能够从所在的DockSite托出成为单独窗口,或者托进融合到docksite里面。
    我們曾做過這樣的軟件包含這個功能﹐請參考以下的代碼﹕
    procedure CreateCNForms(aDockSite : TWinControl);
    begin
      UID := GetUsrID;
      if frmCNSummary = nil then NewForm(TfrmCNSummary, frmCNSummary);
      if frmOpenCN = nil then NewForm(TfrmOpenCN, frmOpenCN);
      if frmCNTermNot = nil then NewForm(TfrmCNTermNot, frmCNTermNot);
      if frmCNWithdrw = nil then NewForm(TfrmCNWithdrw, frmCNWithdrw);
      if frmCNAck = nil then NewForm(TfrmCNAck, frmCNAck);
      if frmCnclLic = nil then NewForm(TfrmCnclLic, frmCnclLic);
      if frmAL = nil then NewForm(TfrmAL, frmAL);
      frmCNSummary.ManualDock(aDockSite, aDockSite, alClient);
      frmOpenCN.ManualDock(aDockSite, aDockSite, alClient);
      frmCNTermNot.ManualDock(aDockSite, aDockSite, alClient);
      frmCNWithdrw.ManualDock(aDockSite, aDockSite, alClient);
      frmCNAck.ManualDock(aDockSite, aDockSite, alClient);
      frmCnclLic.ManualDock(aDockSite, aDockSite, alClient);
      frmAL.ManualDock(aDockSite, aDockSite, alClient);
      dmCNApp.adsCNAdv.Open;
    end;2. 自己在在From上的一個角落上加一個小关闭按钮﹐可以和系統的形狀相同﹐最好用TSpeedButton.
    3. MS Visual InterDev 6沒用過,不知有沒有這樣的功能。
      

  7.   

    manudock和manufloat确实可以实现最基本的停靠,但是似乎alXXX根本没有任何作用啊!procedure TForm1.Panel1Click(Sender: TObject);
    begin
      panel1.ManualFloat(panel1.ClientRect);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      panel1.ManualDock(controlbar1,nil,altop)
    end;停靠以后出现的那条线似乎只能在左边,跟alXXX无关啊
      

  8.   

    提供一个网页:
    http://www.cx66.com/cxgzs/program/delphi/961.htm