7

ユーザーがドッキングを解除して移動できるようにするペイントボックスがあります。そこで、にとを設定し、にDragKind設定dkDockしてDragModeパネルdmAutomatic内に配置します。ペイントボックスをフローティングフォームにドッキング解除した後にドッキングすると、かなり奇妙な動作が発生します。フローティングフォームの閉じるボタンがパネル内に表示されます。2つのスクリーンショットを添付しました。1つは元の状態からのもので、もう1つはペイントボックスを再度ドッキングした後のものです。私は何が欠けていますか?DockSiteTrue

元の状態:

ドッキングを解除する前に

ドッキング後:

ドッキング後


更新 TLamaのソリューションを使用した後、結果は次のようになります。

ドッキング後;  新しいドックマネージャーの使用

4

2 に答える 2

4

あなたは何も見逃していません。これが、デフォルトのドック マネージャーの実装のしくみです。それを使用するドックサイトで利用可能な閉じるボタンを備えたグラバーが必要なだけです。あなたができることは、独自のドックマネージャーを実装し、その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イベント メソッドは実行しなくても正常に動作しました)。だから、しかし私は個人的にそれに頼るつもりはありません)。

于 2013-01-22T14:32:05.027 に答える
2

パネルをドック ターゲットとして使用するのではなく、TPageControl を使用して、生成されたタブ シートからタブを非表示にします。通常、ページ コントロールにはタブが表示されるため、削除ハンドルは表示されません。残念ながら、タブ シートのタブを非表示にすると、シート自体も非表示になります。そのため、次の OnDockDrop イベントを追加して、保存および復元する必要があります。

procedure TForm2.PageControl1DockDrop(Sender: TObject; Source: TDragDockObject;
  X, Y: Integer);
var
  ix: Integer;
begin
  ix := PageControl1.ActivePageIndex;
  PageControl1.ActivePage.TabVisible := false;
  PageControl1.ActivePageIndex := ix;
end;
于 2016-09-08T13:59:38.227 に答える