3

シングルトンとグローバル変数を避けるために、パラメータを TFrame コンポーネントに渡せるようにしたいと考えています。ただし、TFrame は通常、設計時にフォームに含まれるため、デフォルトのコンストラクタしか使用できません。

もちろん、TFrame が作成された後、親フォームは OnCreate コールバックでいくつかのプロパティを設定できます。ただし、これはプロパティが忘れられないことを保証するものではなく、依存関係はコンストラクターを使用するほど明確ではありません。

dfm ファイルの読み取り中にコンポーネントを作成するためのファクトリを登録できると便利です。次に、ファクトリによって作成されたときに、必要なパラメーターを TFrame コンストラクターに渡すことができます。これを達成する方法はありますか?

または、パラメータを TFrame に渡す方法について、より良い解決策を持っている人はいますか?

4

5 に答える 5

4

の子孫を含むすべてのコンポーネントは、TFrameから継承されたコンストラクターを使用して構築できる必要がありますTComponent。そうしないと、設計時に適切に使用できません。設計時の使用の制限が許容できる場合は、そのコンストラクターをオーバーライドして例外を発生させることができます。これにより、コンポーネントが設計時にフォームに配置されなくなります。他のパラメーターを必要とする他のコンストラクターを提供するだけです。

設計時の要件のため、すべてのコンポーネントは、一部またはすべてのプロパティが既定値のままで存在できる必要があります。これは、コンポーネントがその状態にある間、有用なことをしなければならないという意味ではありませんが、無期限にその状態にとどまることができる必要があります。たとえば、コンポーネントをフォームに配置し、フォームを保存し、Delphi を閉じて、後でフォームの設計を再開することは問題ありません。コンポーネントは、そのすべてのプロパティがまだ最終的な使用のために設定されていない場合でも、それ自体を保存および復元できるようにする必要があります。

私の好みのオプションは、コンポーネントのルールを実行時にのみ適用することです。プロパティの使用を許可する前に、すべてのプロパティが適切な値に設定されていることを確認してください。アサーションを使用して、コンポーネントの適切な使用を強制できます。クラスのコンシューマーは、フォーム上でコンポーネントのセットアップを完了していない場合、すぐに学習します。

于 2009-03-05T18:37:24.070 に答える
1

私は通常、すべてのパラメータを提供する必要がある公開された非仮想の「初期化」または(アメリカ人に初期化)手順を追加します。これにより、プロパティが設定されます。

可能な場合は、プロパティを保護またはプライベートにしてください。設定できる唯一の方法は、Initialise(AFoo, ABar : integer) を呼び出すことです。

次に、TFormXXX.FormCreate または TformXXX.Create に次のように記述します。

inherited;
Initialise(foo, bar);
于 2009-03-06T02:54:58.240 に答える
0

a)フレームは、必要なときに動的に作成し、不要なときに破棄することができます

b)パラメータデータ型またはデータ構造のいずれかを使用してフレームにパブリックプロパティを与え、プロパティを介して値をフォームに渡します。

例:
TAddress-アドレスの通常の要素を保持するクラス。
TAddressFra-アドレスを表示するためのビジュアルコントロールを備えたフレーム

  • のインスタンスにTAddress値を入力します
  • のインスタンスを作成しますTAddressFra
  • TAddressFra.addressプロパティをTAddressインスタンスに割り当てます
  • 手順setAddress(o_address : TAddress)を使用して、属性の値をTAddress上の対応するビジュアルコンポーネントに割り当てます。TAddressFra
于 2010-05-02T05:19:12.527 に答える