none
Création d'une variable RRS feed

  • Question

  • Bonjour, j'ai commencé il y a de cela pas très longtemps à coder en Visual Basic. Le problème que je rencontre pour le moment est soit avec l'IDE ou la manière dont je m'y prends pour créer une variable. 

    Supposons que je veux créer la variable myStream pour utiliser avec OpenFileDialog(), je vais faire :

    Dim myStream = Nothing
    Cependant, lorsque j'arrive dans une condition If ou que je change de "sub", Microsoft visual basic me dit :

    Erreur	2	Le nom 'myStream' n'est pas déclaré.	C:\Documents and Settings\Francis Santerre\Local Settings\Application Data\Temporary Projects\WindowsApplication1\Form1.vb	20	21	WindowsApplication1
    
    Puis si j'utilise la même méthode que sur le site msdn :

    Dim myStream As Stream = Nothing
    On me dit que Stream n'est pas définie...
    mercredi 6 janvier 2010 21:10

Réponses

  • Bonjour,

    Je ne sais pas si j'ai tout compris, toutefois, venant de commencer depuis deux mois en vbNet (depuis vb6), j'ai eu un problème similaire avec les "if" et peut être avec d'autres structures dans le futur, tout se passe comme si une variable déclarée dans un "if", devenait la propriété exclusive de ce dernier (sous-locale), sans doute qu'il y a une explication en littérature, et peut être un moyen de contourner le problème :

    Moi même il y a peu, j'ai eu un tel problème, comme suit

    sub procédure
     Je déclarais un chemin avec son fichier puis
     if chemin+fichier existe alors
       variable P : pointeur sur le chemin+fichier
       On lit...
      else
       variable P : pointeur sur le chemin+fichier
       On crée vide
     end if
     Puis je trouvais normal de fermer mon fichier en commun après l'if,
     ce qui évitait de le fermer deux fois, mais ça me fut refusé pour les raisons que tu invoques.
     Je ne comprenais pas, pour moi je déclarais à la volée dans une procédure des variables locales,
     elles devaient toutes être accessibles dans cette procédure, et bien nom !
     Il me fallait soit déclarer les variables de façon différente, soit fermer dans les deux cas mon fichier !
    end sub


    Ce qui suit le démontre :

    Public Class Form1
      Dim z As Long
      public z2 as long
      Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x As Long = 3
        If x > 2 Then
          Dim y As Long = 5
        End If
        Y = 10 ' erreur = le nom y n'est pas déclaré
        x = 4
        z = 5
        z2 = 10
      End Sub
    End Class

    On peut alors constater qu'en entête de la classe, les variables sont soit publiques au programme,
    soit globales à la forme sans problème. Idem pour une procédure et je présume aussi une fonction,
    les variables locale ne causent aucun problème, en revanche, on le voit bien, quand une variable
    théoriquement locale à une procédure, est déclarée plus bas que son entête, à la volée dans
    une structure, ici un IF et une variable Y, et bien la portée de cette variable devient mystérieusement
    une variable locale de la structure ?

    Je l'ai constaté, j'en tiens compte, mais je n'ai effectué aucune recherche, et donc je suis
    incapable d'avancer une explication que les exégètes sauront fournir de par leur érudition...

    De facto, afin de résoudre ton problème, il faut manifestement tout déclarer en entête de la procédure, et si ça concerne plusieurs procédures, déclarer la variable en entête de la classe, ou alors utiliser les fonctions.

    Cordialement.

     


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    • Marqué comme réponse santerref jeudi 7 janvier 2010 04:03
    jeudi 7 janvier 2010 02:31

Toutes les réponses

  • Bonjour,

    Je ne sais pas si j'ai tout compris, toutefois, venant de commencer depuis deux mois en vbNet (depuis vb6), j'ai eu un problème similaire avec les "if" et peut être avec d'autres structures dans le futur, tout se passe comme si une variable déclarée dans un "if", devenait la propriété exclusive de ce dernier (sous-locale), sans doute qu'il y a une explication en littérature, et peut être un moyen de contourner le problème :

    Moi même il y a peu, j'ai eu un tel problème, comme suit

    sub procédure
     Je déclarais un chemin avec son fichier puis
     if chemin+fichier existe alors
       variable P : pointeur sur le chemin+fichier
       On lit...
      else
       variable P : pointeur sur le chemin+fichier
       On crée vide
     end if
     Puis je trouvais normal de fermer mon fichier en commun après l'if,
     ce qui évitait de le fermer deux fois, mais ça me fut refusé pour les raisons que tu invoques.
     Je ne comprenais pas, pour moi je déclarais à la volée dans une procédure des variables locales,
     elles devaient toutes être accessibles dans cette procédure, et bien nom !
     Il me fallait soit déclarer les variables de façon différente, soit fermer dans les deux cas mon fichier !
    end sub


    Ce qui suit le démontre :

    Public Class Form1
      Dim z As Long
      public z2 as long
      Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x As Long = 3
        If x > 2 Then
          Dim y As Long = 5
        End If
        Y = 10 ' erreur = le nom y n'est pas déclaré
        x = 4
        z = 5
        z2 = 10
      End Sub
    End Class

    On peut alors constater qu'en entête de la classe, les variables sont soit publiques au programme,
    soit globales à la forme sans problème. Idem pour une procédure et je présume aussi une fonction,
    les variables locale ne causent aucun problème, en revanche, on le voit bien, quand une variable
    théoriquement locale à une procédure, est déclarée plus bas que son entête, à la volée dans
    une structure, ici un IF et une variable Y, et bien la portée de cette variable devient mystérieusement
    une variable locale de la structure ?

    Je l'ai constaté, j'en tiens compte, mais je n'ai effectué aucune recherche, et donc je suis
    incapable d'avancer une explication que les exégètes sauront fournir de par leur érudition...

    De facto, afin de résoudre ton problème, il faut manifestement tout déclarer en entête de la procédure, et si ça concerne plusieurs procédures, déclarer la variable en entête de la classe, ou alors utiliser les fonctions.

    Cordialement.

     


    Joe ___ Romans et Logiciels ___ http://irolog.free.fr
    • Marqué comme réponse santerref jeudi 7 janvier 2010 04:03
    jeudi 7 janvier 2010 02:31
  • Merci bien. C'est tout à fait le problème que j'avais et je m'en doutais qu'il fallait bien les déclarer au départ, cependant je n'avais essayé qu'au début de la procédure et comme tu le dis, j'en est plusieurs donc il faut que je déclare ma variable au début de la classe !

    Désolé si ma question n'était pas claire, j'étais très pressé lors de sa rédaction.

    Santerref.
    jeudi 7 janvier 2010 03:54
  • Joe,

    Merci bien pour une telle détaillée réponse J

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    vendredi 8 janvier 2010 15:17