UnPin和Close UnPinned之间的区别

时间:2011-03-24 16:43:06

标签: delphi dock

当用户点击固定表格上的'x'时,会调用OnClose。

当用户点击未固定表单上的'x'时,会调用OnHide

当用户点击固定表格上的“UnPin”时,会调用OnHide。

我正在尝试将可见表单与菜单系统同步,但我不知道如何确定OnHide事件在用户点击“x”和用户点击“UnPin”之间的差异。我想截取'x'并改为调用Close。

Menu with ticks

每个子节点都是TManagerPanel的后代,后者又是TForm的后代,边框样式设置为bsSizeToolWin,Drag Kind设置为dkDock,Drag Mode是dmAutomatic。

type
    TPanelManager = class(TForm)
    ...
    private
    ...        
        Panels: TManagerPanelList;
        Settings: TSettings; //User Settings
    ...
end;
...

function TPanelManager.InitChild(ChildClass: TManagerPanelClass): TManagerPanel;
var
    Child: TManagerPanel;
begin
    Child := ChildClass.Create(Self);
    Child.Connection := MSConnection1;
    Child.Settings := Settings;
    Child.Styles := Styles;
    ...
    Child.OnPanelClosed := PanelClosed;
    Child.OnPercentChanged := PercentChanged;
    ...
    Child.OnPanelHide := PanelHide;
    Child.Font := Font;
    Child.Initialise;
    Child.ManualDock(DockTarget);
    Panels.AddPanel(Child);
    Result := Child;
end;

procedure TPanelManager.PanelClosed(Sender: TObject; var Action: TCloseAction);
var
    MenuItem: TMenuItem;
    Child: TManagerPanel;
begin
    if Sender is TManagerPanel then
    begin
        Child := TManagerPanel(Sender);
        Action := caFree;
        MenuItem := MenuItemFromChild(Child);
        MenuItem.Checked := False;
        Settings[RemoveAmpersand(MenuItem.Caption)] := MenuItem.Checked;
        Panels.Remove(Child);
    end;
end;

编辑: 我所说的“固定”表格是一种对接形式,其中设置的引脚始终可见。 Pinned

“UnPinned”表单的含义:释放图钉的停靠表单,以便在停靠栏选项卡集中显示选项卡,并在选择选项卡时显示该表单。

Unpinned - Expanded

Unpinned

德尔福版本是2007年

1 个答案:

答案 0 :(得分:3)

似乎固定和取消固定停靠的表单会改变它在TTabDockPanel和TPanel之间的父级,我将它对接到它。

将OnHide方法添加到Demo Dock Form ...

procedure TfrmDock.FormHide(Sender: TObject);
begin
  if Assigned(Self.Parent) then
      ShowMessage(Self.Parent.ClassName)
  else 
      ShowMessage('No Parent');
end;

当表单被隐藏时,我现在可以区分“浮动”,“停靠,固定”和“停靠,取消固定”。

修改 我发现了一种更好的方法

procedure TfrmDock.FormHide(Sender: TObject);
begin
    if Assigned(Parent) then
    begin
        if Not (csDocking in ControlState) then //This was the original test above
        begin
            if Parent is TTabDockPanel then // This is now a safety check
            begin
                if TTabDockPanel(Parent).AnimateSpeed = 1 then //Additional Test
                    //form is closing
                else
                    //form is hiding (Unpinned focused changed)
            end;
        end
        else 
            //form is being unpinned.
    end;
end;

DockCaptionMouseUp中,动画速度设置为1,以便面板显示关闭(隐藏得非常快)。 “取消固定”但控制状态发生变化也是如此。