• ベストアンサー

VB Formの非表示について

質問が以下の通りです。 1 VBでForm1(親Form),Form2(子Form)を作成 2 Form1(親Form)を隠れた状態で、まず認証用のForm2(子Form)を呼出 3 Form2での認証入力が通ったら、Form2を閉じて、Form1を表示させる   逆にFormを閉じる ということがしたいです。 いつも、素人のような質問にすみませんでした。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)
回答No.3

こんなかんじではないでしょうか? 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)
回答No.2

補足になります。 Wizard_Zero様のコードをFormのActivatedイベントで行えば >Loadイベントが完了しないのでForm1は表示されません。 ということは発生しません。

xlhjp
質問者

補足

まず、環境は 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

回答No.1

開発環境が・・・。(・・;) とりあえず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の処理を入れるだけで済みます。 私ならこっちの方法で作りますね。

関連するQ&A