Delphi JvDockServer JvDockClient通知取消对接(浮动)客户端窗体



使用带有Delphi的JEDI VCL库,在主窗体上放置了一个JvDockServer,在另一个应该对接到主窗体的窗体上,我有使用对接样式JvDockVIDVCStyle的JvDockClient。

虽然停靠功能很好,但当客户端窗体从停靠模式更改为取消停靠(浮动)模式时,我希望收到通知。

更新JVCL现在被修改为包含内置的此功能!TForm的内置事件现在在您对接表单时触发。请查看JEDI JVCL中的DockingInCode演示,该演示现在(截至2012年3月27日)包含对接和取消对接事件触发的示例。TForm.OnEndDock现在在对接时被激发,TForm.OnUnDock在解除对接时也是如此。很抱歉这些名字,那些区域已经在TForm中了,我没有选择它们!

历史原因的旧答案:

您希望在表单浮动时收到通知。TForm已经有了OnUnDockOnEndDock,但当您使用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)Dock样式,请将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不兼容,所以我无法添加。

相关内容

  • 没有找到相关文章

最新更新