Question de base sur les types de variables...

Signaler
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011
-
Messages postés
14821
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 septembre 2021
-
[b]Bjr à tous,

Je ne comprends pas pourquoi quand je rentre un nombre naturel, comme 3 ou 9, dans l'objet texte "txt.node", le message "Please enter a positive integer" apparaît.../b


Private Sub cmd_node_Click()
If VarType(txt_node.Text) = vbInteger Then
MsgBox ("Ok")
Else
MsgBox ("Please enter a positive integer.")
txt_node.Text = ""
End If
End Sub

D'avance, merci pour votre réponse

21 réponses

Messages postés
44
Date d'inscription
dimanche 8 septembre 2002
Statut
Membre
Dernière intervention
13 janvier 2014

[b]if Clng(txt_node.Text)>=0 then msgbox.....
ou Cint(txt_node.Text)....../b
Devrait marcher
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
Salut
txt_node.Text est du type string
donc ce n'est pas un vbinteger

mais si tu veux verifier le contenu du textbox
en net
Dim val As Integer
        Try
            val = Integer.Parse(TextBox4.Text)
        Catch ex As Exception
            MessageBox.Show("Please enter a positive integer")
            TextBox4.Text = String.Empty
        End Try
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

re,

ricky84, j'ai essayé mais ca ne fonctionne pas mieux....

shayw, je dois travailler qur vb 2005, c'est pour les cours donc je ne peux pas utiliser ce que je veux....

merci
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

Bonjour,

@ShayW: perso j'aurais utilisé Integer.TryParse, mais c'est juste pour chipoter

@anecaca: Le code de Shayw est parfaitement valide en vb2005 et si ton prof te suggère d'utiliser VarType ou MsgBox (qui je le rappelle sont des méthodes VB6 présentes UNIQUEMENT pour la compatibilité des anciens programmes) tu devrais changer de prof ou si c'est impossible lui faire remarquer que vous faire apprendre avec des méthodes obsolètes risque de vous donner des mauvaises habitudes et que ce n'est pas dans votre intérêt.

Cordialement !
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
ou dit au prof de s'inscrire au forum

c'est quoi la différence avec Integer.TryParse ?
Messages postés
14821
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 septembre 2021
156
Bonjour,

Parse, traduit l'information, et si une erreur survient, une exception est levée
TryParse, essaye de traduire, en cas d'échec, elle retourne False, sinon True (pas d'exception).

Mon site
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
merci Henry
donc il n'y a pas vraiment de règle quand
utiliser l'un ou l'autre
Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

Personnellement je recommenderais l'utilisation de TryParse, en effet la gestion des exceptions est un mécanisme lourd (aussi bien en terme de lisibilité/maintenabilité qu'en terme de performance) et donc si on peut l'éviter c'est mieux.

TryParse ne déclenche pas d'erreur, mais récupère le résultat de la conversion dans une variable ByRef en plus d'indiquer si la conversion a réussie ou échouée.
Dim result As Integer = 42
If Integer.TryParse(valueToParse, result) Then
    ' result contient mon nombre
Else
    ' traiter le problème (au besoin)
    ' result vaut 0 (il a perdu sa valeur 42)
End If


Sinon d'un point de vue fonctionnement, les deux méthodes utilisent quasiment le même code sauf que Parse déclenche des Exception là où TryParse se contente de renvoyer False.

Pour résumer, si l'on est absolument sûr que la valeur passée est valide, alors on peut utiliser Parse (pour la simplicité de la syntaxe sans Try/Catch) sinon TryParse.
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

hey!
perso je suis vraiment naze...
donc je ne comprends pas pourquoi mon code ne fonctionne pas

Private Sub cmd_node_Click() 
'If VarType(txt_node.Text) = vbInteger Then remplacé par
If VarType(val(txt_node.Text)) = vbInteger Then
MsgBox ("Ok") 
Else 
MsgBox ("Please enter a positive integer.") 
txt_node.Text = "" 
End If 
End Sub


