如何检测浮动控件是否已关闭?

SiB*_*rit 2 delphi controls docking

在Delphi程序中,我使用ManualFloat显示包含Frame作为浮动窗口的TPanel,用于显示有关所选项目的额外信息.使用复选框显示/隐藏此窗口,但是如果用户使用Delphi自动创建的停靠窗口上的X关闭浮动控件,则似乎没有可以挂钩的事件来更改复选框的状态.有谁知道这将如何实现?

Ser*_*yuz 5

如果OnClose浮动码头有事件,您可以挂钩浮动码头的OnClose事件.默认情况下它有.它是类型TCustomDockForm的后代TCustomForm.但从技术上讲,它可能是一个后代TWinControl.如果由于某种原因,您将浮动码头的类更改为不会降低的类,则TCustomForm可能需要调整此答案.

OnClose事件TCustomDockForm未公布.因此,您需要使用受保护的hack来访问该事件.如果您使用自己的类作为浮动基座,如下例所示,您可以在需要时扩展功能.

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    ...
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure FloatingDockClose(Sender: TObject; var Action: TCloseAction);
  end;

...

type
  TMyDockForm = class(TCustomDockForm)
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.FloatingDockSiteClass := TMyDockForm;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.ManualFloat(Rect(200, 200, 420, 280));
//  now we have a floatin dock
  TMyDockForm(Panel1.HostDockSite).OnClose := FloatingDockClose;
end;

procedure TForm1.FloatingDockClose(Sender: TObject; var Action: TCloseAction);
begin
  CheckBox.Checked := False;
end;
Run Code Online (Sandbox Code Playgroud)