uConjoinHost.pas
上传用户:lmk588
上传日期:2013-04-16
资源大小:5120k
文件大小:3k
源码类别:

按钮控件

开发平台:

Delphi

  1. unit uConjoinHost;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, uDockForm;
  5. type
  6.   TConjoinDockHost = class(TForm)
  7.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  8.     procedure FormDockDrop(Sender: TObject; Source: TDragDockObject; X,
  9.       Y: Integer);
  10.     procedure FormUnDock(Sender: TObject; Client: TControl;
  11.       NewTarget: TWinControl; var Allow: Boolean);
  12.     procedure FormDockOver(Sender: TObject; Source: TDragDockObject; X,
  13.       Y: Integer; State: TDragState; var Accept: Boolean);
  14.     procedure FormGetSiteInfo(Sender: TObject; DockClient: TControl;
  15.       var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
  16.   private
  17.     procedure DoFloat(AControl: TControl);
  18.   public
  19.     procedure UpdateCaption(Exclude: TControl);
  20.   end;
  21. var
  22.   ConjoinDockHost: TConjoinDockHost;
  23. implementation
  24. {$R *.dfm}
  25. procedure TConjoinDockHost.DoFloat(AControl: TControl);
  26. var
  27.   ARect: TRect;
  28. begin
  29.   //float the control with its original size.
  30.   ARect.TopLeft := AControl.ClientToScreen(Point(0, 0));
  31.   ARect.BottomRight := AControl.ClientToScreen(Point(AControl.UndockWidth,
  32.                        AControl.UndockHeight));
  33.   AControl.ManualFloat(ARect);
  34. end;
  35. procedure TConjoinDockHost.FormClose(Sender: TObject;
  36.   var Action: TCloseAction);
  37. begin
  38.   if DockClientCount = 1 then
  39.   begin
  40.     DoFloat(DockClients[0]);
  41.     Action := caFree;
  42.   end else
  43.     Action := caHide;
  44. end;
  45. procedure TConjoinDockHost.UpdateCaption(Exclude: TControl);
  46. var
  47.   I: Integer;
  48. begin
  49.   //if a dockable form is undocking, it will pass itself in as Exclude
  50.   //because even it hasn't actually been taken out of the DockClient array
  51.   //at this point.
  52.   Caption := '';
  53.   for I := 0 to DockClientCount-1 do
  54.     if DockClients[I].Visible and (DockClients[I] <> Exclude) then
  55.       Caption := Caption + TDockableForm(DockClients[I]).Caption + ' ';
  56. end;
  57. procedure TConjoinDockHost.FormDockDrop(Sender: TObject;
  58.   Source: TDragDockObject; X, Y: Integer);
  59. begin
  60.   UpdateCaption(nil);
  61.   DockManager.ResetBounds(True);
  62.   //Force DockManager to redraw it's clients.
  63. end;
  64. procedure TConjoinDockHost.FormUnDock(Sender: TObject; Client: TControl;
  65.   NewTarget: TWinControl; var Allow: Boolean);
  66. begin
  67.   //only 2 dock clients means the host must be destroyed and
  68.   //the remaining window undocked to its old position and size.
  69.   //(Recall that OnUnDock gets called before the undocking actually occurs)
  70.   if Client is TDockableForm then
  71.     TDockableForm(Client).DockSite := True;
  72.   if (DockClientCount = 2) and (NewTarget <> Self) then
  73.     PostMessage(Self.Handle, WM_CLOSE, 0, 0);
  74.   UpdateCaption(Client);
  75. end;
  76. procedure TConjoinDockHost.FormDockOver(Sender: TObject;
  77.   Source: TDragDockObject; X, Y: Integer; State: TDragState;
  78.   var Accept: Boolean);
  79. begin
  80.   Accept := Source.Control is TDockableForm;
  81. end;
  82. procedure TConjoinDockHost.FormGetSiteInfo(Sender: TObject;
  83.   DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint;
  84.   var CanDock: Boolean);
  85. begin
  86.   CanDock := DockClient is TDockableForm;
  87. end;
  88. end.