3

TObjectList を使用して、ラベルの特定のリストを処理します。しかし、Try Final で推奨される .Free を実行すると、リストからコントロールも削除されます。

3 つのラベルを使用した簡単な例:

Procedure GetHeaderLabels(var aList:TObjectList<TLabel>);
begin
  aList.Add(Form1.lblHeaderCars);
  aList.Add(Form1.lblHeaderBrands);
  aList.Add(Form1.lblHeaderModels);
end;

procedure TForm1.Button1Click(Sender: TObject);
var vHeaderLabelsList:TObjectList<TLabel>;
begin
  vHeaderLabelsList:=TObjectList<TLabel>.Create;
  try
     GetHeaderLabels(vHeaderLabelsList);
      {... process Header Labels }
  finally
    vHeaderLabelsList.Free;
  end;
end;

この場合、このコードを実行すると、ラベル コントロールが欠落してしまいます。フォームから削除され、デバッグでコントロールが nil であることがわかります。

TObjectList を .Free にするべきではないのでしょうか? TObjectlist を解放し、コントロールを保持するにはどうすればよいですか?

4

2 に答える 2

10

TObjectListにはOwnsObjectsプロパティがあり、デフォルトでは ですTrue。解放する前のある時点でそれを変更しないと、含まれているオブジェクトが解放されます。それを望まない場合は、 に設定OwnsObjectsしてFalseください。

vHeaderLabelsList := TObjectList<TLabel>.Create(False);

TObjectList が所有する (クリーンアップされる) オブジェクトが必要ない場合は、代わりに TList を使用することをお勧めします。

vHeaderLabelsList := TList<TLabel>.Create;
于 2016-09-03T02:20:50.303 に答える
9

と の違いにつまずきましTObjectListTList<TObject>

はリスト内のTObjectListオブジェクトを「所有」します。つまり、デフォルトでは、オブジェクトがリストから削除されるか、リスト自体が破棄されると、そこに含まれるすべてのオブジェクトが破棄されます。
これが発生したくない場合は、項目をリストに追加する前に、を使用するか、を false にTList<TObject>設定します。 これは通常、コンストラクターで行われますが、後で設定することもできます。OwnsObjects

これはすべて、ドキュメントに明確に示されています。

エントリが所有されている場合、エントリ オブジェクトがリストから削除されると、エントリ オブジェクトは解放されます。

OwnsObjects プロパティは、オブジェクトの所有権を取得または設定します。

SOに急ぐ前に何か予期しないことが起こった場合は、 http: //docwiki.embarcadero.comをチェックしてください:-)。

于 2016-09-03T02:22:48.843 に答える