amorealex Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Θα ήθελα μια βοήθεια γιατί έχω κολλήσει. Έχω ένα Inputbox όπου ζητάω από το χρήστη να γράψει έναν ακέραιο αριθμό. Χρησιμοποιώντας την IsNumeric εξασφάλισα ότι δεν θα γράψει χαρακτήρα. Πως θα εξασφαλίσω όμως ότι δεν θα γράψει δεκαδικό? πχ 4,5 ή 4.5? Υπόψη, δεν θέλω αν γράψει δεκαδικό, να πάρω μόνο το ακέραιο μέρος. Θέλω να μην τον αφήνει καθόλου και να πετάει μήνυμα. Γίνεται?
kostas_crete Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Χρησιμοποίησε το change event του inputbox για να ελέγχεις κάθε φορά που θα αλλάξει το κείμενο αν το περιεχόμενο είναι αριθμός με την val function. Δες και αυτό: http://msdn2.microsoft.com/en-us/library/k7beh1x9.aspx
amorealex Δημοσ. 25 Μαρτίου 2007 Μέλος Δημοσ. 25 Μαρτίου 2007 Δυστυχώς η 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
amorealex Δημοσ. 25 Μαρτίου 2007 Μέλος Δημοσ. 25 Μαρτίου 2007 Τελικά έφτιαξα μια συνάρτηση και όλα καλά: >Function IsInt(Expression) As Boolean IsInt = IsNumeric(Expression) And (InStr(1, Expression, ",") = 0) And (InStr(1, Expression, ".") = 0) End Function
Dionisos Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 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]
amorealex Δημοσ. 27 Μαρτίου 2007 Μέλος Δημοσ. 27 Μαρτίου 2007 Με τον πρώτο κώδικα, συνεχίζει να ζητάει τιμή ακόμη κι αν δώσω ακέραιο. Τον δεύτερο κώδικα ομολογω πως δεν τον πολυκατάλαβα. Υπόψη ότι είμαι αρχάριος και ακόμη ψάχνομαι
PavelX Δημοσ. 27 Μαρτίου 2007 Δημοσ. 27 Μαρτίου 2007 Μπορείς να κάνεις κάτι πολύ πιο απλό. >Mins = InputBox("Δώστε λεπτά", "Λεπτά", 1) If Mins = Int(Mins) Then 'Είναι ακέραιος Else 'Δεν είναι ακέραιος End If
Dionisos Δημοσ. 27 Μαρτίου 2007 Δημοσ. 27 Μαρτίου 2007 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 όταν δεν είναι.
amorealex Δημοσ. 27 Μαρτίου 2007 Μέλος Δημοσ. 27 Μαρτίου 2007 Μπορείς να κάνεις κάτι πολύ πιο απλό. >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?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.