gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:03:00 24 4
gpt4 key购买 nike

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

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

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

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

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

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

这会好吗?
它对我有用,它不会引发错误,但我想确保所述按钮与放置它的表单一起被销毁。

MyButton 将放置在辅助表单上,例如“Form2”
所以会有这样的代码:
var
bt:TMyButton;
begin
bt:=TMyButton.Create(Form2);
bt.Parent:=Form2;
...
form2.Show;
end;

最佳答案

首先:setting a control's parent in its constructor is wrong !对于在设计时创建的控件,IDE 将负责设置父控件。对于在运行时创建的控件,创建代码应该负责设置父级。

How do I make sure a dynamic control is destroyed along with it's parent form?



当直接的 Parent 被销毁时,具有 Parent 的控件将自动被销毁。此外,具有 Owner 的控件将在该 Owner 被销毁时自动被销毁。如果所有者在控件的父链中,那么一切都很好。如果所有者不在控件的父链中,那么您的设计问题可能会导致不必要的破坏。

您当前的构造函数是完全没有必要的。将所有者(可能为零!)转换为 TWinControl没有检查是错误的。但如前所述,设置 Parent 不应该在那里。 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;

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

关于Delphi销毁父窗体的动态控件onDestroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28910991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com