Удалить TLabel в Delphi

В настоящее время я динамически создаю два TLabels и TEdit, называя их LblDesc+i, EdtAmount+i и LblUnit+i - где i - целое число, которое я повторяю на единицу каждый раз, когда добавляю эти 3 элемента. Данные в элементах предназначены только для моделирования. Моя проблема сейчас заключается в удалении трех объектов. Я попробовал с бесплатным и 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;

3 ответа

Решение

В прошлом у меня были проблемы, связанные с удалением некоторого компонента, который я решил установить для родительского компонента в nil но это не должно быть так, так как TControlДеструктор - если он вызывается - уже делает свою работу.

Компонент следует удалить, просто освободив его.

LblUnit.Free;

Если вам нужно найти компонент по его имени, используйте http://docwiki.embarcadero.com/Libraries/Seattle/en/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], индекс должен быть соответственно изменен.

Ответ, который закончил работать, был таким:

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;

Чтобы удалить динамически созданный компонент, у вас должна быть действительная ссылка на него.

Вы можете организовать собственный массив или список, чтобы сохранить ваши объекты, или использовать существующие списки, например: Form.Components[] который содержит объекты, владельцем которых является Form,

Во втором случае вы должны найти необходимые объекты с FindComponent по имени или пройти через Components[] и поиск компонента с какой-либо функцией (имя, тип класса, тег и т. д.)

Другие вопросы по тегам