こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBのパスワードに関して

VBのパスワードについて質問です。

今ソースに書いたパスワードを認証させて、Form2に移動させようと思っています。

Public Class Form1

Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If TextBox1.Text = "1234" Then
MsgBox("パスワードが正しく入力さました")
Dim frm2 As New Form2
frm2.Show()
Else
MsgBox("パスワードが正しくありません")
Me.close()
End If
End Sub
End Class

上記で質問があります。
まずForm1には TextBox1 .. 5 まで設置しています。
上記のソースだと"TextBox1"の"指定文字"が正しければ、
MsgBox("パスワードが正しく入力さました")と表示しますが、
これを増設したいのです。

例えば
[TextBox1] - [TextBox2] - [TextBox3] - [TextBox4] - [TextBox5]

[Button1]

にしたいのですが、ソースコードはどの様になりますか?
順番としては1から5の小さい値でOKであれば認証する。
あと何処かで見たのですが、
これに起動の回数制限を設けたいと思っています。
その方法も教えて頂ければありがたいです。


また外部者から逆コンパされない様に暗号化方法も教えて欲しい!
私は一切、Web系の認証はしないので・

投稿日時 - 2008-11-03 01:06:13

QNo.4449662

困ってます

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

私なら Validating/Validatedイベントを活用します

フォームに1つ変数を追加します
dim bCloseFlag as Boolean

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If bCloseFlag = false And TextBox1.Text <> "1234" Then
    e.Cancel = True
    MsgBox("パスワードが正しくありません")
  End If
End Sub
とった検査を TextBox2からTextBox5まで行います
チェックが通らない場合フォーカスの移動が出来ません

こちらはチェックがOKだった場合に呼ばれるイベントです
TextBox1からTextBox4までは次のテキストボックスにフォーカスを設定します
TextBox5でチェックがOKになった場合Button1を有効にしてフォーカスを与えます
Private Sub TextBox_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox5.Validated, TextBox4.Validated, TextBox3.Validated, TextBox2.Validated, TextBox1.Validated
  If sender Is TextBox1 Then
    TextBox2.Focus()
  ElseIf sender Is TextBox2 Then
    TextBox3.Focus()
  ElseIf sender Is TextBox3 Then
    TextBox4.Focus()
  ElseIf sender Is TextBox4 Then
    TextBox5.Focus()
  ElseIf sender Is TextBox5 Then
    Button1.Enabled = True
    Button1.Focus()
  End If
End Sub

ボタンクリックイベントは
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  MsgBox("パスワードが正しく入力さました")
  Dim frm2 As New Form2
  frm2.Show()
End Sub

フォームのClosingイベントで
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
  bCloseFlag = True
End Sub

フォームのLoadイベントで
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Button1.Enabled = False
End Sub

といった具合で ・・・

投稿日時 - 2008-11-03 02:06:16

補足

回答有り難うございます。
言われた通りソース書いてやってみましたが、
TextBox2を一文字入力した途端、パスワードは違いますと出て
先に進めません・・・。

なぜですか?

Public Class Form1
Dim bCloseFlag As Boolean

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If bCloseFlag = False And TextBox1.Text <> "1234" Then
e.Cancel = True
MsgBox("パスワードが正しくありません")
End If
End Sub
Private Sub TextBox_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox5.Validated, TextBox4.Validated, TextBox3.Validated, TextBox2.Validated, TextBox1.Validated
If sender Is TextBox1 Then
TextBox2.Focus()
ElseIf sender Is TextBox2 Then
TextBox3.Focus()
ElseIf sender Is TextBox3 Then
TextBox4.Focus()
ElseIf sender Is TextBox4 Then
TextBox5.Focus()
ElseIf sender Is TextBox5 Then
Button1.Enabled = True
Button1.Focus()
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("パスワードが正しく入力さました")
Dim frm2 As New Form2
frm2.Show()
End Sub
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
bCloseFlag = True
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Enabled = False
End Sub

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
If bCloseFlag = False And TextBox2.Text <> "5678" Then
MsgBox("パスワードが正しくありません")
End If
End Sub

Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
If bCloseFlag = False And TextBox3.Text <> "9012" Then
MsgBox("パスワードが正しくありません")
End If
End Sub

Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
If bCloseFlag = False And TextBox4.Text <> "3456" Then
MsgBox("パスワードが正しくありません")
End If
End Sub

Private Sub TextBox5_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox5.TextChanged
If bCloseFlag = False And TextBox5.Text <> "789" Then
MsgBox("パスワードが正しくありません")
End If
End Sub
End Class

投稿日時 - 2008-11-03 02:34:06

お礼

様々な人からご指摘なども頂き、本コードを記入して頂き有り難うございました。またの機会ありましらよろしくお願いします。

投稿日時 - 2008-11-03 22:50:11

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

ちゃんと理解してから使いましょう

Private Sub TextBox2_TextValidating(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
だと
プロシージャ名がTextBox2_TextValidatingに変更されたTextChangedイベントですよ

デザイナでTextBox2を選択
プロパティウインドウの雷マークをクリック
スクロールなどをして Validatingの項目を探す
Validatingの右側をダブルクリック
コードエディタのスケルトンに必要なコードを追加
この手順を Text3,TextBox4,TextBox5に繰り返しましょう

投稿日時 - 2008-11-03 17:38:41

補足

ご指摘有り難うございます。
イベント系はあまり使っていませんでしたので、全部コード書きでした。大変有り難うございます。

無事解決しました。

投稿日時 - 2008-11-03 22:48:06

ANo.3

TextBox2以降のイベントハンドラがValidatingではなくChanedイベントだからです
お使いのイベントがどのような場合に呼び出されるかをリファレンス(MSDN)で確認しましょう

Changedイベントはテキストボックスの内容が変更されるたびに呼ばれます
Validatingイベントはフォーカスが外れる際に呼ばれます
Validatedイベントはフォーカスが外れる際にValidatingイベントでe.CancelがTrueに設定されなかった場合に呼ばれます

投稿日時 - 2008-11-03 10:17:51

補足

Private Sub TextBox2_TextValidating(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
If bCloseFlag = False And TextBox2.Text <> "5678" Then
e.Cancel = Tune
MsgBox("パスワードが正しくありません")
End If
End Sub

で合ってますよね?
VB2008では
"'Cancel' は 'System.EventArgs' のメンバではありません。"と
表示され、進めないです。・・・

投稿日時 - 2008-11-03 14:07:13

ANo.2

>また外部者から逆コンパされない様に暗号化方法も教えて欲しい!

これは、VBで組んでいる限り難しいのではないかなと思います。
UPXなど実行ファイルを圧縮や暗号化して、
そのまま実行できるファイルが生成できるソフトがありますので、
これを使うと少し解析し難くできるかな。

コード上に暗号文字列が出て丸見えなのが嫌な程度であれば、
Windowsには暗号化のAPIが用意されていますので、これを使う手もあります。

http://support.microsoft.com/kb/821762/ja

投稿日時 - 2008-11-03 02:46:50

お礼

暗号化の件有り難うございました。
VBでは難しいという事が分りましたので、C言語系に手出してみたいと
思います。

投稿日時 - 2008-11-03 14:18:12