delphi TFrameにパラメーターを渡す
-
03-07-2019 - |
質問
シングルトンとグローバル変数を避けるために、TFrameコンポーネントにパラメーターを渡すことができるようにしたいと思います。ただし、TFrameは通常デザイン時にフォームに含まれているため、デフォルトのコンストラクターのみを使用できます。
もちろん、TFrameが作成された後、親フォームはOnCreateコールバックでいくつかのプロパティを設定できます。ただし、これはプロパティが忘れられないことを保証するものではなく、依存関係はコンストラクタを使用するほど明確ではありません。
dfmファイルの読み取り中にコンポーネントを作成するためのファクトリを登録できると便利です。次に、ファクトリによって作成されたときに、必要なパラメータをTFrameコンストラクタに渡すことができます。これを達成する方法はありますか?
または、TFrameにパラメーターを渡す方法について、より良い解決策がありますか?
解決
TFrame
の子孫を含むすべてのコンポーネントは、 TComponent
から継承したコンストラクターを使用して構築できる必要があります。そうしないと、設計時に適切に使用できません。設計時の使用の制限が許容できる場合、そのコンストラクタをオーバーライドして例外を発生させることができます。これにより、設計時にコンポーネントがフォームに配置されなくなります。他のパラメーターを必要とする他のコンストラクターを提供するだけです。
設計時の要件のため、すべてのコンポーネントは、プロパティの一部またはすべてがデフォルト値のままで存在できる必要があります。それは、コンポーネントがその状態にある間に有用なことをしなければならないという意味ではありませんが、コンポーネントはその状態に無期限に留まることができる必要があります。たとえば、コンポーネントをフォームに配置し、フォームを保存し、Delphiを閉じても、後でフォームの設計を再開することは問題ありません。コンポーネントは、そのすべてのプロパティがまだ最終使用のためにセットアップされていない場合でも、それ自体を保存および復元できるようにする必要があります。
私の優先オプションは、実行時にのみコンポーネントのルールを強制することです。プロパティを使用する前に、すべてのプロパティが適切な値に設定されていることを確認してください。アサーションを使用して、コンポーネントを適切に使用することができます。フォームのコンポーネントの設定が完了していない場合、クラスの消費者はすぐに学習します。
他のヒント
通常は、非仮想のパブリックな「初期化」を追加します。または(アメリカ人に初期化)すべてのパラメーターを提供する必要がある手順。これにより、プロパティが設定されます。
可能な場合、プロパティを保護またはプライベートにします。そのため、プロパティを設定する唯一の方法は、Initialise(AFoo、ABar:integer)を呼び出すことです。
TFormXXX.FormCreateまたはTformXXX.Createには、次のものがあります。
inherited;
Initialise(foo, bar);
独自のtFrameコンポーネントを作成/登録し、 それをフォームに配置します-作成したものは何でも渡すことができます。
ファクトリーが必要なパラメーターを提供できる場合、フレームのデフォルトコンストラクターをオーバーライドして、ファクトリークラスにパラメーターを要求してみませんか?
通常、独自のコンストラクタを作成します。とにかくデザインタイムにフレームを作成するのは好きではありません。
a)必要なときにフレームを動的に作成し、不要なときにフレームを破棄できます
b)フレームにパラメータデータ型またはデータ構造のいずれかのパブリックプロパティを与え、そのプロパティを通じてフォームに値を渡します。
例:
TAddress
-住所の通常の要素を保持するクラス。
TAddressFra
-住所を表示するための視覚的なコントロールを備えたフレーム
-
TAddress
のインスタンスに値を入力します -
TAddressFra
のインスタンスを作成します
-
TAddressFra.address
プロパティにTAddress
インスタンスを割り当てます -
setAddress(o_address:TAddress)
プロシージャを使用して、TAddress
属性の値をTAddressFra