【问题标题】:Delete TLabel created in run-time删除运行时创建的 TLabel
【发布时间】:2012-11-09 04:36:26
【问题描述】:

如何删除创建的标签。我试过FindComponent 但失败了,我该怎么办?我应该在那里设置其他组件的父组件,如 TPanel 还是什么?

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;

【问题讨论】:

  • 我认为 FindComponent 没有理由找不到您的标签,您是否传递了像“lblLink0”这样的名称?
  • 是的,但这是个坏主意!因为标签的数量取决于stringtList 的数量,它肯定是不稳定的

标签: delphi runtime vcl


【解决方案1】:

您为每个TLabel 分配了OwnerParent,因此从技术上讲,您根本不需要释放它们。业主和家长都会为您处理。但是,如果您想提前释放它们,您可以遍历 Owner 的 Components 列表或 Parent 的 Controls 列表,手动寻找标签。更好的选择是保留您自己创建的标签列表,然后您可以在需要时遍历该列表,例如:

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;

【讨论】:

    【解决方案2】:

    您不必释放它。您有责任通过lblLink := TLabel.create(self); 将其释放给表单。当表单被释放时,表单将释放标签。

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

    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;
    

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 2016-05-29
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        • 2017-12-16
        • 1970-01-01
        相关资源
        最近更新 更多