IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Contenu STRING pour adresser variable


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Contenu STRING pour adresser variable
    Bonjour, débutant en .net je suis en train de développer une petite appli perso.

    J'ai donc une Structure qui contient différents tableaux (appelés A(), E(), EA(), SA(), etc...) qui sont composés d'éléments issus d'une autre structure (avec des champs Champ1 as string, champ2 as boolean, etc...).

    J'ai une variable Var qui est du type de ma structure de tableaux et dans une partie de mon code, j'extrais des données d'un fichier qui en fonction d'une première valeur du genre "A50", "E100" me permet d'aller ranger les données suivantes dans Var.A(50).champ1, Var.A(50).champ2 ou Var.E(100).champ1, Var.E(100).champ2.

    Pour ce faire, je décompose le "A50" en "A" (rangé dans maSTRING) et 50 (rangé dans i), puis j'ai un select case sur maSTRING avec des cases "A", "E", etc... et dans chaque case, j'ai:
    Var.A(i).champ1=truc (lu dans le fichier)
    Var.A(i).champ2=bidule (lu dans le fichier)
    ou
    Var.E(i).champ1=truc (lu dans le fichier)
    Var.E(i).champ2=bidule (lu dans le fichier)

    Ca marche bien, mais ce n'est pas trés élégant et du coup je me dis qu'on doit pouvoir faire mieux, beaucoup mieux.

    Existe-t-il une manière de se passer du SELECT CASE et d'écrire juste:
    var.[quelque chose qui regarde le contenu de maSTRING](I).champ1=truc
    var.[quelque chose qui regarde le contenu de maSTRING](I).champ2=bidule
    Mais ceci une seule fois.

    En plus dans le reste de mon appli, il va falloir que je retourne lire le contenu des champ1 et champ2 en fonction du "A50" ou "E100", si à chaque fois il faut que je me retape un select case, pas glop.

    C'est peut-être aussi ma manière de déclarer mes 2 structures (celle des tableaux et celle des champs) qui n'est pas terrible?

    Merci à vous si quelqu'un peut me donner un petit coup de main.

    ci-joint le "super code" en cause

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    ' Déclaration des types
    Public Structure TypeVariable
        Friend Mnemo As String
        Friend Libelle As String
        Friend Activee As Boolean
        Friend Utilisee As Boolean
        Friend Activation As ArrayList
        Friend Reset As ArrayList
    End Structure
     
    Public Structure MapingVariables
        Friend E() As TypeVariable
        Friend A() As TypeVariable
        Friend B() As TypeVariable
        Friend R() As TypeVariable
        Friend M() As TypeVariable
        Friend V() As TypeVariable
        Friend EA() As TypeVariable
        Friend SA() As TypeVariable
        Friend EN() As TypeVariable
        Friend SN() As TypeVariable
        Friend T() As TypeVariable
        Friend C() As TypeVariable
        Friend P() As TypeVariable
        Public Sub Initalise()
            ' Redimensionnement de la structure Var
            ReDim E(0 To 3000)
            ReDim A(0 To 3000)
            ReDim B(0 To 1023)
            ReDim R(0 To 1023)
            ReDim M(0 To 13823)
            ReDim EA(0 To 3000)
            ReDim SA(0 To 3000)
            ReDim EN(0 To 3000)
            ReDim SN(0 To 3000)
            ReDim V(0 To 1000)
            ReDim T(0 To 100)
            ReDim C(0 To 100)
            ReDim P(0 To 100)
            End Structure
     
    Public Class EcranPrincipal
     
        ' Déclaration des variables
     
        Dim Var As MapingVariables
     
        Private Sub ExtractionVariables(ByVal NomFichier As String)
     
            ' Extrait les données de NomFichier et les classes dans les tableaux associés
     
            Dim MonStreamReader As New StreamReader(NomFichier)
            Dim TypeDonnee As String
            Dim AdresseDonnee As Integer
     
            ' Redimensionnement de la structure Var
            Var.Initalise()
     
            ' Parcourir le fichier MNEMO.SAV jusqu'à la fin par série de 3 lignes
            ' - Adresse
            ' - Mnémonique
            ' - Libellé
            Do While MonStreamReader.Peek() >= 0
                ' Lecture de la ligne qui contient l'adresse
                TypeDonnee = MonStreamReader.ReadLine
     
                ' Recherche si le type de variable et sur 1 ou 2 caractères
                If Mid(TypeDonnee, 2, 1) Like "#" Then
                    AdresseDonnee = CInt(Microsoft.VisualBasic.Right(TypeDonnee, Len(TypeDonnee) - 1))
                    TypeDonnee = Microsoft.VisualBasic.Left(TypeDonnee, 1)
                Else
                    AdresseDonnee = CInt(Microsoft.VisualBasic.Right(TypeDonnee, Len(TypeDonnee) - 2))
                    TypeDonnee = Microsoft.VisualBasic.Left(TypeDonnee, 2)
                End If
     
                ' Classement des mnémo et libellé dans les index des types
                Select Case TypeDonnee
                    Case "E"
                        ' Sauvegarde du mnémonique
                        Var.E(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.E(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "A"
                        ' Sauvegarde du mnémonique
                        Var.A(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.A(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "B"
                        ' Sauvegarde du mnémonique
                        Var.B(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.B(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "R"
                        ' Sauvegarde du mnémonique
                        Var.R(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.R(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "M"
                        ' Sauvegarde du mnémonique
                        Var.M(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.M(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "V"
                        ' Sauvegarde du mnémonique
                        Var.V(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.V(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "EA"
                        ' Sauvegarde du mnémonique
                        Var.EA(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.EA(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "SA"
                        ' Sauvegarde du mnémonique
                        Var.SA(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.SA(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "EN"
                        ' Sauvegarde du mnémonique
                        Var.EN(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.EN(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "SN"
                        ' Sauvegarde du mnémonique
                        Var.SN(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.SN(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "T"
                        ' Sauvegarde du mnémonique
                        Var.T(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.T(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "C"
                        ' Sauvegarde du mnémonique
                        Var.C(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.C(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                    Case "P"
                        ' Sauvegarde du mnémonique
                        Var.P(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        Var.P(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                End Select
            Loop
            MonStreamReader.Close()
            MonStreamReader = Nothing
     
        End Sub

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ce que tu veux faire (accéder à une variable en fonction de son nom) s'appelle la réflexion (Reflection en anglais). Tu peux chercher dans cette voie, mais si tu es débutant ça va peut-être te sembler un peu compliqué...

    Sinon, la méthode que tu as utilisé est correcte, mais il y a moyen de "factoriser" une partie du code de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    ...
     
    Dim tab() As TypeVariable
    Select Case TypeDonnee
                    Case "E"
                        tab = Var.E
                    Case "A"
                        tab = Var.A
                    Case "B"
                        tab = Var.B
                    Case "R"
                        tab = Var.R
                    Case "M"
                        tab = Var.M
                    Case "V"
                        tab = Var.V
                    Case "EA"
                        tab = Var.EA
                    Case "SA"
                        tab = Var.SA
                    Case "EN"
                        tab = Var.EN
                    Case "SN"
                        tab = Var.SN
                    Case "T"
                        tab = Var.T
                    Case "C"
                        tab = Var.C
                    Case "P"
                        tab = Var.P
                End Select
                 If tab IsNot Nothing Then
                        ' Sauvegarde du mnémonique
                        tab(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
                        ' Sauvegarde du libellé
                        tab(AdresseDonnee).Libelle = MonStreamReader.ReadLine
                 End If
     
    ...
    Ou encore, tu peux utiliser un Dictionary :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Public Structure MapingVariables
        Friend tabs As Dictionary(Of String, TypeVariable())
     
        Public Sub Initalise()
            tabs = new Dictionary(Of String, TypeVariable())
            tabs.Add("E", New TypeVariable(3001))
            tabs.Add("A", New TypeVariable(3001))
            tabs.Add("B", New TypeVariable(1024))
            tabs.Add("R", New TypeVariable(1024))
            tabs.Add("M", New TypeVariable(13824))
            tabs.Add("EA", New TypeVariable(3001))
            tabs.Add("SA", New TypeVariable(3001))
            tabs.Add("EN", New TypeVariable(3001))
            tabs.Add("SN", New TypeVariable(3001))
            tabs.Add("V", New TypeVariable(1001))
            tabs.Add("T", New TypeVariable(101))
            tabs.Add("C", New TypeVariable(101))
            tabs.Add("P", New TypeVariable(101))
            End Sub
        End Structure
     
     
    ...
    Dim tab() As TypeVariable
    If tab.ContainsKey(TypeDonnee) Then
        tab = Var.tabs(TypeDonnee)
        ' Sauvegarde du mnémonique
        tab(AdresseDonnee).Mnemo = MonStreamReader.ReadLine
        ' Sauvegarde du libellé
        tab(AdresseDonnee).Libelle = MonStreamReader.ReadLine
    End If

  3. #3
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci pour ta réponse TOMLEV, et pour le temps que tu as bien voulu consacrer à un débutant (pas pus te répondre plus tôt, et je n'aurais le temps de rebosser dessus que demain soir) .
    Je vais essayer de regarder cette histoire de "reflection", in english in the text.
    Si ça dépasse mes compétences, je me rabas sur une de tes 2 solutions (je rage car ta solution "factorisée" me semble vachement plus élégante que mon gros code lourd mais pas forcement inaccessible avec mes connaissances, par contre y a un truc que je comprends pas bien sur comment tab se retrouve dans Var à la fin, mais j'essayerai demain, euh non ce soir).



    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par sibama Voir le message
    y a un truc que je comprends pas bien sur comment tab se retrouve dans Var à la fin
    Ben ta structure MapingVariables contient des champs de type "tableau de TypeVariable". Je déclare une variable du même type, et je la fais "pointer" sur un de ces tableaux. Ensuite, j'accède au tableau via la variable. Ca pointe bien sur le même objet en mémoire car les tableaux sont des types référence, et non des types valeur. Ce qui fait que quand je fais tab = Var.A, je ne fais pas une copie de Var.A, mais je crée simplement une nouvelle référence vers le même tableau.
    Si ça te parait encore flou, jette un oeil sur le cours VB.NET

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Ok, c'est la différence du langage "objet" par rapport aux langages "classiques" (non de d'là, que mon stage de .NET est parti loin).

    Merci pour les infos.




    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  6. #6
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bon, après avoir regardé la méthode "reflection", on va rester dans le classique et utiliser la méthode dictionary qui reste plus facilement compréhensible. Par contre j'ai encore un petit souci.
    Lorsque je déclare le "tabs.add("_", new typevariable(____))" j'ai un joli message "Le type typevariable n'a aucun constructeur".

    Je suppose donc qu'il faut que je déclare un constructeur New dans typevariable, ce que je fais. Je me retrouve alors un message dans le nouveau New qui me dit que New ne peut être utilisé sans paramètre que si la variable est "partagée".
    N'écoutant que mon courage, je rajoute alors un "shared", puisque cela semble être la solution. Il me semble qu'il y a alors un message qui parle que les structures ne peuvent pas être shared...
    La galèèèèèèèèèèèèèèèère.....
    Est-ce bien le contructeur New qu'il faut que je déclare dans typevariable?




    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/06/2008, 16h48
  2. Découper une variable de type string pour l'inserer a un commentaire
    Par Many31 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/01/2008, 13h32
  3. Conversion contenu objet File en variable String
    Par theleek dans le forum JSF
    Réponses: 2
    Dernier message: 20/12/2007, 11h31
  4. Variable String pour fonction Confirm()
    Par calagan99 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/09/2007, 08h26
  5. Réponses: 5
    Dernier message: 20/02/2007, 06h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo