Προς το περιεχόμενο

Έλεγχος δεδομένων σε Inputbox (VB6)


amorealex

Προτεινόμενες αναρτήσεις

Δημοσ.

Θα ήθελα μια βοήθεια γιατί έχω κολλήσει.

 

Έχω ένα Inputbox όπου ζητάω από το χρήστη να γράψει έναν ακέραιο αριθμό.

 

Χρησιμοποιώντας την IsNumeric εξασφάλισα ότι δεν θα γράψει χαρακτήρα.

Πως θα εξασφαλίσω όμως ότι δεν θα γράψει δεκαδικό? πχ 4,5 ή 4.5?

 

Υπόψη, δεν θέλω αν γράψει δεκαδικό, να πάρω μόνο το ακέραιο μέρος. Θέλω να μην τον αφήνει καθόλου και να πετάει μήνυμα.

 

Γίνεται?

Δημοσ.

Δυστυχώς η Val δεν κάνει αυτό που θέλω.

Παραθέτω ένα απόσπασμα από τον κώδικα, μήπως γίνω πιο κατανοητός:

>Mins = InputBox("Δώστε λεπτά", "Λεπτά", 1)
       If Mins = "" Then
           Exit Sub
       End If
       
       If Mins >= 0 And Mins < 60 And IsNumeric(Mins) Then
           lblMin.Caption = Format(Mins, "00")
       Else
           MsgBox "Δώστε ακέραιο αριθμό μεγαλύτερο ή ίσο με μηδέν με μέγιστο το 59", vbOKOnly + vbCritical
           GoTo Mins
       End If

Θέλω λοιπόν να βάλω άλλο ένα If που να ελέγχει αν ο αριθμός είναι δεκαδικός και αν είναι να επιστρέφει μήνυμα. Κάπως έτσι δηλαδή:

>[b]If Mins=Δεν είναι Δεκαδικός Then[/b]
           lblMin.Caption = Format(Mins, "00")
        Else
           MsgBox "Δώστε ακέραιο αριθμό μεγαλύτερο ή ίσο με μηδέν με μέγιστο το 59", vbOKOnly + vbCritical
           GoTo Mins
       End If

Δημοσ.

Τελικά έφτιαξα μια συνάρτηση και όλα καλά:

 

>Function IsInt(Expression) As Boolean
   IsInt = IsNumeric(Expression) And (InStr(1, Expression, ",") = 0) And (InStr(1, Expression, ".") = 0)
End Function

Δημοσ.

Enas poly efkolos tropos gia na anakalypseis an o xrhsths sou edwse integer sto inputbox einai na 8eseis to periexomeno tou inputbox se ena Integer variable kai na xrhsimopoihseis error handling:

>
Dim i as Integer
On Error Resume Next
Do
  i = InputBox("Enter an integer")
Loop Until Err=0

An dwsei integer tote to i einai o integer pou zhtas, an oxi, tote 8a 3anazhthsei enan integer apo to xrhsth.

 

Enas pio aplos tropos grafhs tou Function sou me error handling einai:

>
Function IsInt(Expression) As Boolean
   On Error Resume Next
   Dim i as Integer
   i = Expression
   IsInt = (Err=0)
End Function

[/code]

Δημοσ.

Με τον πρώτο κώδικα, συνεχίζει να ζητάει τιμή ακόμη κι αν δώσω ακέραιο.

Τον δεύτερο κώδικα ομολογω πως δεν τον πολυκατάλαβα.

 

Υπόψη ότι είμαι αρχάριος και ακόμη ψάχνομαι :-)

Δημοσ.

Μπορείς να κάνεις κάτι πολύ πιο απλό.

 

>Mins = InputBox("Δώστε λεπτά", "Λεπτά", 1)
If Mins = Int(Mins) Then
    'Είναι ακέραιος
Else
    'Δεν είναι ακέραιος
End If

Δημοσ.

Sorry, δική μου αμέλεια. Μέσα στο Do loop ξέχασα να θέσω το Err object να είναι 0.

>
Dim i as Integer
On Error Resume Next
Do
  Err = 0
  i = InputBox("Enter an integer")
Loop Until Err=0

