プロが教えるわが家の防犯対策術!

質問が以下の通りです。

1 VBでForm1(親Form),Form2(子Form)を作成
2 Form1(親Form)を隠れた状態で、まず認証用のForm2(子Form)を呼出
3 Form2での認証入力が通ったら、Form2を閉じて、Form1を表示させる
  逆にFormを閉じる

ということがしたいです。

いつも、素人のような質問にすみませんでした。

宜しくお願いします。

「VB Formの非表示について」の質問画像

A 回答 (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の挙動を一切気にする必要はありません。
    • good
    • 0

こんなかんじではないでしょうか?


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
    • good
    • 0

補足になります。


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

この回答への補足

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

補足日時:2009/05/26 15:57
    • good
    • 0

開発環境が・・・。

(・・;)

とりあえず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の処理を入れるだけで済みます。
私ならこっちの方法で作りますね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!