- ベストアンサー
VB Formの非表示について
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1 Wizard_Zeroです。 ソース拝見しました。いくつかご指摘いたします。 [Form1] Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim frmSub As New Form2 If frmSub.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Call Me.Close() ' Me.Show() '← せっかく閉じたフォームを再表示しています。この行は必要なし Return '← Me.Close() して Return すればForm1は表示されずにアプリが終了します。 End If End Sub [Form2] Private strpass As String = "555" Private cnt As Short = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If cnt = 2 Then 'Me.Close() ' ダイアログではCloseするのではなく、DialogResultに値を設定して閉じさせるほうがよいです。 Me.DialogResult = Windows.Forms.DialogResult.Cancel Else If TextBox1.Text = strpass Then TextBox1.Clear() 'Form1.Show() '← From1はすでに表示処理に入っているので不要。 ' またインスタンスを明示的に作成していないので、この書き方はお勧めできません。 'Label1.Text = "Please Enter Password" ' パスワードが一致しているのに何故・・・? Me.DialogResult = Windows.Forms.DialogResult.OK ' これがないと、ShowDialogがOKを返しません。 Else cnt = cnt + 1S ' IntegerからShortへの暗黙的変換が発生するので、定数をShort型として明示するほうがよいです。 'MsgBox("Password is wrong !") Label1.Text = "Password is wrong !" TextBox1.Clear() End If End If End Sub #3 AKARI0418さんの回答について: Endは強制的にプログラムを終了するので、出来る限り控えるようMSDNに書かれています。 ※詳細はMSDNのEndステートメントをご覧ください。 xlhjpさんはおそらく「Form2が表示されている間は、Form1が非表示状態になっている」とお考えだと察します。 そうではなくて、私の提示した方法は「Form1が表示される前に、Form2の処理を行う」という処理です。Loadイベント内ではForm1が非表示になっているのではなく、また表示すらされていない状態です。この状態でShowDialogにより、Form2が閉じられるまでForm1の処理は停止したままになりますので、Form2ではForm1の挙動を一切気にする必要はありません。
その他の回答 (3)
- AKARI0418
- ベストアンサー率67% (112/166)
こんなかんじではないでしょうか? Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim frmSub As New Form2 If frmSub.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then 'ここでいうMeはform1をさしています。 'ShowDialogはform2でクローズされてからここに入ってきます。 'いらないCall Me.Close() 'いらないMe.Show() 'Returnではフォームのロードイベントから抜けるだけ。 end End If End Sub End Class Public Class Form2 '大域変数はPrivateなどにしておくこと。 Private strpass As String = "555" Private cnt As Short = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If cnt = 2 Then 'ダイアログの戻り値をセット TextBox1.DialogResult = Windows.Forms.DialogResult.Cancel Me.Close() Else If TextBox1.Text = strpass Then TextBox1.Clear() 'Form1.Show()再度表示するなら、一度閉じてしまうほうがよいです。 Label1.Text = "Please Enter Password" Else cnt = cnt + 1 'MsgBox("Password is wrong !") Label1.Text = "Password is wrong !" TextBox1.Clear() End If End If End Sub End Class
- AKARI0418
- ベストアンサー率67% (112/166)
補足になります。 Wizard_Zero様のコードをFormのActivatedイベントで行えば >Loadイベントが完了しないのでForm1は表示されません。 ということは発生しません。
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
開発環境が・・・。(・・;) とりあえずVB 2005と仮定して・・・ Form1のLoadイベントでForm2に対してShowDialogを実行。 ShowDialogの戻り値がOKだったらそのままForm1を表示し、それ以外なら即Close。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim frmSub As New Form2 ' インスタンスを作るか作らないかはご自由に。 If frmSub.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Call Me.Close() Return End If End Sub ShowDialogによってForm2がモーダルダイアログとして表示されるため、Form2を閉じるまで処理が停止します。Loadイベントが完了しないのでForm1は表示されません。 Form2ではDialogResultに値をセットするだけでフォームが閉じ、戻り値を与えてForm1に制御が戻ります。 VB6.0/VB.NETでも考え方は同じだと思います。 (参考までに) Sub Main等からForm1を手作業で作成しているのであれば、From1を呼び出す前にForm2の処理を入れるだけで済みます。 私ならこっちの方法で作りますね。
補足
まず、環境は VB2008 Express Editionです。 教えたとおりに、やってみたが、From1の表示ができたが From2がうまく閉じていなくて、表示されたFrom1も操作できない状態です。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim frmSub As New Form2 If frmSub.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Call Me.Close() Me.Show() Return End If End Sub End Class Public Class Form2 Dim strpass As String = "555" Dim cnt As Short = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If cnt = 2 Then Me.Close() Else If TextBox1.Text = strpass Then TextBox1.Clear() Form1.Show() Label1.Text = "Please Enter Password" Else cnt = cnt + 1 'MsgBox("Password is wrong !") Label1.Text = "Password is wrong !" TextBox1.Clear() End If End If End Sub End Class