如何确保动态控件及其父窗体被销毁?
因此,从主窗体中,我为辅助窗体创建一个按钮,然后显示带有该按钮的辅助窗体。
现在,我要确保创建的按钮与辅助表单一起被销毁。
将按钮的父级设置为辅助表单就足够了吗?这样会吗?
我正在使用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)
首先:在控件的构造函数中设置控件的父级是错误的!对于在设计时创建的控件,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)
但是,这使您无法参考该按钮。而是将变量添加到更高的范围。