2016-09-03 3 views
3

私はTObjectListを使ってラベルの特定のリストを処理します。しかし、私が推奨する.Free in Try Finalを行うと、リストからコントロールも削除されます。なぜTObjectListを解放するとコントロールも削除されますか?

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; 

私はこのコードを実行し、私は不足しているラベルコントロールで終わる - 彼らは、フォームから削除され、デバッグに私はコントロールが皆無であることを参照してください。

私はそうではありません。無料TObjectList?どのようにしてTObjectlistを解放し、コントロールを保持することができますか?

答えて

10

TObjectListは、OwnsObjectsプロパティを持ちます。これはデフォルトでTrueです。あなたがそれを解放する前にある時点でそれを変更しなければ、それはそれが含んでいるオブジェクトを解放します。あなたがそれを望まないなら、OwnsObjectsFalseに設定してください。あなたがTObjectListTList<TObject>との差につまずい

vHeaderLabelsList := TList<TLabel>.Create; 
+0

いいえ、それぞれのラベルに同じコードをコピーしないようにするには、そのリストのみが必要です。 –

9

:あなたはTObjectListをによって(クリーンアップ)が所有するオブジェクトを必要としない場合、単に代わりTListのを使う方が良いでしょう

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

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

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

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

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

SO :-)に突入する前に何か不測の事態が発生したときは、実際にはhttp://docwiki.embarcadero.comをチェックしてください。

+3

'OwnsObjects'プロパティも持つ' TObjectList'の非ジェネリック版もあることに注意してください。また、 'TStringList'は' Objects [] 'プロパティのエントリの' OwnsObjects'プロパティも持っています。 –

+0

私は文書を読んだが、otがその仕事をするべきであることを知るだけである。明らかに私はさらに読んでくれる。 –

+0

ただし、TObjectList のドキュメントはこの* capability *を識別しますが、ctorパラメータでオンまたはオフにすることのみがデフォルトで有効になっているかどうかはわかりません。書かれているように、* Create *コンストラクター参照を個別に個別にチェックして指定されていない場合は、上記のパラメーターがTRUEであることを発見しない限り、ドキュメントは*デフォルト*動作であると考える理由がありません。対照的に、** Contnrs.TObjectList **ドキュメント*は、これがデフォルトの動作であることを明確にしています。 FMがFUのときは "RTFM"に失敗します。 :) – Deltics

関連する問題