3

当用户单击固定表单上的“x”时,将调用 OnClose。

当用户在未固定的表单上单击“x”时,调用 OnHide

当用户在固定表单上单击“取消固定”时,调用 OnHide。

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

带刻度的菜单

每个孩子都是 TManagerPanel 的后代,而 TManagerPanel 又是 TForm 的后代,边框样式设置为 bsSizeToolWin,拖动种类设置为 dkDock,拖动模式为 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;

编辑:我所说的“固定”表格是什么意思:带有固定针的停靠表格,使其始终可见。 固定

我所说的“UnPinned”表单是什么意思:一个固定的表单,其中释放了 pin,使得一个选项卡出现在停靠选项卡集中,并且在选择选项卡时出现表单。

未固定 - 展开

取消固定

德尔福版本是2007

4

1 回答 1

3

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

向 Demo Dock 表单添加 OnHide 方法...

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;

DockCaptionMouseUpAnimation Speed 中设置为 1,以便面板看起来关闭(隐藏得非常快)。“取消固定”也会发生同样的情况,但控制状态会发生变化。

于 2011-03-28T21:20:32.693 回答