ある種のオブジェクトをインスタンス化するために所有者として TComponent を要求することは、まったく無関係に思えます。これを必要とする Delphi コンポーネントが非常に多いのはなぜですか?
たとえば、TXMLDocument をインスタンス化するには、TComponent オブジェクトが必要です。
これはなぜですか? 正当な理由がある場合、「正しいことを行う」ために何を使用すればよいですか?
所有者コンポーネントは、所有するすべてのコンポーネントを管理することになっています。所有者が破棄されると、所有されているコンポーネントは自動的に破棄されます。
これは、コンポーネントをツール パレットからドラッグしてフォームにドロップし、イベントをフックするだけで、コンポーネントの有効期間の管理を気にせずに作業を完了できる開発者に役立ちます。
フォームは、ドロップされたすべてのコンポーネントの所有者です。Application オブジェクトはフォームの所有者です。アプリを閉じると、Application オブジェクトが破棄され、フォームとすべてのコンポーネントが破棄されます。
しかし、コンポーネントが作成されるとき、所有者は実際には必要ありません。パラメータに Nil を渡すと、コンポーネントは所有者なしで作成されます。この場合、コンポーネントの有効期間を管理するのはあなたの責任です。
すべてのTComponentの子孫には所有者が必要であり、TComponentコンストラクターで定義されます。所有者コンポーネントは、すべての所有コンポーネントを破棄する責任があります。
寿命を制御したい場合は、パラメータとしてnilを渡すことができます。
Just to add some extra information.
Each control also has a parent. (A TWinControl). Where the owner takes care of the lifetime, the parent takes care of showing the object.
For example a form has a panel and the panel has a button. In that case, the form owns the panel and the button. But the form is the parent of the panel and the panel is the parent of the button.
また、他にも注意すべき点があります。Constructor Create で渡される Owner コンポーネントに依存するサードパーティ コンポーネントをいくつか使用しましたが、Nil を渡すと例外/AV がスローされます。
最終的な結果として、これらのコンポーネントは、IDE 内で視覚的に使用すると問題なく動作しますが、実行時に作成すると問題が発生します。
これらの問題の原因は、ある意味で設計の悪さです。ルールには、aOwner パラメーターとして NIL を渡すことができない/渡すべきではないと述べているものはありません。
これを使用する理由は 2 つあります。 - 所有メカニズムは、一種のガベージ コレクション システムとしても機能します。 - 所有メカニズムは、Delphi シリアライゼーション プロセス(Stream.ReadComponent/WriteComponent など)で重要です。
Owner パラメーターは、コンストラクターTComponent
のパラメーターであるため、子孫にのみ必要です。、、およびクラスTComponent
にドロップするために設計時にアクセスできるすべてのコンポーネントは、子孫 ( を含む) です。TForm
TFrame
TDataModule
TComponent
TXMLDocument