none
【VisualBasic2012】フォーム1から、フォーム2を表示しようとしてもフォームが表示されない現象について RRS feed

  • 質問

  • お世話になります。

    Visual Basic2012で開発しています。
    フォーム1から、フォーム2を表示する簡単な処理を行いたいのですが、
    システム起動後の1回目に限り、フォーム2が表示されない現象が発生しています。
    2回目以降はフォームは表示されます。
    1回目も2回目も同じロジックが実行されているにも関わらずこのような現象が発生しています。
    また現象は、フォーム2のタイトルが非表示な時に現象が出ています。

    以下に各フォームのロジックを簡易ながら記述します。
    フォーム1:
      Public Class Form1

          Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
                '↓引数でフォーム2に情報を渡したいのでフォーム2の関数をCALLしています。
              Call Form2.KIDOU()  
          End Sub
      End Class

    フォーム2:
     Public Class Form2

         Public Sub KIDOU()
             Me.ShowDialog()
         End Sub

         Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
             Me.ControlBox = False
             Me.Text = ""
         End Sub
     End Class

    一応の対策としては、フォーム2の「Text」プロパティに半角空白でもセット
    してやれば現象を避けることはできるのですが、これが正しい方法なのかがわかりません。
    そもそもフォームのタイトルが非表示になると、何故このような現象が起こるのでしょうか?

    ご存知の方がいらっしゃいましたら、ご教示して頂けると助かります。


    2017年7月10日 4:39

回答

  • すみません。原因は分からなかったのですが、私の環境でも再現しましたので動作を確かめたところ、Me.ControlBox = False と設定されたフォームに対して Me.Text = "" とタイトルに空文字を設定すると、フォームが一度閉じられ(ウィンドウに対してWM_DESTROYが呼ばれている)てからフォームが作り直される動きのようです。想像になりますが、ShowDialog によって表示されたフォームでは、フォームの作り直しの部分がうまく行っていないように思いました。

    先に Me.Text = "" とした後に、Me.ControlBox = False を行うと現象は発生しなくなりました。

    Me.Text = ""
    Me.ControlBox = False


    回避方法として、上記のように順番を逆にするのも手かもしれません。

    2017年7月10日 5:37

すべての返信

  • Miyazaki Hiroaki さん、ご投稿いただきありがとうございます。
    フォーラム オペレーターの立花楓です。

    今回、MSDN「.NET Framework 」 フォーラムに投稿いただいた内容については、MSDN「Visual Basic」 フォーラムにてご質問いただいたほうが、情報が集まりやすいと思いますので移動させていただきました。

    MSDN フォーラム > Visual Studio Development > Visual Basic
    https://social.msdn.microsoft.com/Forums/ja-JP/home?forum=vbgeneralja&filter=alltypes&sort=lastpostdesc

    今後、参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いします。


    MSDN/TechNet Community Support 立花楓


    2017年7月10日 5:30
    モデレータ
  • すみません。原因は分からなかったのですが、私の環境でも再現しましたので動作を確かめたところ、Me.ControlBox = False と設定されたフォームに対して Me.Text = "" とタイトルに空文字を設定すると、フォームが一度閉じられ(ウィンドウに対してWM_DESTROYが呼ばれている)てからフォームが作り直される動きのようです。想像になりますが、ShowDialog によって表示されたフォームでは、フォームの作り直しの部分がうまく行っていないように思いました。

    先に Me.Text = "" とした後に、Me.ControlBox = False を行うと現象は発生しなくなりました。

    Me.Text = ""
    Me.ControlBox = False


    回避方法として、上記のように順番を逆にするのも手かもしれません。

    2017年7月10日 5:37
  • ご指摘ありがとうございます。

    失礼しました。

    2017年7月10日 23:55
  • ご返信ありがとうございます。

    2017年7月10日 23:58
  • Loadイベントの時点では適切な操作ではないのかもしれません。
    例えば次のタイミングでセットすればうまく行くようです。

    Public Sub KIDOU()
        Me.ControlBox = False
        Me.Text = ""
        Me.ShowDialog()
    End Sub


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年7月11日 2:22
    モデレータ
  • こんにちは、Miyazaki Hiroaki さん
    フォーラム オペレーターの立花楓です。

    こちらの質問に関して、その後の状況はいかがでしょうか。
    kenjinote さん、trapemiya さんから寄せられている情報から、進展がございましたらこちらのスレッドへご返信いただけますと幸いです。


    宜しくお願いいたします。


    MSDN/TechNet Community Support 立花楓

    2017年7月27日 8:11
    モデレータ
  • 返信が遅くなりすみません。

    kenjinote様の方法で見てもらったのですが、
    フォームの見栄えのこともあり、Me.textプロパティをセットして
    表示することになりました。

    ご返信いただきありがとうございました。


    2017年8月21日 7:05