Meilleur auteur de réponses
Nommer une variable à partir de la valeur d'une autre variable (évaluer, concaténer)

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!
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".- Proposé comme réponse Alex Petrescu jeudi 24 mars 2011 10:19
- Marqué comme réponse Alex Petrescu vendredi 25 mars 2011 12:43
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 -
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
-
- Proposé comme réponse Alex Petrescu jeudi 24 mars 2011 10:10
-
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".- Proposé comme réponse Alex Petrescu jeudi 24 mars 2011 10:19
- Marqué comme réponse Alex Petrescu vendredi 25 mars 2011 12:43
-
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
-
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
________________
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.
-
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?
-
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 -
-
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?
-