TCustomPanel上に動的生成したTPanelにコンポーネントを表示させるには?

解決


かふぇ  2006-10-11 22:34:32  No: 23562

以前、TCustomPanelから派生したコンポーネントを作成したかふぇです。
内部でTPanelを動的生成して、実際使って見るところで不具合が発生してしまいました。

作成コンポーネント上に他に作成したコンポーネントを載せた場合は
ちゃんと動作しているのですが、普通のTLabelとかを乗せると
フォームデザイナ上では表示されるのに、実行させると消えてしまいます。
(*.dfmファイルにも"object TLabel"が追記されません。)

いろいろいじってみたら次のことが分かりました。

TCustomPanel上にTLabelを載せた場合、ちゃんと動作。
TPanel上にTLabelを載せると消えてしまう。

作成コンポーネントのコンストラクタ内は次のようになっております。

  // 内部パネルの作成
  _InnerPanel :=TPanel.Create(Self);
  _InnerPanel.Parent := Self;
  _InnerPanel.BevelOuter := bvNone;

TLabelが消えてしまった後、作成コンポーネントをフォームデザイナ上で
クリックするとたまに「コントロール''は親ウィンドウを持っていません」
というエラーがでてきます。

何か_InnerPanel に対して行なわなければいけないこととかあるのでしょうか?

以上ですが、宜しくお願いします。


かふぇ  2006-10-11 23:25:41  No: 23563

解決しました。ためしに

_InnerPanel.Parent := Self;

_InnerPanel.Parent := Self.Parent;
にしたらちゃんと動作するようになりました。

でも何故なのかは理解できていないのでこの先はしっかり
調べてみたいと思います。

ふぅ、ひとまず一安心だ。

お騒がせしました。 m(__)m


根本的に  2006-10-12 06:39:47  No: 23564

解決ではないでしょう。

_InnerPanel.Color := clRed;

あたりを、記述してみそ。

きっと素敵な結果になるはず。

ちなみに、_InnerPanelの存在理由は?

このような、TPanelが多重に重なったコンポーネントで、デザイン時にさらにコンポーネントを貼り付けたりするには、dfmに書き出したり、読み込んだりできる機能を、
自分で実装しないといけないのでは?

ちなみに、実行時に消えるのは、_InnerPanelが、dfmに書き出しされないから、
_InnerPanel上に乗ったLabelも、書き出しされず、存在が失われるため。
_InnerPanel以外の部分では、TCustomPanelから派生したコンポーネント(以降 TMyPanelと書きます)に
直接貼り付けられるから、dfmに書き出されて、正常になる。
また、_InnerPanel.Parent := Self.Parent;
で、うまくいくのは、_InnerPanel.Color := clRed; を実行してみたらわかると思うけど、
ParentがTMyPanelと同じなることで、dfmへの書き出しが行われるからか、
または、TMyPanel上にTLabelが乗っかることで、通常の動作と同じになるため。

そんなわけで、
> ふぅ、ひとまず一安心だ。
なんてことは、ないと思います。
動いていると思っても、いずれどこかで挙動不審になるでしょう。


かふぇ  2006-10-12 20:39:03  No: 23565

コメントありがとうございます。

> 解決ではないでしょう。
> ParentがTMyPanelと同じなることで

実はこの後、これに気がつきまして、駄目じゃんと一人しぼんでました。

> ちなみに、_InnerPanelの存在理由は?

_InnerPanelをメインのパネルとして使用します。
TMyPanel上で、_InnerPanelで隠れていない部分を指定ビットマップで塗りつぶしています。

> dfmに書き出したり、読み込んだりできる機能を・・・

これをなんとか探して見たいですね。と思ったら良さそうなサンプルが
見つかりました。

http://www2c.airnet.ne.jp/sone/
の「Panel & Group」にある「スリーペイン作成パネル」ですが、
_InnerPanel生成時に親の TFormDesigner を通して生成しています。

これを試して見ますね。


かふぇ  2006-10-13 00:45:02  No: 23566

どうもTFormDesignerはバージョン3までのようで、その後、IFormDesignerに置き換わり、その後の消息がつかめませんでした。

また何か分かりましたら追記させてもらいますね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加