フォームの高さの変わるのを防ぐには

解決


mammal  URL  2004-10-04 21:42:55  No: 85873

いつもお世話になっております。

当方の作ったソフトで、実行すると、
高さの足りなくなるものがあるのです。
ちょうどメニューの高さだけ短くなって、
フォームの下端にあるオブジェクトが表示されません。
デザイン時にはぴったりと合わせてあるのですが。

この現象は時によっては起きたり起きなかったりするのですが、
起きる条件のようなものは一切分からないのです。
メニューの無いフォームではこの現象は見られないようです。

どなたか回避方法のおわかりの方がいらっしゃいましたら、教えてください。

VB6SP6 + Win98SE
BorderStyleは固定ダイアログと、固定(実線)を使っています。


nanashi  2004-10-05 00:18:08  No: 85874

根本的な解決方法は分かりませんが、
起動時にフォームのScaleHeightを見て足りなかったらHeightを増やす、
っていう方法で回避出来ないでしょうか?


raki  URL  2004-10-05 00:33:56  No: 85875

EXE実行時に起きたり起きなかったりするのでしょうか?
デバッガ上で実行すると、起きたり起きなかったりするのでしょうか?
それともどちらでも起きたり起きなかったりするのでしょうか?


mammal  2004-10-05 22:44:43  No: 85876

返事が遅くなってしまい申し訳ありません。

nanashi様
ありがとうございます。早速チェックしてみます。

raki様
両方です。
友人にソフトをプレゼントしたら、クレームが返って来た事があります。
これも、コンピュータによって起きたり起きなかったりするようです。


raki  URL  2004-10-06 02:57:24  No: 85877

発生するコンピュータでは毎回必ず発生するのでしょうか?

Heightの値を固定で持ち、Form_Load時に明示的にセットしてみてはいかがでしょう。
また、発生する場合と発生しない場合で、Heightの値が変わっているかどうかを
ファイルに書き出すなりして調べてみましたでしょうか?

もし変わっているのなら、明示的にセットしなおすことで対処できるかもしれませんし、
変わっていないのであれば、描画の問題なので、もう少し複雑な回避処理が
必要になるかもしれません。
DoEventsの1行で対処できたりする場合もありますが。


Tamy  2004-10-06 08:16:33  No: 85878

>友人にソフトをプレゼントしたら、クレームが返って来た事があります。

友人のOSはWinXPではないですか?

>これも、コンピュータによって起きたり起きなかったりするようです。

OSによって起きたり起きなかったりするのではないですか?
WinXPリナスタイル…起きる
Win98 Win2000 WinXPクラッシックスタイル…起きない
ではないですか?
(当方のWinXPリナスタイル、クラシックスタイルでフォームが切れる
現象を確認できましたもので)

普通はスタイルに関係なく表示されるのですが、
プログラム上でMe.Height = XXXXとか直接指定していませんか?

外していればスミマセン<(_ _)>

私もこのような現象に会ったことがあるので
(プログラム上でフォームのHeightを変更してWin98とWinXPで表示が
異なった事があったので)
もしかしてそうかなと思った次第です。


raki  URL  2004-10-06 13:26:07  No: 85879

プログラム上でHeightを直接指定して、
XPリナスタイルでフォーム下部が切れたことは私も経験があります。

しかし、その場合は下部が少し切れただけで、
mammalさんのおっしゃってるような
>ちょうどメニューの高さだけ短くなって、
という現象ではありませんでした。

私の上記の問題はプログラム上でHeightを直接指定したことにあるのですが、
WinXPのリナスタイルが直接原因ではなく、
WinXPのリナスタイルではタイトルバーの高さが『25』に標準設定されているのが原因で、
WinXPクラッシックスタイル及びWinXP以外のOS(Win2003含む)は『18』が
標準設定だったため、フォーム下部がこの差分切れていました。

つまり、WinXPクラッシックスタイル及びWinXP以外のOSでも
タイトルバーの高さを『18』より大きくすれば上記現象が発生しましたし、
逆にWinXPのリナスタイルでも高さを『18』に設定すれば
正常に表示されました。(全OSでチェックしました)
タイトルバーの見た目は少しおかしくなりましたがw