J'ai quand meme essayé ces deux codes mais il m'indique une "compile error expected: expression"
Integer.Parse
Integer.TryParse


Enfin j'ai entré le code de Shayw et Sehnsucht en remplaçant ce qu'il fallait et ça ne fonctionne pas.

Ce que je veux c'est bien obliger mon utilisateur à entrer un nombre entier et pas vérifier ce qu'il a mis dedans...

Il se peut que je vous paraisse stupide, mes questions ne sont surement pas très évoluées, mais je n'ai pas poster le message sur le forum débutant pour rien... .

Merci pour vos réponses déjà postées
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
envoie le code que tu as écris
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

Option Explicit
Global nodenbr As Single
Global barrenbr As Single
Global appuinbr As Single
Global forcenbr As Single


Private Sub cmd_node_Click()
    If Val(txt_node.Text) < 0 Then
            b = -Val(txt_node.Text)
            If MsgBox("did you mean" & Str(b) & "?", vbYesNo) = vbYes Then
                txt_node.Text = b
                If Val(txt_node.Text) > 100 Then
                    If MsgBox("That's a lot of nodes! Are you sure?", vbYesNo) = vbYes Then
                        nodenbr = Val(txt_node.Text)
                        lbl_nodecoor.Enabled = True
                        Txt_node_x.Enabled = True
                        txt_node_y.Enabled = True
                        ReDim xnode(1 To nodenbr)
                        ReDim ynode(1 To nodenbr)
                    Else
                        txt_node.Text = ""
                    End If
                Else
                    nodenbr = Val(txt_node.Text)
                    lbl_nodecoor.Enabled = True
                    Txt_node_x.Enabled = True
                    txt_node_y.Enabled = True
                    ReDim xnode(1 To nodenbr)
                    ReDim ynode(1 To nodenbr)
                End If
            End If
    ElseIf VarType(val(txt_node.Text)) = vbInteger Then
        If txt_node.Text = "" Then
            MsgBox "No node entered!"
        ElseIf Val(txt_node.Text) > 100 Then
            If MsgBox("That's a lot of nodes! Are you sure?", vbYesNo) = vbYes Then
                nodenbr = Val(txt_node.Text)
                lbl_nodecoor.Enabled = True
                Txt_node_x.Enabled = True
                txt_node_y.Enabled = True
                ReDim xnode(1 To nodenbr)
                ReDim ynode(1 To nodenbr)
                txt_node.Text = ""
            End If
        Else
            nodenbr = Val(txt_node.Text)
            lbl_nodecoor.Enabled = True
            Txt_node_x.Enabled = True
            txt_node_y.Enabled = True
            ReDim xnode(1 To nodenbr)
            ReDim ynode(1 To nodenbr)
        End If
    Else
        MsgBox ("Please enter a positive integer.")
            txt_node.Text = ""
    End If
End Sub


En fait ça marchait a la base et puis je ne sais pas ce qui s'est passé et ça ne fonctionne plus.
Messages postés
14821
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 septembre 2021
156
Bonjour,

TU ES EN VB6, pas en .NET, tu t'es trompé de catégorie.
ReDim xnode(1 To nodenbr)
n'existe pas en .NET, tous les tableaux partent de 0

Du coup, pas de Integer.Parse & co.

A la place de copier partout :
Val(txt_node.Text)
Mets la valeur dans une variable temporaire.

ElseIf VarType(val(txt_node.Text)) = vbInteger Then
Si je ne me trompe pas, Val retourne un Variant/Double, essayes plutôt un CInt ou CLng.

De base, préfère utiliser des Long à la place des Integer, c''est plus adapté sur les processeurs récents (32 bits).

Mon site
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
Est tu sure que c'est du vb.net?
c'est du vb6 !!
As tu besoin de pogrammer en vb6 ou vb.net ?
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

