gpt4 book ai didi

Delphi - 如何在运行时删除所有子组件?

转载 作者:行者123 更新时间:2023-12-03 15:03:45 25 4
gpt4 key购买 nike

在设计时,我创建一个 TScrollBox,它将成为运行时创建的 TLayout 的父级。布局还将包含 Tlabel 和 Tedit,如下所示:

var
Layout1: TLayout;
Label1: TLabel;
Edit1: TEdit;
begin
Layout1 := TLayout.Create(self);
Layout1.Parent := ScrollBox1;
Label1 := TLabel.Create(self);
Label1.Parent := Layout1;
Label1.Text := 'abc';
end;

现在我想删除所有内容,就像这个过程从未被调用过一样。

我尝试了以下方法,但程序会崩溃。

var
i : integer;
Item : TControl;
begin
for i := 0 to Scrollbox1.ControlCount - 1 do
begin
Item := Scrollbox1.controls[i];
Item.Free;
end;
end;

有人可以给我提示吗?

最佳答案

当您删除某个控件时,控件列表中该控件后面的控件的索引会下移。也就是说,您最终会尝试访问不存在的位置。

您需要向下迭代列表:

var
i : integer;
Item : TControl;
begin
for i := (Scrollbox1.ControlCount - 1) downto 0 do
begin
Item := Scrollbox1.controls[i];
Item.Free;
end;
end;

另一种方法是始终保持在索引 0,释放其控制并检查是否仍然有可以释放的控制:

var
i : integer;
Item : TControl;
begin
while Scrollbox1.ControlCount > 0 do
begin
Item := Scrollbox1.controls[0];
Item.Free;
end;
end;

更新

正如 @DavidHeffernan 指出的,这里有嵌套的血统。这意味着您应该自下而上地释放组件。一种方法是通过递归

基本上,您需要一个过程来封装子控件的释放。代码将类似于以下内容(请注意,这只是我所做的一个小测试,可能需要额外的代码):

procedure freeChildControls(myControl : TControl; freeThisControl: boolean);
var
i : integer;
Item : TControl;
begin

if Assigned(myControl) then
begin
for i := (myControl.ControlsCount - 1) downto 0 do
begin
Item := myControl.controls[i];
if assigned(item) then
freeChildControls(item, childShouldBeRemoved(item));
end;

if freeThisControl then
FreeAndNil(myControl);
end;
end;

function childShouldBeRemoved(child: TControl): boolean;
begin
//consider whatever conditions you need
//in my test I just checked for the child's name to be layout1 or label1
Result := ...;
end;

为了释放 scrollbox1 子控件(但不是它本身),您可以这样调用它:

freeChildControls(scrollbox1, false);

请注意,我必须添加 childShouldBeRemoved 函数以避免使用此递归函数来释放 labellayout 的子控件你应该让它们的析构函数释放。

实现此函数的一种可能的解决方案是使用对象列表,您可以在其中添加创建的组件,然后在函数内部检查是否必须释放传递的子组件。

关于Delphi - 如何在运行时删除所有子组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25175082/

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