あなたは何も見逃していません。これが、デフォルトのドック マネージャーの実装のしくみです。それを使用するドックサイトで利用可能な閉じるボタンを備えたグラバーが必要なだけです。あなたができることは、独自のドックマネージャーを実装し、そのAdjustDockRect
メソッドをオーバーライドすることです。これにより、ドッキングゾーンのサイズが制御され、デフォルトのドックマネージャー実装のどこに、閉じるボタンでグラバー用のスペースが作成されます。そのグラバーが必要ない場合は、メソッドに渡されたドック ゾーンの四角形のサイズを、ドック サイト全体のサイズのままにします。つまり、そのメソッドのオーバーライドでは何もしません。
これはグラバーの機能部分のためのものですが、ハードコードされた描画をインターセプトする必要があることを除いて. そのためには、イベント メソッドをオーバーライドする必要があり、PaintDockFrame
以前と同様に、そこでは何もしません。
コードサンプルは次のとおりです。
type
TNoGrabDockManager = class(TDockTree)
protected
procedure AdjustDockRect(Control: TControl; var ARect: TRect); override;
procedure PaintDockFrame(Canvas: TCanvas; Control: TControl;
const ARect: TRect); override;
end;
implementation
{ TNoGrabDockManager }
procedure TNoGrabDockManager.AdjustDockRect(Control: TControl; var ARect: TRect);
begin
// here you can make space for a grabber by shifting top or left position
// of the ARect parameter, which is by default set to the whole dock site
// bounds size, so if you do nothing here, there will be no grabber
end;
procedure TNoGrabDockManager.PaintDockFrame(Canvas: TCanvas; Control: TControl;
const ARect: TRect);
begin
// in this event method, the grabber with that close button are drawn, so
// as in case of disabling grabber functionality do precisely nothing for
// drawing it here, that will make it visually disappear
end;
UseDockManager
このようなカスタム ドック マネージャーの使用方法は次のとおりです (プロパティに関する注意事項については、以下を参照してください)。
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1.DockManager := TNoGrabDockManager.Create(Panel1);
Panel1.UseDockManager := True;
end;
重要
いくつかのソースが示唆しているように、UseDockManager
デザイン時にドック パネルのプロパティを False に設定する必要があります。理由はわかりませんが、私が行った簡単なテストから、設計時にそのプロパティを設定していない場合、カスタム ドック マネージャーのイベント メソッドの一部が起動されませんでした (AdjustDockRect
イベント メソッドは実行しなくても正常に動作しました)。だから、しかし私は個人的にそれに頼るつもりはありません)。