継承について


りり  2007-05-31 22:20:54  No: 26440  IP: 192.*.*.*

今、TCustomEditを継承したBaseEditを作成して、
さらにその数値型のみ入力可能な派生クラスNumEditを作成しています。
そのNumEditでは、テキスト位置の右つめを行っていて、さらにオブジェクトインスペクタへ表示しています。
そのNumEditのオブジェクトインスペクタ上でそのプロパティを右寄せにするとデザイナには右寄せになるのですが、実行時に左寄せにもどされてしまいます。

この右寄せ処理は、MyEditでCreateParamメソッドをオーバーライドして行っています。
デバックで追いかけてみると、最初の1回目では右寄せにしているのですが、CreateParamメソッドが2回走り、また左寄せ処理が走ってしまいます。
ちなみにinherited は先に実行しています。
原因が全く分かりません。

TCustomEdit→MyEdit→NumEditと普通に継承しただけなので、
MyEditの機能はNumEditも使えると考えているのですが
そもそもそこからいけないのでしょうか?

初心者なので、全く理解できないかもしれませんが、
お願いします。

編集 削除
りり  2007-05-31 22:22:53  No: 26441  IP: 192.*.*.*

この右寄せ処理は、MyEditでCreateParamメソッドをオーバーライドして行っています。
デバックで追いかけてみると、最初の1回目では右寄せにしているのですが、CreateParamメソッドが2回走り、また左寄せ処理が走ってしまいます。
ちなみにinherited は先に実行しています。
原因が全く分かりません。

TCustomEdit→MyEdit→NumEditと普通に継承しただけなので、
MyEditの機能はNumEditも使えると考えているのですが
そもそもそこからいけないのでしょうか?



MyEditではなく、BaseEditでした。
すみません。

編集 削除
りり  2007-06-01 10:21:30  No: 26442  IP: 192.*.*.*

コンストラクタで再生成してやると、プロパティの変更が反映されました。
継承元がTEditでは派生クラスのコンストラクタで再生成しなくても反映されますが、TCustomEditを継承した場合は、派生クラスのコンストラクタで再生成してやらないと反映されません。

編集 削除
ん?  2007-06-01 11:00:51  No: 26443  IP: 192.*.*.*

右寄せの有無が切り替わった時点で、ウインドウハンドルは、再生成する必要があります。
RecreateWndを実行しておけばいいんでしょう。
CreateParamで、どのような方法で、右寄せの有無を判断しているのかわかりませんが、
右寄せ判定を一回限りしか行わないのであれば、ウインドウハンドルは何度も
再生成される可能性があるため、どこかで右寄せが左寄せに戻る可能性があるかと思います。

編集 削除
みんみん  2007-06-01 23:01:07  No: 26444  IP: 192.*.*.*

同じ状況を再現しようと思いましたが、私の環境では
継承したEditも設計時、実行時ともに右寄せを保っていますし
実行時のプロパティの変更にも追随して表示が変化します。
環境は  D7 + WinXP SP2 です。

>>最初の1回目では右寄せにしているのですが、CreateParamメソッドが2回走り、また左寄せ処理が走ってしまいます。

なぜ1回目はOKなのに2回目はダメなのかな。
どのようにして右寄せの判定を行っているのですか?

編集 削除