ドッキングモジュールを使用して、Delphi(BDS 2006)とJVCLライブラリでプログラミングしています。私には1つの問題があります-コントロールにプロパティがDragKind = dkDock
ありDragMode = dmAutomatic
、そして、不可解にもTJvDockServerコンポーネントがコントロールを取得し、両方がクライアントであり、ドッキングを提供します。私が知ったように、JVCLのドッキング機能は通常、コンポーネントクラスTJvDockClientを含むクラスTFormのみを制御するため、これは間違っています。クラスがTFormとは異なるコントロールをTJvDockServerがドッキングするのを何らかの方法で防ぐことができるかどうか知りたいですか?Delphiでの通常のドッキングでは、イベントごとにOnGetSiteInfoドックと呼ばれ、クライアントをフィルタリングできますが、TJvDockServerにはそのようなイベントはありません。
2 に答える
プロパティ DragKind および DragMode は、標準の VCL プロパティです。ドッキングは VCL に組み込まれており、それを見ると、Jedi コードが関係なくてもかなりうまく機能しているように見えます。
フォーム以外のものをドッキングする機能は、VCL に既に組み込まれています。したがって、これが不可解であるとわかったということは、ジェダイが VCL にドッキングを追加したと考えたことを示唆しています。いいえ、「タブ付きノートブックのドッキング」や偽のウィンドウのタイトルバーを使用した「結合領域」などの美しいものを追加しただけです。
そうは言っても、フォームも TCustomControl から継承されており、実際にはどの TCustomControl もドッキングできます。VCl と同じように、TPanels の上にドラッグ アンド ドッキング アンド ランディングできます。実行時にパネルがフォームに変わるという風変わりな機能ですが、信じられない場合は試してみてください。ジェダイではなく、あなたにこれを行っているのは VCL です。
あなたの知恵で、TForm 以外のものをブロックしたい場合は、できると思いました。きっとできますよね? 更新します。はい、できます。OnDockOver は、ドッキングをブロックしたい任意のパネルでのドッキングをブロックするために正常に機能します。Jedi JvDockPanels の秘訣は、設計時には表示されないため、実行時にコードでフックしてイベントにアクセスする必要があることです。
通常の TPanel と同様に、JvDockPanel には TPanel.OnDockOver イベントがあり、ドッキングしているものを確認したい場合は、Accept を false に設定すると、ドッキングできなくなります。
さて、これは動作します:
type
TCustomControlAccess = class(TCustomControl);
procedure TMainForm.FormCreate(Sender: TObject);
begin
TCustomControlAccess(dockServer.TopDockPanel).OnDockOver := MyDockOverEvent;
TCustomControlAccess(dockServer.CustomDockPanel).OnDockOver := MyDockOverEvent;
...
end;
JvDockPanel.OnDockOver パネル イベントは発生しますが、実際にイベントを自分で処理するには、上記のハックのようなハックに頼る必要があります。
Updateは以前、これをブロックする方法はないと考えていました。しかし、私は間違っていました。理解した。
Delphi XE2での動作を正確に再現することはできませんが、通常、JediVCLコンポーネントのVCL-frag-n-dropをブロックすることができます。
最善の方法ではないかもしれませんが、フレームワーク作成者の独創的なアイデアがどれであったかはわかりません。
http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvDockServerは、フォームのみをドッキングする必要があると主張しています。それを強制しませんでした、ただ常に呼び出されるように配線されたJVCLチェックルーチン。
unit JvDockSupportControl;
....
TJvDockCustomControl = class(TJvCustomControl)
....
protected
procedure GetSiteInfo(Client: TControl; var InfluenceRect: TRect;
MousePos: TPoint; var CanDock: Boolean); override;
...........
function TJvDockCustomControl.GetJvDockManager: IJvDockManager;
begin
// Result := IJvDockManager(DockManager);
DockManager.QueryInterface(IJvDockManager, Result);
end;
procedure TJvDockCustomControl.GetSiteInfo(Client: TControl; var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
var jdm: IJvDockManager; idm: IDockManager;
begin
idm := DockManager;
if nil <> idm then
idm.QueryInterface(IJvDockManager, jdm);
if nil = jdm
then CanDock := false
else jdm.GetSiteInfo(Client,InfluenceRect, MousePos, CanDock);
end;
unit JvDockTree;
.....
procedure TJvDockTree.GetSiteInfo(Client: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
begin
CanDock := IsDockable(DockSite, Client);
If CanDock then begin
GetWindowRect(DockSite.Handle, InfluenceRect);
InflateRect(InfluenceRect, DefExpandoRect, DefExpandoRect);
end;
end;