4

私からのさらに別の TFrame IDE 登録コンポーネントの質問です。助けてくれてありがとう、仲間のプログラマー。: )

ここでダリアンの TFrame 継承の提案をいじってみましょう:

仕様:

基本的に、私は IDE に登録した TFrame ベースのコンポーネントを持っていますが、それは素晴らしく機能しました。私は現在、既存のコンポーネントの非ビジュアル機能とプロパティの大部分を共有するいくつかの「姉妹」コンポーネントを開発しています。したがって、その多くを、新しいコンポーネントと古いコンポーネントの両方が継承できる親/スーパークラスに移動することは理にかなっています。

このようにTFrameの継承を「リファクタリング」する最良の方法は何ですか? (これは TForm クラスの子孫にも当てはまるかもしれませんが、確かではありません)。注意点や注意点は?

例:

たとえば、何もない新しい TFrame を作成し、そのフレーム TMyBaseFrame を呼び出してみました。次に、既存のコンポーネント (TMyFrameTreeView と呼びましょう) のクラス定義を、TFrame ではなくそれから継承するように変更しました。

正常にコンパイルされましたが、フォームにドロップしようとすると、「ClientHeight not found」(または「ClientHeight property not found」) が表示され、フォームにドロップされませんでした。関連する DFM から ClientHeight と ClientWidth を削除すると大混乱が生じ、いずれにせよサイズ変更時に置き換えられました。子孫クラスの ExplicitHeight と ExplicitWidth に気付き、継承された値からのプロパティ値のオーバーライドに関連していると考えていますが、よくわかりません。New -> Inherited Items を介してまったく新しいフレームを再作成し、すべてをコピーしても、まだ良い結果が得られていません。

ファイナルノート

これは、DFM ファイルのストリーミングや複数世代の子孫などで、すぐに厄介になる可能性があることを理解しています....これが、全体的な「注意すべきこと」の概念的な側面を求めている理由の一部ですが、特定の問題の現実世界のより単純なバージョンも同様です(私には、実行可能なはずです)。

学習の試みでハックするための小さなテスト パッケージを作成し、多くのことを学んでいますが、それはゆっくりと進んでおり、Delphi の「ジェダイ マスター」からのガイダンス/洞察は、最も高く評価されます。: )



回答の更新は後で:

以下の両方の回答が役に立ちました。同様に、通常の TFrame からの変更がない「ベース フレーム クラス」を作成し、プロパティやメソッドなどを追加する前にそれを継承すると、継承ストリーミングが非常に安定するようです。理由はわかりませんが、これまでのところそうです。

4

2 に答える 2

12

の基本クラスを変更することに加えてTMyFrameTreeViewTMyBaseFramedfm ファイルの最初の単語をTMyFrameTreeViewからobjectに変更しますinherited

于 2009-02-26T05:03:21.807 に答える
4

私は現在、既存のコンポーネントの非ビジュアル機能とプロパティの大部分を共有するいくつかの「姉妹」コンポーネントを開発しています。したがって、その多くを、新しいコンポーネントと古いコンポーネントの両方が継承できる親/スーパークラスに移動することは理にかなっています。

このようにTFrameの継承を「リファクタリング」する最良の方法は何ですか?

上記のテキストの要点は、おそらく「コンポーネントの非視覚的機能」です。したがって、この場合、ビジュアル レイヤーと非ビジュアル レイヤーを分離するのが最善です。

したがって、おそらくデコレータを使用する方が良いでしょう:

TMySharedEngine = class(Whatever)
property LinkedFrame: TFrame;
property P1;
property P2;
...
procedure Proc1;
procedure Proc2;
... //etc.
end;

そして、「姉妹」フレームでそのインスタンスを使用します:

var
TMyFrame1 = class(TFrame)
...
FDecorator: TMySharedEngine;
  ...
  public
  property MySharedPart: TMySharedEngine read FDecorator;
  constructor Create(AOwner: TComponent); override;
  ...
end;

constructor TMyFrame1.(AOwner: TComponent); override;
begin
  inherited;
  FDecorator:=TMySharedEngine.Create; //ok, ok do not forget to Free it .Destroy
  FDecorator.LinkedFrame:=Self;
  ...
end;

OTOH、アプローチを使用する場合は、Visual Form Inheritance (Darian が提案したように) または (より柔軟に) 手動で行うことができます: IDE を使用して次のフレームを作成します: TBaseFrame、TChildFrame1、TChildFrame2 ... など次に TChildFrame1 のユニットに進み、そのクラス定義を TChildFrame1 = class(TFrame) から TChildFrame1 = class(TBaseFrame) に手動で変更します。コンパイル。それはうまくいくはずです。ただし、このトリックを実行するときは、TBaseFrame を空にして、可能性のある小さな癖 (機能の衝突など) を回避することをお勧めします。

HTH。

于 2009-02-26T08:26:01.787 に答える