Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

フォームデザインの通りに表示されない? 解決済み

タグの編集...

投稿者   (社会人)   投稿日時 2022/4/28 12:02:22
以前質問したVB6→.NET環境に移行を試みているものです。

FormMainを.showにて呼び出し表示させようとしているのですが、
デバッグをすると、FormMainが一瞬写り即終了しデバッグが終了します。(エラーは発生しておりません)
一瞬何が写ってるのか見ようと、sleepを用いて表示時間を延ばしたところ、
FormMainのウィンドウは表示されているのですが、フォームデザインにて設置したbutton等が一切表示されておりませんでした。

ウィンドウのみが表示され、デザインが反映されないという事はあるのでしょうか?
何が起こっているのか全く分からない為、抽象的な質問になってしまい申し訳ございませんが、何か情報あれば教えて頂ければと思います。

投稿者 るきお   (社会人)   投稿日時 2022/4/28 18:53:17
>ウィンドウのみが表示され、デザインが反映されないという事はあるのでしょうか?
通常はありませんので、何か通常と違うところがあるのだと思います。

たとえば、Sub Mainから開始するようにしていて、フォームが開いてもプログラムが終了するようになっている場合などです。普通このような無意味なことはしませんが…。

私ならまずはプロジェクトのプロパティでアプリケーションフレームワークが有効になっているか確認します。
それから、新規に作成したWindows フォーム アプリと違いを比較してみるというのも手ですね。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/4/28 19:02:07
> FormMainを.showにて呼び出し表示させようとしているのですが、

その処理は、別のフォームから呼んでいますか? それとも Sub Main() からでしょうか。
Sub Main() からの呼び出しの場合は

Application.Run(New FormMain())

あるいは

Using dlg As FormMain()
    dlg.ShowDialog()
End Using

などにしてみてください。

> フォームデザインにて設置したbutton等が一切表示されておりませんでした。
コンストラクタから InitializeComponent が呼ばれていない場合、そのような動作になります。


> sleepを用いて表示時間を延ばしたところ、
Sleep は画面描画さえ止めてしまうのでお奨めしません。
画面の目視チェックだけなら、Shown イベントでメッセージボックスを呼ぶのはどうでしょう。

投稿者   (社会人)   投稿日時 2022/4/29 10:08:33
るきおさん 魔界の仮面弁士さん

迅速な回答ありがとうございました。
教えて頂いたことを試した結果、
Application.Runにてやりたいことができました。
.ありがとうございます。

何故showではダメでApplication.Runだと動くのか等分からないところも多いので、教えて頂いたことを調べながら頑張ります

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/4/29 16:09:00
Sub Main() で始めたプログラムの場合、Main メソッドが End Sub に到達した時点で
プログラムの実行が終了する仕様だからです。

ShowDialog ダイアログやメッセージボックスなどは、その画面が閉じられるまで
呼び出し元に制御が戻ってきませんから、フォームが閉じられるまでの間、
アプリケーションを実行し続けることができます。

一方 Show メソッドの場合は、フォームを呼び出した後も、
呼び出し元は次の行を順次処理し続けるため、開かれたフォームが
閉じられるまで待ち合わせることなく、プログラムが終了してしまうのです。


Application.Run に Form インスタンスを渡した場合は、「メッセージループ」によって
フォームが閉じられるまで待ち合わせるようになっています。

もし、メインフォームが 1 つではなく、「いずれか 1 つでもフォームが残っていたら
プログラムを終了したくない」といった場合に対処したいのであれば、
ApplicationContext クラスを実装して、それを Application.Run に渡すことになります。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.applicationcontext


ただし Visual Basic 2005 以降の場合には、るきおさんも書かれていましたように、
プロジェクトのプロパティの[アプリケーション]タブから、アプリケーションフレームワークを
有効にしておく方が手っ取り早いです。

この場合、スタートアップの位置は Sub Main ではなく、同設定画面右下の
「アプリケーション イベントの表示」ボタンを押して、MyApplication クラスの
Startup イベントを使うことになります。


もしも現在のように、アプリケーション フレームワークを用いずに
Sub Main からの起動を行う方法を選ぶのなら、Application.Run を呼び出す前に、
 Application.EnableVisualStyles()
 Application.SetCompatibleTextRenderingDefault(False)
の 2 行を入れておくことをお奨めします。これらの行の有無は、
画面上のコントロールの見た目に影響を与えます。

投稿者   (社会人)   投稿日時 2022/5/9 09:06:02
事細かに教えて頂き誠にありがとうございます。
教えて頂いたことを元に頑張ってみます!