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

时间:2014-04-13 23:11:55

标签: delphi controls docking

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

1 个答案:

答案 0 :(得分:5)

如果浮动码头有OnClose事件,您可以挂钩浮动码头的OnClose事件。默认情况下它有。属于TCustomDockForm的{​​{1}}类型的后代。TCustomForm的后代。但从技术上讲,它可以是TWinControl的后代。如果您出于某种原因将浮动码头的类别更改为不会从TCustomForm下降的内容,则可能需要调整此答案。

OnClose TCustomDockForm事件未发布。因此,您需要使用 protected 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;
相关问题