Delphi で JEDI VCL ライブラリを使用して、メイン フォームに JvDockServer を配置し、メイン フォームにドッキングする必要がある別のフォームに、ドック スタイル JvDockVIDVCStyle を使用する JvDockClient を配置しました。
ドッキングはうまく機能しますが、クライアント フォームがドッキング モードからドッキング解除 (フローティング) モードに変更されたときに通知を受け取りたいです。
更新JVCL が変更され、この機能が組み込まれました。フォームをドッキングすると、TForm の組み込みイベントが発生するようになりました。JEDI JVCL の DockingInCode デモを確認してください。これには現在 (2012 年 3 月 27 日現在)、ドッキング イベントとドッキング解除イベントの起動のサンプルが含まれています。TForm.OnEndDock は、ドッキング解除時と同様に、ドッキング時に発生するようになりTForm.OnUnDock
ました。名前については申し訳ありませんが、それらの領域は既に含まれてTForm
おり、私はそれらを選択しませんでした!
歴史的な理由による古い回答:
フォームがフローティングになったときに通知を受け取りたい。TForm にはすでにOnUnDock
と がありOnEndDock
ますが、Jedi VCL Dock Manager を使用してドッキングおよびドッキング解除すると、これらは (悲しいことに) 起動されません。
これを行うための最善の方法は、JVCL を変更することです。
JvDockSupportControl.pas、メソッド TJvDockCustomControl.WndProc を変更します。
procedure TJvDockCustomControl.WndProc(var Msg: TMessage);
var
CMUnDockClient: TCMUnDockClient;
DockableForm: TJvDockableForm;
allow:Boolean;
begin
if Msg.Msg = CM_UNDOCKCLIENT then
begin
CMUnDockClient := TCMUnDockClient(Msg);
// new code starts here
if CMUnDockClient.Client is TForm then begin
allow := true;
if Assigned(TForm(CMUnDockClient.Client).OnUnDock) then
TForm(CMUnDockClient.Client).OnUnDock(Self,CMUnDockClient.Client,TWinControl(nil),allow);
// if not allow then
// exit; // currently JvDocking has already deleted you from the dock tree, so we can't honor this.
end;
// new code ends here
if CMUnDockClient.Client is TJvDockableForm then
begin
...
残念ながら、これはコンポーネントの設計上の見落としです。Jedi Bug Trackerに記録して、ここにリンクを投稿してください。残念ながら、JvDocking の内部構造は複雑ですが、上記のハックにより、今日の時点でうまくいく可能性があります。
JVCL を編集する代わりに、使用したい Dock スタイルに基づいて独自のスタイルを作成し、それに OnDock および OnFloat イベントを追加することもできます。たとえば、VID (Visual Interdev) ドック スタイルを使用している場合は、JvDockVIDStyle.pas を自分のユニットにコピーし、別の名前に変更します。
コードで次の手順を見つけます。
procedure TJvDockVIDTree.WindowProc(var Msg: TMessage);
その関数に既存のコードを残して、最後に以下を追加します。
if (Msg.msg =CM_UNDOCKCLIENT)and Assigned(FOnUndock) then
FOnUndock( TObject(Msg.Client))
上記のより良いバージョンを作成し、それを JVCL JvDocking に入れる必要があると思います。これは直感的なことだからです。さらに、おそらく OnEndDock を機能させる必要があります。OnStartDock は JvDocking と互換性がないため、追加できません。