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 内に隠されている場合です。(3 ページを作成し、ピンを外してすべて非表示にします)。その場合は祖先アプローチを使用する必要がありますが、少なくとも TJvDockClient.DockState使用するアプローチにチェックを追加します。

ただし、3 レベルの再帰をハード コードするように見えるアプローチは、おそらくコントロールの正確なセットにのみ適用されるため、「aForm が親の最後の X 世代内に親を持つ場合、それはTJvDockVSPopupPanel の場合は true を返し、それ以外の場合は false を返します。」

于 2013-01-07T15:54:54.093 に答える