首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除在运行时创建的TLabel

删除在运行时创建的TLabel
EN

Stack Overflow用户
提问于 2012-11-21 08:35:59
回答 3查看 6.3K关注 0票数 4

如何删除已创建的标签。我试过FindComponent但失败了,我该怎么办?我是否应该将其设置为其他组件的父组件,如TPanel或其他组件?

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
var
  lblLink: TLabel;
begin
   for i := 0 to stringtList.Count-1 do
   begin 
     lblLink := TLabel.create(self);

     with lblLink do
     begin
       name:='lblLink'+inttostr(i);
       caption:inttostr(i);
       Parent := self;
       font.style := [fsUnderline];
       cursor := crHandPoint;
       color := clBlue;
       font.Color := clBlue;
     end;
   end;
end;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-21 08:46:29

您可以遍历Components属性,然后检查组件的名称,最后释放组件。

代码语言:javascript
复制
Var
  LIndex : Integer;
  LComponent : TComponent;
begin
  for LIndex := ComponentCount-1 downto 0 do
    if StartsText('lblLink',Components[LIndex].Name) then
    begin
     LComponent:=Components[LIndex];
     FreeAndNil(LComponent);
    end;
end;
票数 10
EN

Stack Overflow用户

发布于 2012-11-21 08:47:01

你不需要释放它。您赋予了使用lblLink := TLabel.create(self);将其释放到表单的责任。当表单被释放时,表单将释放标签。

不过,话虽如此,您可以通过遍历表单的Components数组来释放它:

代码语言:javascript
复制
procedure TForm1.DeleteLabel(const LabelName: string);
var
  i: Integer;
begin
  for i := ComponentCount - 1 downto 0 do
  begin
    if Components[i] is TLabel then
      if Components[i].Name = LabelName then
      begin
        Components[i].Free;
        Break;
      end;
  end;
end;
票数 4
EN

Stack Overflow用户

发布于 2012-11-21 09:58:26

您同时为每个TLabel分配了一个Owner和一个Parent,因此从技术上讲,您根本不需要释放它们。所有者和家长都会为你处理这件事。但是,如果您想更早地释放它们,您可以遍历所有者的Components列表或父母的Controls列表,手动搜索标签。一个更好的选择是保留你自己创建的标签列表,然后你可以在需要时遍历该列表,例如:

代码语言:javascript
复制
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  ...
  private
    Labels: TList;
    procedure FreeLabels;
  ...
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Labels := TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Labels.Free;
end;

procedure TForm1.FreeLabels;
var
  I: Integer;
begin
  for I := 0 to Labels.Count-1 do
    TLabel(Labels[I]).Free;
  Labels.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lblLink : TLabel;
  ...
begin 
  ...
  for I := 0 to StringList.Count-1 do
  begin 
    lblLink := TLabel.Create(Self);
    try
      with lblLink do
      begin
        Name := 'lblLink' + IntToStr(i);
        Parent := Self;
        Caption := IntToStr(i);
        Font.Style := [fsUnderline];
        Cursor := crHandPoint;
        Color := clBlue;
        Font.Color := clBlue;
      end;
      Labels.Add(lblLink);
    except
      lblLink.Free;
      raise;
    end;
  end;
end;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13484584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档