Delphi销毁动态控制onDestroy的父窗体

use*_*313 1 delphi

如何确保动态控件及其父窗体被销毁?

因此,从主窗体中,我为辅助窗体创建一个按钮,然后显示带有该按钮的辅助窗体。

现在,我要确保创建的按钮与辅助表单一起被销毁。

将按钮的父级设置为辅助表单就足够了吗?这样会吗?

我正在使用TButton类的自定义后代-TMyButton。所以在我的构造函数中,我有以下代码:

constructor TMyButton.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   Self.OnClick := Self.MyButtonClick;
   Self.Parent:=TWinControl(AOwner);
   self.Visible := true;
end;
Run Code Online (Sandbox Code Playgroud)

这样可以吗?它对我有用,它不会引发任何错误,但是我要确保所述按钮和放置它的表单一起被销毁。

MyButton将被放置在第二个表单上,比如说“ Form2”,因此将有如下代码:

var
  bt:TMyButton;
begin
      bt:=TMyButton.Create(Form2);
      bt.Parent:=Form2;
      ...
      form2.Show;
end;
Run Code Online (Sandbox Code Playgroud)

NGL*_*GLN 5

首先:在控件的构造函数中设置控件的父级是错误的!对于在设计时创建的控件,IDE是并且将负责设置父级。对于在运行时中创建的控件,创建代码应负责设置父级。

如何确保动态控件及其父窗体被销毁?

当直接父级被销毁时,具有父级的控件将自动销毁。此外,具有所有者的控件将在销毁该所有者时自动销毁。如果所有者在控件的父级链中,则一切正常。如果所有者不在控件的父级链中,则您会遇到设计问题,这可能会导致不必要的破坏。

您当前的构造函数完全没有必要。TWinControl不检查而将所有者(可能为零!)转换为a 是错误的。但是如前所述,设置父级不应该存在。默认情况下,Visible为true,并且分配OnClick事件将阻止其进一步使用。而是改写Click

关于您的评论,调用代码将变为:

procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton;
begin
  Button := TButton.Create(Form2);
  Button.OnClick := Form2.ButtonClick;
  Button.SetBounds(10, 10, 75, 25);
  Button.Parent := Form2;
end;
Run Code Online (Sandbox Code Playgroud)

但是,这使您无法参考该按钮。而是将变量添加到更高的范围。