4

Delphi 2009では、私のプロジェクトの1つに、他のいくつかのコントロールの基本クラスとして使用したいいくつかのコントロールを含むカスタムフレームがあります。このフレームをIDEウィザードとして登録して、[新しいアイテム]リストで使用できるようにします。新しく追加したアイテム(カスタムフレーム)をプロジェクトに追加すると、次のようになります。

  1. オブジェクトインスペクターでカスタムフレームに追加したすべてのプロパティとイベントを表示します。
  2. TFrameではなく、カスタムフレームから新しく作成したフレームを取得します。

わかりました。オブジェクトインスペクターにプロパティとイベントを表示するために、カスタムモジュールをIDEに登録します。フレームに対しては正しく機能しません。幸いなことに、誰かがStackOverflowでこれについて言及し、これに対する答えが与えられています。

オブジェクトインスペクターにTFrameの子孫の追加プロパティを表示する

次に、カスタムフレームのDFMをロードするために、カスタムフレームのコンストラクターにInitInheritedComponentを追加しました。このようなもの:

constructor TMyFrame.Create(AOwner: TComponent); override;
begin
  inerited;
  if (ClassType <> TMyFrame) and not (csDesignInstance in ComponentState) then
  begin
    if not InitInheritedComponent(Self, TMyFrame) then
      raise EResNotFound.CreateFmt('Resource %s not found', [ClassName]);
  end;
end;

動作しません!それでも、自分のフレームではなく、デザイナーで空のフレームが作成されます。カスタムモジュールをIDEに登録しないと、InitAliExpressComponentがなくてもフレームが正しく表示されますが、追加のプロパティはオブジェクトインスペクターに表示されません。

コンストラクターソースをこれに変更した場合(TMyFrameをTFrameに置き換える):

constructor TMyFrame.Create(AOwner: TComponent); override;
begin
  inerited;
  if (ClassType <> TFrame) and not (csDesignInstance in ComponentState) then
  begin
    if not InitInheritedComponent(Self, TFrame) then
      raise EResNotFound.CreateFmt('Resource %s not found', [ClassName]);
  end;
end;

フレームはデザイナに正しく追加され、追加のプロパティはオブジェクトインスペクタに表示されますが、フレーム上のコンポーネントがすでに存在していると文句を言うため、アプリケーションの実行は失敗します。

だから、私の質問は、DFMを使用してカスタムフレーム(フォームではない)から派生フレームを作成し、その追加のプロパティをObjectInspectorに表示するDelphiIDEウィザードを使用するためのソリューションは何ですか?

ところで、デザイン時にもコントロールを使用できるようにする必要があるため、実行時にフレームにコントロールを作成したくありません。

誰かが私にこのことを明らかにしてくれることを願っています。

よろしく

編集:

これらのフレームは、実際にはウィザードコンポーネントのページとして使用されます。ウィザードコンポーネントは実行時にそれらを作成します。「新規アイテム」メニューに、プロジェクトにウィザードページを追加し、IDEデザイナーでそのレイアウトを設計し、ウィザードに表示されるようにウィザードコンポーネントに登録するオプションをユーザーに提供してほしい。ウィザードページにはいくつかの必須コントロールといくつかのカスタムプロパティおよびイベントが必要なため、TFrameから基本クラスを継承しています。

4

5 に答える 5

4

コンポーネント開発のベースとしてTFrame(および関連する継承)を使用することをかなり広範囲に調査し、それが役立つかどうかを詳しく説明することができましたが、RegisterCustomModuleを使用する必要はありませんでした。通常のフレーム継承を使用して直接TFrameを作成し、結果の「最終」バージョンを標準のコンポーネント登録ユニットに登録します。これにより、両方の長所(ビジュアル開発+継承、およびコンポーネントパレット+オブジェクトインスペクター機能)が可能になるようです。

ただし、それにはいくつかの小さなトリックがあり、TFrame自体に名前を付ける方法、DFMファイルが最初の行で「オブジェクト」または「継承」を適切に使用していることを確認する方法など、注意すべき問題がいくつかあります。複雑な継承ツリーの安定性にとって、TFrameから継承する「ベースフレーム」を作成することは非常に有益であることがわかりましたが、それに何も追加しません...そしてそこから他のすべてを継承します。(これは、公開されたプロパティなどを追加する場合に特に当てはまるようです)。

特にIDEウィザードを使用したい理由について詳しく教えてください。もしそれがアプローチとして石に投げ込まれていなければ、私はもっと助けになるでしょう。

于 2009-06-01T22:06:36.333 に答える
1

あなたが説明したことを行うのに問題はないので、これはUpdate 3で修正された可能性があります。TFrame の子孫を作成し、2 つのプロパティ (ブール値とイベント) を追加し、パネルなどを追加しました。上記のフレームを登録した新しいパッケージを作成し、パッケージをインストールし、パッケージ パスを検索パスに追加しました。

次に、新しい vcl アプリを作成し、新しいフォームを作成し、新しいフレーム コンポーネントを追加しました。通常どおり編集可能で、オブジェクト インスペクタで両方の新しいプロパティを使用できます。

それでもうまくいかない場合は、QC 5230にリストされている回避策を見ました

于 2009-06-01T16:27:11.097 に答える
1

あなたの実際の目的を考えると、代わりに埋め込みフォームを使用することを検討しましたか? 私は、AppControls TacEmbeddedFormGreatis Form Designer ( TMS Scripter Studioとしてわずかに異なる形式でも利用可能になりました) と組み合わせて使用​​して、あなたが達成しようとしているものと同様のことをして遊んでみました。まだ何も完成していませんが、探しているランタイム カスタマイズ機能のいくつかを提供するための有望なルートのようです。

于 2009-06-02T19:25:03.040 に答える
0

私の視点から、フレームはDelphi開発者にとって非常に便利なツールになります。ただし、フレームをフォーム(または他のフレーム)に動的に配置することを強くお勧めします(たとえば、フォームデザイナーからではなくコードから)。フォーム上のフレームは情報DFMに配置されており、このような静的に配置されたフレーム内の一部のボタンを誤って移動した場合、Delphiは変更に関する情報をフォームDFMに配置します。後で実際のフレーム上のこのボタンの位置を変更しても、配置されたフレームに転送されない場合があります。

于 2009-06-01T22:22:19.513 に答える