4

作成したラベルを削除する方法。やってみ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;
4

3 に答える 3

10

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;
于 2012-11-21T00:46:28.870 に答える
4

解放する必要はありません。でフォームに解放する責任を与えました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;
于 2012-11-21T00:47:01.147 に答える
3

anOwnerと a の両方Parentを eachTLabelに割り当てたので、技術的にはそれらを解放する必要はまったくありません。所有者と親の両方がそれを処理します。ただし、以前にそれらを解放したい場合は、所有者のComponentsリストまたは親の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;
于 2012-11-21T01:58:26.163 に答える