Tamyさんのおっしゃっていらっしゃるのはこの現象ではないでしょうか。

この現象が起きることを忘れていた為とはいえ、
前回の私の発言はまずかったですね。失礼いたしました。
>Heightの値を固定で持ち、
ではなく、Form_Load時にタイトルバーの高さを取得して
必要なHeight値を計算し、明示的にセット、と書くべきでした。
私はこの方法で対処しました。

ちなみに、明示的にコード内で直接指定していない場合、
つまりデザイン時にフォームプロパティで変更しただけの場合は
タイトルバーの高さを手動で変えようとも、
実行時に正常に表示されますのでご心配なく。

以前私の環境でメニューとステータスバーのあるフォームで、
デザイン時に一度もフォームウィンドウを表示しないままで
実行すると(デバッガ上で)ステータスバー分フォーム下部が短くなって
表示されていたことがあるので、それと似たような状況なのかな?
とも思ったのですが。

フォーム上に配置してあるコントロール等、もう少し情報が欲しいですね。

長文失礼致しました。


よし  2004-10-06 17:32:43  No: 85880

Tamyさんのおっしゃっているように
OSの違いによってタイトルバーやメニューバーの
高さの違いは出てきます。
ただし画面のプロパティの設定によってはXPでも細く
出来たりしますが...
こればかりは使用する人の好みになってくると思うので
rekiさんのように、プログラムの実行時に
GetSystemMetricsでメニューバーやタイトルバーや
必要であればスクロールバーの高さや幅を取得し、
SystemParametersInfoでワークエリアを取得すれば
一番ベストなのではないでしょうか


Tamy  2004-10-07 04:59:55  No: 85881

>つまり、WinXPクラッシックスタイル及びWinXP以外のOSでも
>タイトルバーの高さを『18』より大きくすれば上記現象が発生しましたし、
>逆にWinXPのリナスタイルでも高さを『18』に設定すれば
>正常に表示されました。(全OSでチェックしました)
>タイトルバーの見た目は少しおかしくなりましたがw
>
>Tamyさんのおっしゃっていらっしゃるのはこの現象ではないでしょうか。

まぁその通りなんですが(^_^;)
私が発言したのは

>この現象は時によっては起きたり起きなかったりするのですが、
>起きる条件のようなものは一切分からないのです。

と、はじめにmammalさんが書いておられたので原因究明にならないかと
思ったからです。私の場合も
よしさんの言うとおりGetSystemMetricsでメニューバーやタイトルバーの高さを求め、
rakiさんの言うとおり必要なHeight値を計算し、明示的にセットして解決しました。

>しかし、その場合は下部が少し切れただけで、
>mammalさんのおっしゃってるような
>>ちょうどメニューの高さだけ短くなって、
>という現象ではありませんでした。

私も初めはそう思いました。ですから

>普通はスタイルに関係なく表示されるのですが、

と発言したわけであります。ではなぜ

>プログラム上でMe.Height = XXXXとか直接指定していませんか?

と思ったかと申しますと、ここからは推測になるのですが
mammalさんのHPが公開されていたのでそこからソフトをDLしてきて実行してみたのです。
(これは皆さんがどんなプログラムを作っているのか興味が有った為です)
そうするとフォームの下端のオブジェクトが半分以上切れていました。
(ちょうどメニューの高さだけ短くなっているように見えましたが、
見えるだけで実際はメニューの高さの半分くらい短いと思う)
クラシックスタイルで実行すると正常に表示されました。
それと

>友人にソフトをプレゼントしたら、クレームが返って来た事があります。

と言うことから友人はフォームの下端が切れるのを確認しているが
mammalさんは確認できていないものだと思いました。
ちょうどメニューの高さだけ短くなって、というのは友達の見た目の判断だと思ったのです。

同じ画面の大きさくらいのテストプログラムを作って、メニューの有無で実験しました。
メニュー有りの方は一番下のオブジェクトが3分の2ほど隠れました。
明らかに切れている感がありオブジェクトの文字が見づらいです。
メニュー無しの方は一番下のオブジェクトが3分の1ほど隠れました。
こちらはオブジェクトは3分の1ほど隠れてはいますが文字は見えました。
友人が見れば元の大きさが分かっていない為もあり文字が読めれば正常と思ったのかもしれません。

