ドッキングコントロールを使ってみる


Delphi4の新機能「ドッキング」に興味があったので、早速使ってみました。

このようなウインドウを下のように合体させたり切り離したりするものです。
Form1のメニューボタンの部分は、ControlBar(Aditionalタブ)の上にToolBar(Win32ページ)を乗せ、ウインドウ右側部分にはForm2を受け入れる領域としてPanel(Standardタブ)を配置しています。
Form2の方は、MonthCalendar(Win32ページ)だけを乗せたものです。


これだけのことをするのにコードは1行も書かず、プロパティの設定だけでできます。

まず、ドッキングを受け入れる側(例ではControlBarとPanel)のDockSiteプロパティをTrueにします。
受け入れ側はこれだけです。
ドッキングしたいコントロール(ToolBar、Form2)では、DragKindをdkDock、DragModeをdmAutomaticにします。DockSiteをTrueにすれば、そのコントロール自身が他のコントロールを受け入れることもできます。

たったこれだけでドッキング対応アプリケーションの完成です。
と言いたい所ですが・・・

DockSite=Trueの状態だとドッキング可能なものは何でも受け入れてしまいます。カレンダーの部分はPanel1の広い部分に受け入れる予定だったので、これでは少し変です。ちょっとコードを書き足してみましょう。
コードを追加するのは受け入れ側のOnGetSiteInfoイベントです。

procedure TForm1.ControlBar1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
begin
  if Not (DockClient is TToolBar) then
  Candock := False;
end;

OnGetSiteInfo イベントはドッキング前に発生して、ドッキング対象を調べることができます。
ControlBarの場合はToolBarしか受け入れたくないのでそのクラスであるTToolBar以外は、
 Candock := False;
としてドッキングを拒否します。Panel1も同様にコーディングします。

procedure TForm1.Panel1GetSiteInfo(Sender: TObject; DockClient: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
begin
 if Not (DockClient is TForm) then
  Candock := False;
end;

以上で、ユーザの操作に関わらず予定通りの動作ができるようになります。