3

ユーザーが固定フォームで「x」をクリックすると、OnClose が呼び出されます。

ユーザーが固定されていないフォームで「x」をクリックすると、OnHide が呼び出されます

ユーザーが固定フォームで「固定解除」をクリックすると、OnHide が呼び出されます。

表示されているフォームをメニュー システムと同期させようとしていますが、ユーザーが [x] をクリックしたときと [UnPin] をクリックしたときの OnHide イベントの違いを判断する方法がわかりません。「x」をインターセプトして、代わりに Close を呼び出したいと思います。

目盛り付きメニュー

各子は TManagerPanel の子孫であり、これは TForm の子孫であり、border スタイルが 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;

編集:「ピン留めされた」フォームの意味:ピンが常に表示されるように設定されたドッキングされたフォーム。 ピン留め

「UnPinned」フォームの意味: タブがドッキング タブ セットに表示され、タブが選択されたときにフォームが表示されるようにピンが解放されたドッキング フォーム。

固定解除 - 展開

固定解除

Delphi のバージョンは 2007 年です

4

1 に答える 1

3

ドッキングされたフォームを固定および固定解除すると、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;

アニメーション速度はDockCaptionMouseUp1 に設定されているため、パネルが閉じているように見えます (非常に高速に非表示になります)。「固定解除」でも同じことが起こりますが、コントロールの状態が変わります。

于 2011-03-28T21:20:32.693 に答える