none
Nommer une variable à partir de la valeur d'une autre variable (évaluer, concaténer) RRS feed

  • Question

  • Bonjour,
    Je suis débutant (donc, merci d'avance pour votre compréhension
    Voila, j'ai jusqu'à présent programmé en ActionScript, et je veux porter mon application en VB.

    En ActionScript, je pouvais déclarer dynamiquement une variable et lui donnant une valeur extraite d'une autre variable (concaténation).
    Je lisais un fichier XML comprenant: 'nom de l'article', 'valeur', 'poids', 'couleur',...
    et je pouvais, à la volée, créer un tableau (à moins que ce ne soit un objet avec des propriétés?!), dont l'écriture se faisait ainsi:

    * la variable 'article' récupère la valeur venant d'un fichier xml
    article = this.firstChild.attributes.name
    (ex: article= avion)
    * cette valeur est alors utilisée dans la déclaration d'un nouvel objet, portant comme nom la valeur de cette variable
    _root[article] = {poids:Xmlpoids, couleur:Xmlcouleur, prix:Xmlprix};

    Sur Flash, cette concaténation se faisait par l'usage des [] autour du nom.
    Quand on agit de cette façon dans Flash, que ce soit pour lire ou écrire, le texte compris entre les [] est alors évalué comme étant le nom de l'objet/variable/tableau

    Remarqué également qu'au passage, des propriétés sont créées (poids,couleur,prix) et remplies des valeurs venant du fichiers XML


    Donc..;-) comment puis arriver à cette même "souplesse" avec VB: créer un objet dynamiquement, en le nommant (en l'évaluant) à partir d'une valeur d'une autre variable...et en lui créant/attribuant des propriétés au passage?!
    (et si ce n'est pas possible, comment dois-je m'y prendre autrement?)

    Je vous remercie de m'avoir lu, j'espère que j'ai été clair...et d'avance merci pour votre aide!
    dimanche 20 mars 2011 00:49

Réponses

  • Bonjour,

    Cela ressemble plutôt à l'utilisation d'un simple tableau dont l'index peut-être alphanumérique ("associative arrays" à http://www.actionscript.org/resources/articles/89/2/Arrays-in-ActionScript/Page2.html).

    Côté .NET on pourrait utiliser un "dictionnaire" (http://msdn.microsoft.com/fr-fr/library/xfhwa508.aspx). Par exemple :

      Private Class Data
        Public Property Poids As Decimal
        Public Property Couleur As String
        Public Property Prix As Decimal
      End Class
    
      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim d As New Dictionary(Of String, Data)
        d.Add("avion", New Data With {.Poids = 15, .Couleur = "Bleu", .Prix = 15000})
        d.Add("vélo", New Data With {.Poids = 0.02, .Couleur = "Rouge", .Prix = 7})
        MessageBox.Show(d("vélo").Poids)
      End Sub
    

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 mars 2011 10:07
    Modérateur

Toutes les réponses

  • Bonjour jmdeb,

    Habituellement on déclare avant le nom de la variable, si c'est une question de tableau on peut utiliser:

    Dim variable() as le_type ' variableà tableau vide
    ' ... code permettant de connaître la taille du tableau
    ReDim variable(x) ' indication tableau en cours de code
    
    

    Sinon, peut être est-il possible avec AdressOff de faire ceci, mais hélas je ne sais pas assez bien le manipuler (sous réserve)...

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    dimanche 20 mars 2011 11:39
  • Je ne suis pas sûr d'avoir tout compris.... Peut-être que si tu postais le code de départ un peu plus longuement cela permettrait de savoir exactement ce que tu souhaites.


    Cordialement
    Pascal
    http://www.scalpa.info
    • Modifié scalpa dimanche 20 mars 2011 17:54 orthographe
    dimanche 20 mars 2011 17:54
  • Bonjour Pascal,

    Je crois qu'il voudrait un truc du genre :

    dim Var1 = "bonjour" as string

    Fasse :

    DIM nom du contenu de var1 AS type contenant var1

    soit :

    dim bonjour as string

    Y compris si c'est un tableau bonjour(10)

    ???

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    lundi 21 mars 2011 07:54
  • Bonjour,

    Cela ressemble plutôt à l'utilisation d'un simple tableau dont l'index peut-être alphanumérique ("associative arrays" à http://www.actionscript.org/resources/articles/89/2/Arrays-in-ActionScript/Page2.html).

    Côté .NET on pourrait utiliser un "dictionnaire" (http://msdn.microsoft.com/fr-fr/library/xfhwa508.aspx). Par exemple :

      Private Class Data
        Public Property Poids As Decimal
        Public Property Couleur As String
        Public Property Prix As Decimal
      End Class
    
      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim d As New Dictionary(Of String, Data)
        d.Add("avion", New Data With {.Poids = 15, .Couleur = "Bleu", .Prix = 15000})
        d.Add("vélo", New Data With {.Poids = 0.02, .Couleur = "Rouge", .Prix = 7})
        MessageBox.Show(d("vélo").Poids)
      End Sub
    

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    lundi 21 mars 2011 10:07
    Modérateur
  • Bonjour,

    Ah, j'ai déjà trouvé comment identifier le type de la variabl :

    Option Explicit On
    Public Class Form1
    	Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    		Dim re As Boolean	' réponse
    		Dim letype As String = ""	' type de la variable
    		Dim i As Integer
    		'----------------
    		Dim vr As Decimal	' type de la variable recherchér = vr si STRING : mettre une "= valeur"
    		'----------------
    		Dim v01 As UShort = 1	' type de variable à tester
    		Dim v02 As Short = 1
    		Dim v03 As Char = "a"
    		Dim v04 As Byte = 1
    		Dim v05 As SByte = 1
    		Dim v06 As Boolean = False
    		Dim v07 As Integer = 1
    		Dim v08 As UInteger = 1
    		Dim v09 As Long = 1
    		Dim v10 As ULong = 1
    		Dim v11 As Single = 1
    		Dim v12 As Double = 1
    		Dim v13 As Decimal = 1
    		Dim v14 As Date = "12/02/2011"
    		Dim v15 As String = "test"
    		Dim v16 As Object = Nothing
    		'
    		For i = 1 To 16
    			re = False
    			Select Case i
    				Case 1 : re = Object.ReferenceEquals(vr.GetType(), v01.GetType())
    				Case 2 : re = Object.ReferenceEquals(vr.GetType(), v02.GetType())
    				Case 3 : re = Object.ReferenceEquals(vr.GetType(), v03.GetType())
    				Case 4 : re = Object.ReferenceEquals(vr.GetType(), v04.GetType())
    				Case 5 : re = Object.ReferenceEquals(vr.GetType(), v05.GetType())
    				Case 6 : re = Object.ReferenceEquals(vr.GetType(), v06.GetType())
    				Case 7 : re = Object.ReferenceEquals(vr.GetType(), v07.GetType())
    				Case 8 : re = Object.ReferenceEquals(vr.GetType(), v08.GetType())
    				Case 9 : re = Object.ReferenceEquals(vr.GetType(), v09.GetType())
    				Case 10 : re = Object.ReferenceEquals(vr.GetType(), v10.GetType())
    				Case 11 : re = Object.ReferenceEquals(vr.GetType(), v11.GetType())
    				Case 12 : re = Object.ReferenceEquals(vr.GetType(), v12.GetType())
    				Case 13 : re = Object.ReferenceEquals(vr.GetType(), v13.GetType())
    				Case 14 : re = Object.ReferenceEquals(vr.GetType(), v14.GetType())
    				Case 15 : re = Object.ReferenceEquals(vr.GetType(), v15.GetType())
    				Case 16 : re = Object.ReferenceEquals(vr.GetType(), v16.GetType())
    			End Select
    			If re = False Then Continue For
    			Select Case i
    				Case 1 : letype = "v" & Format(i, "00") & " est de type UNSIGNED SHORT"
    				Case 2 : letype = "v" & Format(i, "00") & " est de type SHORT"
    				Case 3 : letype = "v" & Format(i, "00") & " est de type CHAR"
    				Case 4 : letype = "v" & Format(i, "00") & " est de type BYTE"
    				Case 5 : letype = "v" & Format(i, "00") & " est de type SIGNED BYTE"
    				Case 6 : letype = "v" & Format(i, "00") & " est de type BOOLEAN"
    				Case 7 : letype = "v" & Format(i, "00") & " est de type INTEGER"
    				Case 8 : letype = "v" & Format(i, "00") & " est de type UNSIGNED INTEGER"
    				Case 9 : letype = "v" & Format(i, "00") & " est de type LONG"
    				Case 10 : letype = "v" & i & " est de type UNSIGNED LONG"
    				Case 11 : letype = "v" & i & " est de type SINGLE"
    				Case 12 : letype = "v" & i & " est de type DOUBLE"
    				Case 13 : letype = "v" & i & " est de type DECIMAL"
    				Case 14 : letype = "v" & i & " est de type DATE"
    				Case 15 : letype = "v" & i & " est de type STRING"
    				Case 16 : letype = "v" & i & " est de type OBJET"
    			End Select
    			If re = True Then
    				MsgBox("La variable " & letype, vbInformation)
    				End
    			End If
    		Next
    		MsgBox("Type indéterminé", vbExclamation)
    		End
    	End Sub
    End Class
    
    
    

    Reste à récupérer son contenu pour s'en servir afin de déclarer une autre variable ...

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe mercredi 23 mars 2011 16:36
    mardi 22 mars 2011 09:10
  • Bonjour,

     

    Jmdeb, est-ce que ces réponses vous ont mis sur la bonne voie ? Si vous avez besoin d’assistance supplémentaire, n’hésitez pas de nous contacter.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     


    Suivez MSDN sur Twitter 

    jeudi 24 mars 2011 10:20
  • Merci à tous pour vos informations!

    Patrice Scribe, c'est exactement cela, un tout grand merci pour votre réponse qui est exactement ce que je cherchais! Merci!

    Private Class Data
     Public Property Poids As Decimal
     Public Property Couleur As String
     Public Property Prix As Decimal
     End Class
    
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     Dim d As New Dictionary(Of String, Data)
     d.Add("avion", New Data With {.Poids = 15, .Couleur = "Bleu", .Prix = 15000})
     d.Add("vélo", New Data With {.Poids = 0.02, .Couleur = "Rouge", .Prix = 7})
     MessageBox.Show(d("vélo").Poids)
     End Sub

    J'ai une question (en relation directe avec la méthode que vous venez de m'exposer...dois je créer un nouveau Topic?).

    J'utilise la méthode que vous m'avez recommandé pour un dictionnaire de +/- 10.000 clés. Et je dois maintenant pouvoir faire une recherche rapide (binary search?!) sur une des valeurs de la classe!!

    Donc, sans connaitre la clé, je dois faire une recherche sur une des variable de la classe...et trouver quelle clé contient cette valeur.

    Ex: en reprenant le code ci-dessus: comment faire pour à partir d'une indication sur le prix (.Prix=7), retrouver le nom de la clé ("vélo")

    J'espère que je suis assez clair, et d'avance je vous remercie du temps que vous voudrez bien prendre pour m'aider.

    Merci

     

    PS: Comme il y a beaucoup d'éléments je me disais qu'il faudrait l'équivalent d'un "binary search", et si c'est le cas effectuer d'abord un tri sur une de valeur de la classe (ex:.Prix)...Est possible? Est le bonne direction?


    jeudi 24 mars 2011 23:06
  • Bonjour JMDeb,

    Pour reprendre le magnifique exemple de Patrice voila une solution:

     

    Public Class Form1
     Dim dico As New Dictionary(Of String, Data)
     Private Class Data
     Public Property Poids As Decimal
     Public Property Couleur As String
     Public Property Prix As Decimal
     End Class
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
     dico.Add("avion", New Data With {.Poids = 15, .Prix = 100, .Couleur = "bleu"})
     dico.Add("velo", New Data With {.Poids = 10, .Prix = 17, .Couleur = "rouge"})
     MessageBox.Show(dico("velo").Poids)
    
     For Each item As Object In dico
      'MessageBox.Show(item.key)
      'MessageBox.Show(dico(item.key).Couleur)
      If dico(item.key).Prix = 17 Then
      MessageBox.Show(item.key + " a un prix de 17")
      End If
     Next
    
     End Sub
    
    End Class
    
    


    fred
    vendredi 25 mars 2011 03:01
  • Voici comment adresser les autres membres de DATA

     

     

     If dico(item.key).Prix = 17 Then
     MessageBox.Show(item.key + " a un prix de 17" + " et une couleur " 
    + dico(item.key).Couleur + " et un poids de " + dico(item.key).Poids.ToString())

     


    fred
    vendredi 25 mars 2011 03:14
  • fred75, merci pour ton aide!
    J'ai essaié..et ca marche ;-)

    Je voudrais te faire part d'un test que j'ai fait, après avoir évalué le temp de l'opération sur mes 10.000 objets: 2.4 sec
    J'avais (déjà) créé une list (listArray) qui contenait uniquement les clés (avion, velo,...)
    Je me suis servi de cette liste pour "m'adresser" au dictionaire (itemDB), voila ce que cela donne (on est ici dans la lecture d'un fichier texte, regarder si la ligne de texte correspond à la valeur .descript du dictionaire, et si c'est vrai, met la valeur .favorite sur True)

    Do ligne = readFile.ReadLine() 
     Dim i As Integer = 0 
     Do 
      If itemDB(listArray(i)).descript = ligne Then 
       itemDB(listArray(i)).favorite = True 
       Exit Do 
      End If 
      i += 1 
      Loop Until i = listArray.Count - 1
    Loop Until ligne Is Nothing
    

    Et bien figures toi que de cette façon, le temp d'exécution passe à 0.06 sec (et 0.04 après avoir pensé introduire le 'exit do' pour sortir de la boucle quand la condition avait été rencontrée, car en effet cette valeur est unique et ne peut etre rencontrée qu'une fois dans le dictionnaire)

    Qu'est ce que tu en penses?

    vendredi 25 mars 2011 11:29
  • Bonjour JM,

    C'est bien pour le exit do, cela permet de baisser le temps d'éxécution.

    Moi je préfère mettre lire un fichier et le mettre dans une arrayliste et ensuite faire des recherches dans mon array. Cela limite les accès disques (I/O)

     

     


    fred
    vendredi 25 mars 2011 15:35