なぜか連載になってしまったこのシリーズ、3 回目の記事です。
今回は、僕が結構苦しんだある問題について書いてみます。
結構悩めるところなので、同じような問題で苦しんでいる方は、参考にしてみてください。
まあ、こういうところがプログラミングの面白さであったりもするわけですが。
3. 画面いっぱいに textBox とかを表示したいとき...
用途によっては、こんな感じで画面いっぱいに textBox を表示させたいときもあるでしょう。
例えば、エディタ的なものを作りたい場合。
しかし、Windows Mobile は、普通の Windows と違って、縦画面・横画面の問題があります。
例えば、縦画面でテキストボックスを画面いっぱいに Visual Studio 上で配置した場合、縦画面のまま実行した場合は問題なく実行されますが・・・。
当たり前ですが、横にすると、このようにはみ出します。
もちろん、逆も同じで、横画面で画面いっぱいに配置した場合は、縦画面にした時にはみ出します。
また、Advanced/W-ZERO3[es] など画面サイズが特殊なものだと、これまた Visual Sutido 上では横画面で画面いっぱいに textBox を配置したとしても、右側が余ってしまうのです。
では、どうすればいいのか?
普通に考えた場合、Form1 のサイズが変更されたら textBox のサイズも変更する・・・という処理を考えてみることでしょう。
もちろん、これは Form1 の Resize イベントで簡単に設定できます。
private void Form1_Resize(object sender, EventArgs e)
{
textBox1.Size = this.Size;
}
こんなコードを書くだけで、うまくいきそうな気がします。
Load イベントも必要じゃないかと思うかもしれませんが、Form1 がロードされた時にも Resize イベントが発生しているようなので、不要みたいです。
実行してみましょう。
textBox がロードされた時に Form1 に合わせてちゃんと Resize されるかどうか確認するために、わざと小さく配置してみます。
もし、僕の思い通りに実行されているとすれば、ロードされた時や縦横回転させた時に、画面サイズに合わせて、画面いっぱいに textBox が表示されるはずです。
ロードされた状態。
おお、ちゃんと画面いっぱいに textBox が表示されてるじゃないか。
回転してみる。
あれれ?textBox が、ちょっとだけはみ出しちゃってるよ。
おかげで、スクロールバーが登場しちゃってます。
確かに、縦横のサイズは変更されているのだけど、これは気になる。
縦に戻してみる。
あれれ?やっぱりはみ出しちゃってるよ・・・。
なんで?
というわけで、僕の思った通りには動いてくれなかったようです。
が、サイズを変更させる所にブレークポイントを設定して、Form1 や textBox のプロパティを確認しながら実行してみました・・・。
なんと、それだとうまくいくのです。
これは、あれか、よくあるゆっくり実行させてあげるとうまくいくタイプの、意味不明な。
不可解かもしれませんが、結構いろんなプログラムを作っていると、ブレークポイントを設定してトレースしながらだとうまくいくのに、ブレークポイントなしだとうまくいかないってことがよくあるんですよ。
そういう場合のバグのほとんどは、Timer とかで無理やり少しの間休ませてあげるとうまくいきます。
今回も、Resize する前に少しだけ休んでみましょう。
Timer を追加して、次のようにコードを変更します
private void Form1_Resize(object sender, EventArgs e)
{
timer1.Enabled = true;
}private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
textBox1.Size = this.Size;
}
Timer1 の interval は、Default の 100 のままです。
どんな感じになるかというと、もし Form1 のサイズが変わったよ~ってことを受け取ったら、100ms 休んだ後に Form1 のサイズに合わせて textBox1 のサイズを変更してあげます。
マジックです、見ててください。
このように、無事成功したわけで。
これで、画面を回転されても、どんなサイズのディスプレイを搭載した端末であろうと、textBox のサイズを Form いっぱいに表示させることが可能になりました。
動作も、100ms (0.1秒) 程度しか待たせてないので、もたつきもほとんどありません。
なんで、Timer で待たせてあげると、ちゃんと動くかは理解不能ですが、きっとそういう "仕様" なのだ。と思っておいた方が精神衛生上すっきりします。
(たぶん、画面を回転させる処理が、内部的にはすごい複雑になってて、Form1 のサイズがいきなり縦から横に替るわけじゃないんだろうなぁ。すなわち何回か変なサイズに変更されたあと、正常なサイズに変更されるのかな?とか。100ms 経過して落ち着いた後に変更してあげると、正常なサイズが取得できるのではないかと。Resize イベントは一番最初にサイズが変更された時に呼び出されるから、変なサイズを取得してしまってこんなことになるのかなと。僕の予想はそんな感じです。)
もしかしたら、同じことをもっと簡単、単純にできる方法があるかもしれませんが、知っているなら良かったらコメントから教えてください。
今回は、これで終わりにします。

コメントする