Удалить 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[]
и поиск компонента с какой-либо функцией (имя, тип класса, тег и т. д.)