• 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

  • 相关阅读:
    saltstack
    python一个命令开启http服务器
    常用服务安装部署
    位置1
    linux中python3安装和使用
    Linux基础系统优化
    Shell基本命令
    linux系统目录结构
    远程连接linux服务器
    VMware和Centos安装使用
  • 原文地址:https://www.cnblogs.com/yzryc/p/6277382.html
Copyright © 2020-2023  润新知