Разница между UnPin и Close UnPinned - PullRequest
3 голосов
/ 24 марта 2011

Когда пользователь нажимает 'x' в закрепленной форме, вызывается OnClose.

Когда пользователь нажимает 'x' на незакрепленной форме, OnHide называется

Когда пользователь нажимает «Отменить» в закрепленной форме, вызывается 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;

EDIT: Что я имею в виду под «закрепленной» формой: закрепленная форма с набором булавок, который всегда виден. Pinned

Что я имею в виду под формой «Не закреплено»: закрепленная форма с отпущенным штифтом, так что вкладка появляется в наборе вкладок дока, а форма появляется при выборе вкладки.

Unpinned - Expanded

Unpinned

Delphi Версия 2007

1 Ответ

3 голосов
/ 29 марта 2011

кажется, что закрепление и открепление закрепленной формы изменяет ее родительский элемент между TTabDockPanel и TPanel, к которому я ее прикрепляю.

Добавление метода 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;

В DockCaptionMouseUp Скорость анимации установлена ​​на 1, так что кажется, что панель закрывается (очень быстро скрывается).То же самое происходит для "Открепления", но изменения состояния управления.

...