2016-03-20 3 views
0

Mein Programm stürzt ab, wenn ich Buchstaben in das Eingabefeld eingib oder das Eingabefeld leer lasse. Warum funktioniert meine Validierung, wenn die Anweisung nicht funktioniert?Eingabeprüfung in Vb 2013 Eingabefeld Zeichenfolgenkonvertierungsfehler

Option Strict On 
Public Class frmPickUpSticks 
Dim playersTurn As Boolean = False 
Dim remainingSticks As Integer 'count sticks 
Dim losses As Integer = 0 'count player losses 
Private Sub btnNewGame_Click(sender As Object, e As EventArgs) Handles btnNewGame.Click 
    lblOutput.Text = "" 
    remainingSticks = CInt(InputBox("How many matchsticks would you like (5 - 25)?", "Pick Number of Matches!")) 
    'Validate input 
    If IsNumeric(remainingSticks) Then 
     If (remainingSticks >= 5) And (remainingSticks <= 25) Then 
      DisplayMatches() 
      If (remainingSticks Mod 4 = 1) Then 
       MessageBox.Show("You go first!") 
       playersTurn = True 
       turns() 
      Else 
       MessageBox.Show("I go first.") 
       turns() 
      End If 
     Else 
     MessageBox.Show("Please enter a number between 5 and 25.") 
    End If 
Else 
    MessageBox.Show("Input must be numeric.", "Input Error") 
End If 

Antwort

0

Sie können Ihre Benutzertypen in einer InputBox und übergeben Sie diesen Eingang mit einem beliebigen Funktion oder Methode, die eine Anzahl für die Eingabe erwartet nicht automatisch übernehmen, was. Die InputBox-Methode wurde entwickelt, um eine Zeichenfolge zurückzugeben, und diese Zeichenfolge muss konvertiert werden, aber Sie müssen Methoden verwenden, die wissen, wie eine Zeichenfolge analysiert wird. Andernfalls führen Methoden, die nicht für die Verarbeitung nicht-numerischer Werte (CInt) ausgelegt sind, zu Ausnahmen.

Stattdessen sollten Sie eine Art von Parsing versuchen und die NET-Bibliothek bietet viele Tools zu verwenden. In Ihrem Fall die richtige ist Int32.TryParse

Dim remainingSticks As Integer 
Dim userInput = InputBox("How many matchsticks .....") 
If Int32.TryParse(userInput, remainingSticks) Then 
    .... ok your remainingStick contains the converted value 
Else 
    MessageBox.Show("You should type a valid integer number between 5-25") 

Die Int32.TryParse an Ihrer Eingabestring suchen und versuchen, auf einen gültigen Integer-Wert zu konvertieren. Wenn es erfolgreich ist, dann enthält der zweite Parameter die konvertierte Ganzzahl und gibt True zurück, wenn sie fehlschlägt, gibt sie false zurück und Ihr zweiter Parameter hat den Standardwert Null.

Natürlich nach einer erfolgreichen Umwandlung in einer ganzen Zahl Ihres nicht mehr benötigen einen Scheck mit IsNumeric

+0

Vielen Dank! Das hat funktioniert! – Trapper100

+0

Ich bin froh, Ihnen helfen zu können. Als neuer Benutzer der Seite empfehle ich das Lesen von [Wie funktioniert die Annahme einer Antwort?] (Http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Steve

0

Sie sollten

dim st als String

st = ein String-Variable in der inputbox verwenden InputBox ("Wie viele Streichhölzer würden Sie gerne (5-25)?", "Anzahl der Spiele Wählen Sie!"))

remainingSticks = val (st)

. . .

+0

'Val' wird eine Ausnahme auslösen, wenn die Anzahl so groß ist, dass sie nicht in eine Ganzzahl umgewandelt werden kann. Außerdem ist es an der Zeit, all diese VB6-Kompatibilitätsfunktionen noch 2016 zu vergessen. – Steve

+0

lol @ forget vb6 Kompatibilität. . . Ich kann mir nicht helfen ich komme aus einem POWERBASIC Zeitalter,,, –