ウィンドウの大きさに応じてコントロールの配置を変化させるには?

解決


hiroshi  2009-12-08 03:59:34  No: 142946  IP: 192.*.*.*

Formを最大化して開いた時点で、Formに張り付けたコントロールの配置や大きさを、スクリーンの大きさに応じて変えたのですがうまくいきません。

Formの他にモジュールを設け、Main()からプログラムを開始させたいのですが、モジュールでの記述を以下にの様にしました。まずいところを教えて下さい。

Public fg as Form1

Sub Main()
   fg=New Form1
   fg.WindowState=FormWindowState.Maximized
   ControlPosition()
   Application.Run(fg)
End Sub

ControlPosition()の中で、たとえばボタンの配置を画面右下の方に配置するため
   dim H,W as Integer
   W=fg.Width/20 : H=fg.Height/20
   fg.Button1.Left=W*17 : fg.Button1.Top=H*18 
   fg.Button1.Width=W*2 : fg.Button1.Height=1

のようにしても、Formが開いていない時なので、WやHにスクリーンの大きさが反映されない事は分かったのですが、解決策を教えて下さい。
因みに、ControlPosition()を別のイベントで動作させれば、思ったようにボタンの配置はうまくいくのですが、ウィンドウが開始した時点でボタンの配置をこのようなやり方で決めたいのです。

編集 削除
 2009-12-08 06:23:05  No: 142947  IP: 192.*.*.*

どうしてフォーム側でやらないの?
フォームのSizeChangedイベントで対応できるんじゃないの?

編集 削除
hiroshi  2009-12-08 12:44:50  No: 142948  IP: 192.*.*.*

あ  さん  ありがとうございます    解決しました。
ご指摘をヒントに、Form1のLoadイベントの中で
Private Sub Form1_Load(****)
   ControlPosition()
End Sub
と、したら  うまくいきました。
ただ、SiseChanged で同じことをやると、よくわからないのですが、エラーになります。

編集 削除
 2009-12-08 13:49:06  No: 142949  IP: 192.*.*.*

SizeChangedイベントでエラーになるのは、もしかしたらForm1のインスタンス作成時にこのイベントが発生してしまうけれど、
このときのButton1がまだNothingであるからかも知れません。
もしForm1を開いた後にフォームの最大化を元に戻すようなことがあり、もう一度ControlPosition()を呼び出す必要があるのであれば、
SizeChangedイベントにも
If Button1 IsNot Nothing Then
    ControlPosition()
End If
にすればよいでしょう。

編集 削除
hiroshi  2009-12-09 22:11:57  No: 142950  IP: 192.*.*.*

あ  さん  ありがとうございました
最近パソコンを新しく買ったのですが、いつもパソコンを買い替えたとき、画面の大きさが異なるので、毎回コントロールの位置を調整していたのですが、これですっきりしました。
余談ですが、V_Studioも2003年版からも2008版に更新しましたところ、数えきれないくらいの警告が出て、いま悪戦苦闘してます。時々エラーになってしまう時もありますが、それでも、パソコンが新しくなったせいか、VB_Studioのせいか、処理速度が確実に2倍以上速くなったので、長年続けているプログラム作りに元気が出たところです。
また宜しくお願いします。

編集 削除
魔界の仮面弁士  2009-12-10 11:46:48  No: 142951  IP: 192.*.*.*

コントロールの Anchor プロパティを使う事も検討してみてください。
これを使うと、フォームの大きさが変わったときに、コントロールが
自動的に再配置されるようになります。
これなら追加のコードを記述する必要が無く、デザイン時の設定だけで済みます。


初期状態では、Anchor プロパティにて Left と Top が固定されています。
この場合、フォームサイズが変更されても、コントロールの
"左端からの距離" と "上端からの距離" が一定となっています。
そのため、コントロールの位置が変化しないように見えます。

ここで、Left と Top を解除し、Right と Bottom を固定するように設定すれば、
"右端からの距離" と "下端からの距離" が一定となり、コントロールが
右下の位置に固定されているかのように動作させる事ができます。


ちなみに、Left と Right を固定した場合には、
"左端からの距離" と "右端からの距離" が一定となるため、
画面サイズに応じて、コントロールの幅が増減するようになります。
また、Top と Bottom を固定すれば、高さが自動的に増減します。

編集 削除
hiroshi  2009-12-11 23:40:00  No: 142952  IP: 192.*.*.*

魔界の仮面弁士さん  ありがとうございます。
Anchor プロパティは、今まで使ったことはないのですが、そういうのがある事は知っていました。しかし、位置は自動的に調整してくれそうですが、コントロールの大きさは調整してくれないと思って使っていませんでした。
でも試してみたいと思っています。ご丁寧にありがとうございました。

編集 削除