1

現在、2 つの TLabels と 1 つの TEdit を動的に作成し、それらに LblDesc+i、EdtAmount+i、LblUnit+i という名前を付けています。ここで、i は、これら 3 つの要素を追加するたびに 1 ずつ反復する整数です。要素内のデータは、シミュレーションのみを目的としています。私の問題は、3 つのオブジェクトを削除することです。free と 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;
4

3 に答える 3

4

過去に、親のコンポーネントを設定することで解決したコンポーネントの削除に関連する問題がありましたが、デストラクタが呼び出されnilた場合、すでにその仕事をしているので、そうではありません。TControl

コンポーネントを解放するだけで、コンポーネントを削除する必要があります。

LblUnit.Free;

名前でコンポーネントを検索する必要がある場合は、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]、それに応じてインデックスを変更する必要があります。

于 2016-02-17T10:48:15.507 に答える
0

動的に作成されたコンポーネントを削除するには、それへの有効な参照が必要です。

独自の配列またはリストを編成してオブジェクトを保持したり、既存のリストを使用したりできます。たとえばForm.Components[]、所有者が であるオブジェクトを保持しますForm

2 番目のケースでは、必要なオブジェクトをFindComponent名前で検索するか、ウォークスルーComponents[]して何らかの機能 (名前、クラス タイプ、タグなど) を持つコンポーネントを検索する必要があります。

于 2016-02-17T10:53:30.117 に答える
0

最終的に機能した答えは次のとおりです。

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;
于 2016-02-17T14:19:22.070 に答える