私からのさらに別のTFrame IDE登録コンポーネントに関する質問です。すべての助け、仲間のプログラマーに感謝します。TFrameの継承リファクタリング
細目:
基本的に、私は私がIDEに登録したTFrameのベースのコンポーネントを持っており、それは素晴らしい仕事をしている:DarrianのTFrameの継承提案hereで遊ん)
。私は現在、既存のコンポーネントの非ビジュアルな機能とプロパティの大部分を共有するいくつかの "姉妹"コンポーネントを開発しています。それで、多くのものを親/スーパークラスに移動して、新しいコンポーネントと古いコンポーネントの両方を継承することは意味があります。
TFrameの継承をこのように「リファクタリングする」ための最良の方法は何ですか? (これはTFormクラスの子孫にも当てはまるかもしれませんが)。注意すべき点と注意点は何ですか?
例:私が試した
、例えば、その上に何もない、新しいのTFrameを作成し、そのフレームTMyBaseFrameを呼び出します。その後、既存のコンポーネントのクラス定義を修正して(それをTMyFrameTreeViewと呼ぶ)、TFrameではなく継承するようにしました。
これはうまくコンパイルされましたが、フォームにドロップしようとすると「ClientHeight not found」(または「ClientHeightプロパティが見つかりません」)が表示され、フォームにドロップされませんでした。関連するDFMからClientHeightとClientWidthを削除すると、やはりサイズ変更時に置き換えられてしまいました。私は子孫クラスでExplicitHeightとExplicitWidthに気付き、継承された値からのプロパティ値のオーバーライドに関係していると思っていますが、わかりません。 New - > Inherited Itemsを介してまったく新しいフレームを再作成し、すべてをコピーしてもまだ大きな結果は得られていません。
最後の注意
私は私が全体的な「ものを求めている理由の一部である....など、これはストリーミングDFMファイルと子孫の複数世代で、すぐに散らかっ得ることができます実現"概念的な側面を見ているだけでなく、具体的な現実世界にもの問題のバージョンを与える(私にはそう思われる、実行可能でなければならない)。
私は学習の試みをハックするための小さなテストパッケージを作成しましたが、多大な学習をしていますが、遅いですし、Delphi "Jedi Masters"のガイダンス/ 。 :)
回答アップデート以降:
以下の回答の両方が有用でした。同様に、通常のTFrameからの変更がない「ベースフレームクラス」を作成し、プロパティ、メソッドなどを追加する前にそれを継承して継承ストリーミングを安定化させるように思われます。理由は分かりませんが、これまでのところあります。 TMyBaseFrame
inherited
にobject
からTMyFrameTreeView
ためのDFMファイルの最初の単語を変更するTMyFrameTreeView
の基本クラスを変更することに加えて
これまでのところ、「TBaseFrameを完全に空にする」ことは、ほとんど問題を避けるための鍵です。また、DFMファイルが、後のクラスで「オブジェクト」ではなく「継承」で始まることを確認します。あなたのデコレータのアイデアについても考えています - それに感謝します! – Jamo
"TBaseFrameを完全に空にしておくことは、ほとんど問題を回避するための鍵です" - そうです。これは「設計上」(IOWは変わらない)であることを覚えておいてください。デルファイは柔軟になっていなければなりません。だから私が言ったように安全です。 –
あなたのアイデアをありがとう:上記のデコレータアプローチなど – Jamo