Delphi 2009では、私のプロジェクトの1つに、他のいくつかのコントロールの基本クラスとして使用したいいくつかのコントロールを含むカスタムフレームがあります。このフレームをIDEウィザードとして登録して、[新しいアイテム]リストで使用できるようにします。新しく追加したアイテム(カスタムフレーム)をプロジェクトに追加すると、次のようになります。
- オブジェクトインスペクターでカスタムフレームに追加したすべてのプロパティとイベントを表示します。
- 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から基本クラスを継承しています。