Ο κώδικας στη συνάρτηση είναι απλός. Πρώτα απ' όλα ξεκινάς το error handling, ζητώντας να αγνοηθούν τα λάθη και να προχωρά στην επόμενη γραμμή αν βρει κάποιο (On Error Resume Next).

Μετά δημιουργείς μία μεταβλητή i που είναι Integer και προσπαθείς να βάλεις την τιμή του Expression στη μεταβλητή i. Αν το Expression είναι Integer, τότε δε θα έχεις πρόβλημα. Αν όμως είναι οτιδήποτε άλλο, τότε θα συμβεί το λάθος "Type mismatch". Η εντολή On error resume next λέει στον interpreter να αγνοήσει τη γραμμή που θα δώσει λάθος και έτσι περνάει στην επόμενη.

Η επόμενη γραμμή τσεκάρει αν το Err είναι 0 και αν είναι η συνάρτηση IsInt παίρνει την τιμή True, διαφορετικά παίρνει την τιμή False. Η εντολή IsInt = (Err=0) είναι ένας σύντομος τρόπος γραφής του κώδικα

>
If Err = 0 Then 
  IsInt = True
Else
  IsInt = False
End If

και δουλεύει γιατί στη VB ισχύει πάντα ο κανόνας

>
μεταβλητή = τιμή

Πρέπει λοιπόν η VB να μετατρέψει τον κώδικα που βρίσκεται δεξιά από το πρώτο = σε μία τιμή. Έτσι τσεκάρει αν το Err είναι 0 και δίνει True όταν είναι και False όταν δεν είναι.

Δημοσ.
Μπορείς να κάνεις κάτι πολύ πιο απλό.

 

>Mins = InputBox("Δώστε λεπτά", "Λεπτά", 1)
If Mins = Int(Mins) Then
    'Είναι ακέραιος
Else
    'Δεν είναι ακέραιος
End If

 

Το είχα δοκιμάσει, αλλά δεν εξυπηρετεί στην περίπτωσή μου.

Το μόνο που κάνει είναι αν δώσω δεκαδικό να κρατάει μόνο το ακέραιο μέρος, δηλαδή δίνω πχ 2,5 και κρατάει μόνο το 2.

 

 

Sorry, δική μου αμέλεια. Μέσα στο Do loop ξέχασα να θέσω το Err object να είναι 0.

>
Dim i as Integer
On Error Resume Next
Do
  Err = 0
  i = InputBox("Enter an integer")
Loop Until Err=0

 

Και σ' αυτή την περίπτωση κρατάει μόνο το ακέραιο μέρος αν δώσω δεκαδικό.

 

 

Ο κώδικας στη συνάρτηση είναι απλός. Πρώτα απ' όλα ξεκινάς το error handling, ζητώντας να αγνοηθούν τα λάθη και να προχωρά στην επόμενη γραμμή αν βρει κάποιο (On Error Resume Next).

Μετά δημιουργείς μία μεταβλητή i που είναι Integer και προσπαθείς να βάλεις την τιμή του Expression στη μεταβλητή i. Αν το Expression είναι Integer, τότε δε θα έχεις πρόβλημα. Αν όμως είναι οτιδήποτε άλλο, τότε θα συμβεί το λάθος "Type mismatch". Η εντολή On error resume next λέει στον interpreter να αγνοήσει τη γραμμή που θα δώσει λάθος και έτσι περνάει στην επόμενη.

Η επόμενη γραμμή τσεκάρει αν το Err είναι 0 και αν είναι η συνάρτηση IsInt παίρνει την τιμή True, διαφορετικά παίρνει την τιμή False. Η εντολή IsInt = (Err=0) είναι ένας σύντομος τρόπος γραφής του κώδικα

>
If Err = 0 Then 
  IsInt = True
Else
  IsInt = False
End If

και δουλεύει γιατί στη VB ισχύει πάντα ο κανόνας

>
μεταβλητή = τιμή

Πρέπει λοιπόν η VB να μετατρέψει τον κώδικα που βρίσκεται δεξιά από το πρώτο = σε μία τιμή. Έτσι τσεκάρει αν το Err είναι 0 και δίνει True όταν είναι και False όταν δεν είναι.

 

Αυτό που δεν καταλαβαίνω είναι τι δηλώνεις στη συνάρτηση IsInt?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...