-1

困った。ラベルオブジェクトを作成します。

var lbl:Tlabel;
begin
lbl:=TLabel.Create(nil);
....

わかりました、しかしそれを破壊した後、それはまだ形のままです。私のコードがあります:

lbl.free;
lbl := nil;

それを実行した後、コントロールはフォームにとどまります。解決策はありますか?このコンポーネントを破棄する必要があります。これはフォームから消えるはずです。ありがとう。

編集:RemoveControl(AControl:TControl); 手順が機能していません。EDIT2:

for I := 0 to 4 do begin
 lbl:=TLabel.Create(nil);
lbl.Top :=  100+z*i;
 lbl.Left := 88;
 Lbl.Width := 80;
  Lbl.Height := 14;
  lbl.Font.Size := 9;
 lbl.Caption := nm[i];
 Form1.InsertControl(lbl);

このコントロールはフォームに残ります。

4

1 に答える 1

10

コントロールを破棄することは、他のオブジェクトを破棄することと同じです。オブジェクトに対してFreeを呼び出すだけで、完了です。

問題が発生するのは、イベントハンドラーが実行されているオブジェクトでFreeを呼び出すときだけです。たとえば、そのボタンのOnClickハンドラーでボタンを解放します。このようなシナリオでは、フォームにメッセージを投稿し、キューに入れられたメッセージが処理されたときにボタンを解放する必要があります。

あなたの問題はあなたが間違ったオブジェクトでFreeを呼んでいるということです。5つのラベルを作成しましたが、そのうちの1つへの参照のみを保持しました。5つのラベルすべてを解放する必要があります。ラベル参照を保持する配列またはリストが必要になります。そうすれば、それらすべてを解放できるようになります。

フォームで配列を宣言します。

FLabels: array of TLabel;

それらを作成するとき:

SetLength(FLabels, 5);
for i := 0 to high(FLabels) do
begin
  FLabels[i] := TLabel.Create(Self);
  .......
end;

このように破壊します:

for i := 0 to high(FLabels) do
  FLabels[i].Free;
FLabels := nil;

あなたのためのいくつかの一般的なアドバイス。問題に直面したときは、それを単純化してください。複数のコントロールを使用してオブジェクトの破棄をデバッグしようとするのはなぜですか?空のアプリを作成し、単一のコントロールを追加します。次に、その単一のコントロールを削除してみてください。次に、複数のコントロールに移動します。複雑なバージョンのトラブルシューティングは行わず、常に単純化するようにしてください。

于 2013-01-26T14:43:09.150 に答える