それらを構築するために:「TComponentのAOwnerを」なぜ、いくつかのデルファイコンポーネントが必要ですか?
質問
いくつかの種類のオブジェクトをインスタンス化するために所有者としてTComponentのを必要とするように完全に無関係と思われます。なぜこれが必要なので、多くのDelphiのコンポーネントがあるのですか?
例えば、にTXMLDocumentをインスタンス化するTComponentのオブジェクトを必要とする。
なぜ?これは正当な理由があるのならば、私は「正しいことを行う」ためにそこに何を使用する必要があります。
解決
所有者コンポーネントはすべてその所有コンポーネントを管理することになっています。所有者が破壊されたときに所有コンポーネントが自動的に破棄されます。
これはちょうど、ツールパレットからコンポーネントをドラッグし、フォーム上にドロップし、ちょうど彼の作品は、部品の寿命を管理する心配をせずに行わ取得するためにイベントをフックし、開発者を支援します。
の形式は、すべてのコンポーネントの所有者がそれに滴下します。アプリケーションオブジェクトは、フォームの所有者です。アプリケーションが閉じているときにアプリケーションオブジェクトが順番にフォームとすべてのコンポーネントを破壊する破壊されます。
しかし、コンポーネントが作成されたときに所有者が本当に必要ではありません。あなたはパラメータに無記号を渡すと、コンポーネントは、所有者なしで作成され、この場合には、コンポーネントの寿命を管理する責任となります。
他のヒント
すべてのTComponentのの子孫が所有者を必要とし、それがTComponentのコンストラクタで定義されています。 所有者のコンポーネントは、すべての所有コンポーネントを破壊する責任があります。
あなたが人生の時間を制御したい場合、あなたはパラメータとしてnilを渡すことができます。
ただ、いくつかの余分な情報を追加します。
各コントロールは、親を持っています。 (のTWinControl)。所有者が生涯の世話をする場合は、親オブジェクトを示すの世話をする。
例えばフォームは、パネルを有し、パネルボタンを有しています。その場合には、フォームは、パネルとボタンを所有しています。しかし、フォームは、パネルとパネルの親が、ボタンの親です。
注意すべき何か他のものもあります。私は作成のコンストラクタに渡されている所有者のコンポーネントにを依存しているサードパーティのコンポーネントのカップルよりも多くを使用している、とあなたは無記号に渡すと例外/ AVがスローされます。
最終的な結果は、あなたがIDEでの視覚を使用していますが、それらは実行時に作成されたときに問題が発生したときにこれらのコンポーネントが正常に動作するということです。
これらの問題の原因は感覚、悪いデザインで、あります。何もルールの状態であなたは/ aOwnerパラメータとしてNILを渡していないべきではないことはできません。
オブジェクトはののTComponentのがAOwnerとして渡すことを必要としません。あなたは簡単にこれにnilを渡すと破壊を自分で処理することができます。ほとんどの場合、私が使用している部品は、現在のメソッドの外で使用されることはありませんローカライズされたルーチンで、この技術を使用する傾向があります。例えばます:
Procedure TForm1.Foo;
var
XmlDoc : tXmlDocument;
begin
XmlDoc := tXmlDocument.Create(nil);
try
// do processing of the XMLDoc here
finally
FreeAndNil(XmlDoc);
end;
end;
あなたは二つの理由のためにこれを使用しshoudl: - 所有権のメカニズムは、ごみ収集システムの一種としてもスタンド - 所有権機構(Stream.ReadComponent / WriteComponentなど)Delphiのシリアル化プロセスにおいて重要である
。TComponent
コンストラクタのパラメータであるとして Ownerパラメータのみが、子孫TForm
のために必要とされています。全てTFrame
上に落下するため、設計時にアクセス可能な構成要素、TDataModule
、及びTXMLDocument
クラスは<=>(<=>含む)の子孫である。