以前、TCustomPanelから派生したコンポーネントを作成したかふぇです。
内部でTPanelを動的生成して、実際使って見るところで不具合が発生してしまいました。
作成コンポーネント上に他に作成したコンポーネントを載せた場合は
ちゃんと動作しているのですが、普通のTLabelとかを乗せると
フォームデザイナ上では表示されるのに、実行させると消えてしまいます。
(*.dfmファイルにも"object TLabel"が追記されません。)
いろいろいじってみたら次のことが分かりました。
TCustomPanel上にTLabelを載せた場合、ちゃんと動作。
TPanel上にTLabelを載せると消えてしまう。
作成コンポーネントのコンストラクタ内は次のようになっております。
// 内部パネルの作成
_InnerPanel :=TPanel.Create(Self);
_InnerPanel.Parent := Self;
_InnerPanel.BevelOuter := bvNone;
TLabelが消えてしまった後、作成コンポーネントをフォームデザイナ上で
クリックするとたまに「コントロール''は親ウィンドウを持っていません」
というエラーがでてきます。
何か_InnerPanel に対して行なわなければいけないこととかあるのでしょうか?
以上ですが、宜しくお願いします。
解決しました。ためしに
_InnerPanel.Parent := Self;
を
_InnerPanel.Parent := Self.Parent;
にしたらちゃんと動作するようになりました。
でも何故なのかは理解できていないのでこの先はしっかり
調べてみたいと思います。
ふぅ、ひとまず一安心だ。
お騒がせしました。 m(__)m
解決ではないでしょう。
_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が乗っかることで、通常の動作と同じになるため。
そんなわけで、
> ふぅ、ひとまず一安心だ。
なんてことは、ないと思います。
動いていると思っても、いずれどこかで挙動不審になるでしょう。
コメントありがとうございます。
> 解決ではないでしょう。
> ParentがTMyPanelと同じなることで
実はこの後、これに気がつきまして、駄目じゃんと一人しぼんでました。
> ちなみに、_InnerPanelの存在理由は?
_InnerPanelをメインのパネルとして使用します。
TMyPanel上で、_InnerPanelで隠れていない部分を指定ビットマップで塗りつぶしています。
> dfmに書き出したり、読み込んだりできる機能を・・・
これをなんとか探して見たいですね。と思ったら良さそうなサンプルが
見つかりました。
http://www2c.airnet.ne.jp/sone/
の「Panel & Group」にある「スリーペイン作成パネル」ですが、
_InnerPanel生成時に親の TFormDesigner を通して生成しています。
これを試して見ますね。
どうもTFormDesignerはバージョン3までのようで、その後、IFormDesignerに置き換わり、その後の消息がつかめませんでした。
また何か分かりましたら追記させてもらいますね。
ツイート | ![]() |