これはあくまでも私の推測なので軽く読み流して下さい(^_^;)

原因が分かっていないのに解決法だけ言われても私だったら納得しないので
原因究明の助けになればと思いレスした所存であります。(^_^)

長文になってしまいましたが失礼致しました。m(_ _)m


mammal  2004-10-07 07:25:04  No: 85882

皆様、たくさんのレスポンスありがとうございます。
えと、作業が遅れてしまっているのですが。
私の文言にはっきりしない部分があるようなので。

開発環境では、起きたり起きなかったりします。
コードの実行を一度終了して、再度実行すると、
上手く表示される事があります。
はじめから上手く表示されるときもあります。

メニューバーの高さと言う表現は、見た目、です。
テキスト1行分の高さに設定したテキストボックスやらラベルが、
ちょうどすっぽりと隠れてしまいました。
現在公開しているプログラムは、発症しない物を選んでいます。

問題となっているフォームは、BorderStyleを固定にしてあるので、
コードでプロパティを設定する事はしていません。・・・のはず。
確認しときます。
言われてみると、特定のフォームだけ、発症するような気がします・・・。

プレゼントした友人の環境も98SEの筈です。
とりあえずそれで我慢してくれと、返事したあと、
話題に上らないので、起動するたびに必ず発症するものと思われます。

別の友人(98SE)からは何も言われないので、
これはマトモに表示されていると思います。

必要であれば、ソースを見ていただくのが一番速いかもしれません。
xpで歪むのであれば、GetSystemMetricsはいずれ必要になるのですね。
勉強してみます。

相変わらず原因がわからないのですが、長文ゴメンナサイ。
とりあえずAPIで解決を図ります・・・。


raki  2004-10-07 19:18:52  No: 85883

Tamyさん失礼致しました。
発言の仕方が悪かったと反省しております。

mammalさんに一つ質問があるのですが、

>開発環境では、起きたり起きなかったりします。
>コードの実行を一度終了して、再度実行すると、
>上手く表示される事があります。
>はじめから上手く表示されるときもあります。

とありますが、
下部が切れてしまうフォームのウィンドウ(コードウィンドウではなく、デザインウィンドウ)を
閉じた状態で一旦プロジェクトを保存し、再度プロジェクト開いてすぐ実行すると
現象が発生したりしませんか?
また、その状態からフォームのデザインウィンドウを開いて
再度実行すると正常に表示されたりしませんか?


mammal  2004-10-11 03:50:28  No: 85884

raki様
ありがとうございます。
言われた通りの環境で症状が再現されました。
もしかしてこれはVBの仕様なのですか?
exeファイルもこの影響を受けるものなのでしょうか?
回避方法はあるのでしょうか?

APIはいまだ勉強中です。
遅くなってすみません。


raki  URL  2004-10-12 21:20:18  No: 85885

遅くなってしまってすみません。
上記方法で現象の発生・正常表示が再現できるのであれば、
コードに問題はないと思われます。確実ではありませんが。

また、デバッガ上では一度フォームのデザインウィンドウを開ければ
症状が改善される為、とりあえず置いといて、
問題はそれがEXEにも影響するのか、という点ですが、
私の環境ではコンパイルしたEXEでは高さが短くなる問題は発生しませんでした。
これは、一度もデザインウィンドウを開かないでコンパイルした場合と、
開いてからコンパイルした場合共にです。
このため、私の場合はコンパイルしたEXEは影響を受けないものと考え、
これに対しては特に対処を行わなかった記憶があります。

いろいろ書いておきながら、結局具体的な解決方法を提示できず、
申し訳ありません。

Form_Loadの最後にDoEventsを1行入れたら直ったという先輩の話もありますが、
それも解決方法としての一つであるだけで、
なぜそれで直るのか、そもそもの原因はなんなのかは分からずじまいです。
参考までに。


mammal  2004-10-13 01:23:53  No: 85886

raki様、ありがとうございます。
よーするに、VBの仕様として対処するべきなのですね。

作業が遅すぎますが、APIで回避するつもりで
現在コーディングをちまちまと進めています。

皆様ありがとうございました。
今後ともよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加