Как узнать, закреплена ли форма TJvDockServer?

Мне просто интересно, знает ли кто-нибудь, как определить, легко ли закрепляется или открепляется форма 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; 

person Scott Alexander    schedule 07.01.2013    source источник


Ответы (1)


Сначала я бы проверил 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. (Сделайте три страницы, затем скройте их все, открепив). В этом случае вам нужно будет использовать подход Ancestors, но я бы, по крайней мере, все же добавил бы проверку TJvDockClient.DockState к любому подходу, который вы используете.

Однако ваш подход, который, по-видимому, жестко закодирует трехуровневую рекурсию, вероятно, применим только к вашему точному набору элементов управления, поэтому я бы подумал о его переписывании в целом, сказав: «Если у aForm есть родительский элемент в последних X поколениях родителей, который является TJvDockVSPopupPanel, затем верните true, в противном случае верните false ».

person Warren P    schedule 07.01.2013
comment
Приветствую вас, теперь он стал намного надежнее. - person Scott Alexander; 08.01.2013