ben le forum s'appelle VB 2005 et vb.net et oui je code en vb 2OO5 c'est ce que j'avais écris à shayw.... désolée
le truc de cInt ou Clng je dois le mettre ou?

Private Sub cmd_node_Click()
    n = Val(txt_node.Text)
    If n < 0 Then
            b = -n
            If MsgBox("did you mean" & Str(b) & "?", vbYesNo) = vbYes Then
                txt_node.Text = b
                If n > 100 Then
                    If MsgBox("That's a lot of nodes! Are you sure?", vbYesNo) = vbYes Then
                        nodenbr = n
                        lbl_nodecoor.Enabled = True
                        Txt_node_x.Enabled = True
                        txt_node_y.Enabled = True
                        ReDim xnode(1 To nodenbr)
                        ReDim ynode(1 To nodenbr)
                    Else
                        txt_node.Text = ""
                    End If
                Else
                    nodenbr = n
                    lbl_nodecoor.Enabled = True
                    Txt_node_x.Enabled = True
                    txt_node_y.Enabled = True
                    ReDim xnode(1 To nodenbr)
                    ReDim ynode(1 To nodenbr)
                End If
            End If
    'ElseIf VarType(n) vbcint Then et ElseIf VarType(n) cint Then ne fonctionne pas... ni avec clng
        If txt_node.Text = "" Then
            MsgBox "No node entered!"
        ElseIf n > 100 Then
            If MsgBox("That's a lot of nodes! Are you sure?", vbYesNo) = vbYes Then
                nodenbr = n
                lbl_nodecoor.Enabled = True
                Txt_node_x.Enabled = True
                txt_node_y.Enabled = True
                ReDim xnode(1 To nodenbr)
                ReDim ynode(1 To nodenbr)
                txt_node.Text = ""
            End If
        Else
            nodenbr = n
            lbl_nodecoor.Enabled = True
            Txt_node_x.Enabled = True
            txt_node_y.Enabled = True
            ReDim xnode(1 To nodenbr)
            ReDim ynode(1 To nodenbr)
        End If
    Else
        MsgBox ("Please enter a positive integer.")
            txt_node.Text = ""
    End If
End Sub



Sur quel furum dois je me mettre alors?
merci
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
52
tu marques je code en vb2005
ce n'est pas du vb6
mais ton code est en vb6
Donc choisi vb6 ou vb.net ne mélange pas les deux
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

il y a t'il beaucoup de différence entre visual basic 2005 et visual basic 2006? et vb2005 et visual basic 2005 c'est pas la meme chose? lol quel débutante de la première heure!!
Messages postés
14821
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 septembre 2021
156
Bonjour,

Je vais le refaire :
ReDim xnode(1 To nodenbr)
Le fait d'avoir un "To" dans cette ligne signale que tu n'es pas sur .NET !!!
Les tableaux en, .NET commencent tous à 0.

Pour le forum, il faudra faire attention lors de tes prochains messages à bien les mettre dans la bonne catégorie (la pertinence de l'aide est bien plus grande dans ce cas).

CLng et Cint, je les ais proposé pour remplacer Val.

Mon site
Messages postés
14821
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 septembre 2021
156
Bonjour,

Ce n'est pas VB 2006, mais VB6, il date d'avant VB.NET 2002.
Il est périmé et plus maintenu depuis plusieurs années.

Mon site
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

ok j'ai remplacer val par cint ou par clng il ne me dit pas qu'il y a des erreurs dans le code mais il ne reconnais tjs pas 9 comme un code par contre si je mets un négatif la procédure fonctionne...
a part qu'il ne veut pas redimensionner mes vecteurs...
Messages postés
30
Date d'inscription
jeudi 24 février 2011
Statut
Membre
Dernière intervention
24 avril 2011

lol merci pour l'info... je pensais que vb2005 et vb5 c'était la même chose...
donc je code sur VB5 et pas sur 2005....