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の挙動を一切気にする必要はありません。
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
No.2
- 回答日時:
補足になります。
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
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP php ログイン 1 2022/11/01 00:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別フォームから戻ったときのイ...
-
VBAでIEの「Web ページからのメ...
-
「Cancel = True」とはどういう...
-
エクセル アプリケーションの...
-
Perlで数値(小数点、負の数、...
-
VB6.0のEnabledをfalseにしても...
-
VB2005 DataGridView上でクリッ...
-
excelのタスクバーアイコンが・...
-
マイページはどこを開くの
-
ウインドウを毎回同じ位置、大...
-
デジタル時計の時刻合わせの方...
-
エクセルのシート上に別のシー...
-
VBAのユーザーフォームのframe...
-
小さな表示窓の呼び方は
-
VBAで任意のウインドウのサイズ...
-
スクリプトって、何ですか?ど...
-
Javascript_submit()完了後に処...
-
Excelでワードアートや図を常に...
-
リストビューをスクロールさせ...
-
同じページをブラウザで複数開...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
excelのタスクバーアイコンが・...
-
Perlで数値(小数点、負の数、...
-
VB6.0のEnabledをfalseにしても...
-
VBAでIEの「Web ページからのメ...
-
エクセル アプリケーションの...
-
【ImageMagick】 PDF → JPG 変...
-
【C#】ラベルのダブルクリック...
-
Perlでページ処理がどうしても...
-
vba IE操作で こういう事って...
-
別ページからのタブ切り替えの...
-
処理終了後のに砂時計が、クリ...
-
数千行HTML 画面表示の性能改善
-
javascriptの中で、perlのコマ...
-
C# マウスオーバーの記述方法
-
実行中のOSを知るには?
-
C++での連続した左クリックの禁...
-
Sleep関数の最大時間について
おすすめ情報