- PR -

継承フォームのサイズ変更について

投稿者投稿内容
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-05-29 09:06
さかもとと申します。
環境:VB2005(WINアプリ) WindowsXP SP2

いつもお世話になります。
継承フォームについて質問をさせて頂きたいと思います。

1:プロジェクトXに継承元となるフォームAを作成し、グループボックスとボタンをいくつか配置しています。

2:プロジェクトYよりプロジェクト参照によりフォームAを継承したフォームBを作成します。

3:この状態でフォームAのサイズを変更しリビルドするとフォームBのサイズも変更されます。

3までは問題ないのですが、3の状態からフォームBに対し、例えばボタンコントロールを一つ追加して、再度フォームAのサイズを変更してもフォームBのサイズは変更されません。

フォームB.Designer.vbの中身を見てみると

コード:

'
'Form3
'
Me.ClientSize = New System.Drawing.Size(492, 616)
Me.Controls.Add(Me.Button1)
Me.Name = "FormB"
Me.Controls.SetChildIndex(Me.Button1, 0)
Me.ResumeLayout(False)


が追記されており、サイズが固定(継承元のフォームAとは異なる)されています。

BackColorなどはコントロール追加後にフォームAを変更すればフォームBにも反映されますが、このようなケースでサイズを正しく継承するにはどのようにしたら宜しいのでしょうか?

宜しくお願い致します。


[ メッセージ編集済み 編集者: さかもと 編集日時 2006-05-29 09:13 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-29 09:15
引用:

さかもとさんの書き込み (2006-05-29 09:06) より:

3までは問題ないのですが、3の状態からフォームBに対し、例えばボタンコントロールを一つ追加して、再度フォームAのサイズを変更してもフォームBのサイズは変更されません。


これは俗にいう「触っちゃいけない」コード(デザイナが自動生成するコード)に、サイズ指定のコードが含まれてしまうからだと思います。

引用:

さかもとさんの書き込み (2006-05-29 09:06) より:

すが、このようなケースでサイズを正しく継承するにはどのようにしたら宜しいのでしょうか?



InitializeCompornent の下に、ベースクラスからサイズを貰うように書くのが良いです。


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-05-29 09:16 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-05-29 09:33
R・田中一郎様

ご返答ありがとうございます。

>InitializeCompornent の下に

というのは、この場合フォームB側に、ということで宜しいでしょうか?


フォームBとして試してみましたが、フォームB上のコントロールを少しでも変更すると、InitializeCompornent以下の触ってはいけないコードが自動再生成されてしまいます。フォームA側のLoadイベントで無理やりサイズを指定してみてもやはりフォームBのコードが優先されてしまうようで、サイズの変更が出来ません。

物凄く基本的な部分で間違えているような気がするのですが、何かお気づきの点はありませんでしょうか?

[ メッセージ編集済み 編集者: さかもと 編集日時 2006-05-29 09:51 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-29 09:49
引用:

さかもとさんの書き込み (2006-05-29 09:33) より:

というのは、この場合フォームB側に、ということで宜しいでしょうか?


MyBase.Size を Me.Size に引き渡すという意味なんでしょうけど、
その前に、デザインまで継承するのは、あまり良いことではありません。

# もしやるのであれば、InitializeComponent メソッド外に設定しておかないと...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-05-29 09:57
引用:

InitializeCompornent の下に、ベースクラスからサイズを貰うように書くのが良いです。


んー、既にベースのサイズも派生のInitializeCompornent()によって、変わってしまっているんじゃないかな。
「値」を継承する事を前提とするのは微妙ですね。全部同じサイズにしたいなら、設定ファイルから読み込むとかにしたほうがよさそうですね。
_________________
囚人のジレンマな日々
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-05-29 10:08
さかもとです。

じゃんぬねっと様、ご返答ありがとう御座います。

>その前に、デザインまで継承するのは、あまり良いことではありません。

これはどのような面から良くないのでしょうか?お伺いできればと思います。

囚人様、

>既にベースのサイズも派生の

変わっていました・・・。
じゃんぬねっと様がおっしゃるのもこのような部分からなのでしょうか?

>「値」を継承する事を前提とするのは微妙ですね

サイズも継承すればいいや、と簡単に考えていましたが、根本的に間違えていたようですね・・・。
開発開始当初にデザインの詳細な仕様(サイズとBorderStyle等)が決まっていなくて、やれ一斉に替えようと思っていたのですが、見通しが甘かったです。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-29 10:27
引用:

囚人さんの書き込み (2006-05-29 09:57) より:

引用:

InitializeCompornent の下に、ベースクラスからサイズを貰うように書くのが良いです。


んー、既にベースのサイズも派生のInitializeCompornent()によって、変わってしまっているんじゃないかな。


そんな動きをするのですね!(^▽^;)しらなかったです・・・

ベースクラスのサイズプロパティを Override(new?)して、ReadOnly にする手もありますかね。
でも、サイズを固定化しただけなのでしたら、InitializeCompornent() 後に明示的に定数からサイズを設定するようにして、定数部分のみ後から修正するなどの方が、後から見ても分かりやすいかもしれません。(囚人さんの設定ファイルの案とかぶりますが)
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-05-29 10:58
さかもとです。

R・田中一郎様

>定数部分のみ後から修正するなどの方が、後から見ても分かりやすいかもしれません

そうですね、分かりやすさの点からしたらそのようにすべきかも知れませんね。

やはり根本的に間違えて・・・。
まだ画面数が少なかったのが不幸中の幸いです。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)