删除 Delphi 中的 TLabel

Delete TLabel in Delphi

我目前动态创建了两个 TLabel 和一个 TEdit,将它们命名为 LblDesc+i、EdtAmount+i 和 LblUnit+i - 其中 i 是一个整数,每次添加这 3 个元素时我都会向上迭代 1。元素中的数据仅用于模拟目的。 我现在的问题是删除这三个对象。我尝试过使用 free 和 FreeAndNil,一点运气都没有。 非常感谢任何帮助。

procedure TForm1.BtnAddClick(Sender: TObject);
begin
  LblDesc := TLabel.Create(Self);
  LblDesc.Caption := 'Item '+IntToStr(i);
  LblDesc.Name := 'LblDesc'+IntToStr(i);
  LblDesc.Left := 16;
  LblDesc.Top := 30 + i*30;
  LblDesc.Width := 100;
  LblDesc.Height := 25;
  LblDesc.Parent := Self;

  EdtAmount := TEdit.Create(Self);
  EdtAmount.Text := IntToStr(i);
  EdtAmount.Name := 'EdtAmount'+IntToStr(i);
  EdtAmount.Left := 105;
  EdtAmount.Top := 27 + i*30;
  EdtAmount.Width := 60;
  EdtAmount.Height := 25;
  EdtAmount.Parent := Self;

  LblUnit := TLabel.Create(Self);
  LblUnit.Caption := 'Kg';
  LblUnit.Name := 'LblUnit'+IntToStr(i);
  LblUnit.Left := 170;
  LblUnit.Top := 30 + i*30;
  LblUnit.Width := 50;
  LblUnit.Height := 25;
  LblUnit.Parent := Self;

  i := i+1;
end;

procedure TForm1.BtnRemoveClick(Sender: TObject);
begin
  //Delete

end;

过去我遇到了与删除某些组件相关的问题,我已经解决了将父组件设置为 nil 但现在应该不再如此,因为 TControl 的析构函数- 如果调用 - 已经完成工作。

只需释放该组件即可将其删除。

LblUnit.Free;

如果您需要按名称查找组件,请使用 System.Classes.TComponent.FindComponent 或遍历 Components 列表。

for i := ComponentCount-1 downto 0 do begin
  if Components[i].Name = 'LblUnit'+IntToStr(i) then begin
    //TControl(Components[i]).Parent := nil; {uncomment if you have the same issue I've had}
    Components[i].Free;
  end;
  . . .  
end;

编辑

如果用于组件名称构造的索引 i 'LblUnit'+IntToStr(i) 不在 [0..ComponentCount-1] 范围内,则必须相应地修改索引。

要删除动态创建的组件,您必须具有对其的有效引用。

您可以组织自己的数组或列表来保存您的对象,或使用现有列表,例如 - Form.Components[] 包含所有者为 Form 的对象。

在第二种情况下,您必须按名称找到具有 FindComponent 的所需对象,或者遍历 Components[] 并搜索具有某些特征(名称、class 类型、标签等)的组件)

最终有效的答案是这样的:

procedure TForm1.BtnRemoveClick(Sender: TObject);
var
  j: Integer;

begin
  for j := ComponentCount-1 downto 0 do begin
    if Components[j].Name = 'LblDesc'+IntToStr(i-1) then begin
      TControl(Components[j]).Parent := nil;
      Components[j].Free;
    end;
  end;
end;