1

我只是想知道是否有人知道如何确定 TJvDockServer 表单是否容易被固定或取消固定。我能够这样做的唯一方法是通过...检查父表单是否是 TJvDockVSPopupPanel...

ancestor := GetAncestors(Self, 3);
if (ancestor is TJvDockTabHostForm) then
    if ancestor.Parent <> nil then
    begin
        if ancestor.Parent is TJvDockVSPopupPanel then
        begin
            // Code here
        end;  
    end;

和 getAncestors 是...

function GetAncestors(Control : TControl; AncestorLevel : integer) : TWinControl;
begin
    if (Control = nil) or (AncestorLevel = 0) then
        if Control is TWinControl then
            result := (Control as TWinControl)
        else
            result := nil // Must be a TWinControl to be a valid parent.
    else
        result := GetAncestors(Control.Parent, AncestorLevel - 1);
end; 
4

1 回答 1

2

我会先检查 DockState,如下所示:

function IsUnpinned(aForm:TMyFormClassName):Boolean;
begin
  result := false;
 if Assigned(aForm) then
    if aForm.Client.DockState = JvDockState_Docking then
    begin
      // it's docked, so now try to determine if it's pinned (default state,
      // returns false) or unpinned (collapsed/hidden) and if unpinned, return true.
      if aForm.Client.DockStyle is TJvDockVSNetStyle then
      begin
        if Assigned(aForm.Parent) and (aForm.Parent is TJvDockVSPopupPanel) then
        begin
          result := true;
        end;
      end;  
    end;
end;

未固定意味着停靠样式支持双模式(单击它打开,单击它关闭)状态从固定(停靠时的默认状态)变为未固定(但仍停靠)状态,除了一个小的铭牌标记之外完全隐藏.

我编写的上述代码不会通过父级递归,因此它无法处理您的代码试图处理它的情况,即表单是选项卡式笔记本的一部分,然后隐藏在 JvDockVSPopupPanel 中。(制作三页,然后通过取消固定将它们全部隐藏)。在这种情况下,您需要使用祖先方法,但我至少仍会将检查添加到 TJvDockClient.DockState您使用的任何方法中。

但是,您似乎对 3 级递归进行硬编码的方法可能仅适用于您的确切控件集,因此我会考虑一般重写它,通过说“如果 aForm 在最后 X 代父母中的父母是TJvDockVSPopupPanel,则返回 true,否则返回 false”。

于 2013-01-07T15:54:54.093 回答