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 6 et antérieur Discussion :

[Tableau] Nom de tableau variable


Sujet :

VB 6 et antérieur

  1. #1
    Membre éprouvé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Par défaut [Tableau] Nom de tableau variable
    Bonjour,

    Je viens à vous parce que je me pose une question:

    j'ai une appli qui exige la création d'un nombre indéfini de tableaux, et donc je ne peux pas les déclarer.

    J'aimerais pouvoir créer des tableau du genre

    Peut-on faire quelque chose de ce genre?

    Si je ne suis pas assez clair, dites le moi!!

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Par défaut
    Salut,

    A ma connaissance, ce n'est pas possible par contre si tes tableaux de grandeur fixe, il suffit de passer par une dimension supplémentaire pour "gérer" un nombre de tableaux dynamique et après tu utilises la fonction ReDim Preserve pour modifier la dernière dimension.

    Mais comme je te l'ai dis cela ne fonctionne qu'avec des tableaux de dimension fixe ou alors il faut faire un pré-traitement pour récupérer les dimensions maximales.

    +

    Théo

  3. #3
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Si non, il existe la piste des collections de collections d'objet

  4. #4
    Membre éprouvé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Par défaut
    Merci à tous les deux pour vos réponses.

    Théo:
    Malheureusement, la longueur n'est pas définie.

    Si non, il existe la piste des collections de collections d'objet
    Delbeke, peux-tu m'expliquer de quoi il s'agit?

  5. #5
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Avec un peu d'astuce, on peut emuler un tableau avec une collection

    Ce tableau, peut etre ajouté/retiré/selectionné dans une collection.

  6. #6
    Membre éprouvé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Par défaut
    Dans msdn, il y a ce code, est-ce que ça correspond à ce que tu me dis?

    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
     
    Sub ClassNamer()
       Dim MyClasses As New Collection   ' Crée un objet Collection.
       Dim Num   ' Compteur permettant d'individualiser les clés.
       Dim Msg As String   ' Variable devant contenir  la chaîne d'invite.
       Dim TheName, MyObject, NameList   ' Variants devant contenir les   'données.
       Do
          Dim Inst As New Class1   ' Crée une nouvelle instance de Class1.
          Num = Num + 1   ' Incrémente d'une unité la valeur de Num, puis
                         ' obtient un nom.
          Msg = "Veuillez affecter un nom à cet objet." & Chr(13) _
          & "Appuyez sur Annuler pour afficher les noms présents _
          & "dans la collection."
          TheName = InputBox(Msg, "Nommez les éléments de Collection")
          Inst.InstanceName = TheName   ' Place le nom dans l'instance de
                                        ' l'objet.
          ' Si l'utilisateur a saisi un nom, ajoute  celui-ci à la 
          ' collection.
          If Inst.InstanceName <> "" Then
             ' Ajoute l'objet nommé à la collection.
             MyClasses.Add item := Inst, key := CStr(Num)
          End If
          ' Efface la référence en cours en prévision de la suivante.
          Set Inst = Nothing
       Loop Until TheName = ""
       For Each MyObject In MyClasses   ' Crée une liste des noms.
          NameList = NameList & MyObject.InstanceName & Chr (13)
       Next MyObject
       ' Affiche la liste des noms dans une zone de message.
       MsgBox NameList, , "Noms des instances présentes dans la _
        & "collection MyClasses"
     
       For Num = 1 To MyClasses.Count   ' Supprime le nom de la collection.
          MyClasses.Remove 1            ' Puisque les collections sont                                           ' réindexées automatiquement,
                                        ' supprime le premier membre à
       Next                              ' chaque itération.
    End Sub

  7. #7
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Je suggère alors deux classes d'objets dont l'une est une propriété de l'autre...

  8. #8
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Vi, l'idée est la, j'essayerais de te faire un petit exemple demain, la j'ai pas trop le temps.

  9. #9
    Membre éprouvé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Par défaut
    Citation Envoyé par Delbeke
    Vi, l'idée est la, j'essayerais de te faire un petit exemple demain, la j'ai pas trop le temps.
    C'est sympathique ça!! merci par avance!

  10. #10
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Juste au cas, j'ai fait ça dans Together (Borland), pour illustrer le propos. Deux classes : Une classe Joueur (de billes) qui possède des Billes (l'autre classe).

  11. #11
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Je sais que les forumeurs qui sont intervenus son des bons de la programmation.

    Il y a plusieurs années, j’ai eu un problème approchant, les collections n’existaient peut être pas, ou j’étais encor moins compétant qu’aujourd’hui .

    Voilà comment j’avais solutionné mon problème, tableaux redimensionnables avec préservation des données pour un dimensionnement vers le haut.
    Dans un module .bas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Type MultipleTableau
     LeData() As Integer
    End Type
    Dans un Form
    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
    Private Sub Form_Load()
    Dim NbrTableau As Integer
    ' la il faut avoir la possibilité de recuperer
    ' le besoin de quantité de tableaux
    NbrTableau = 5 'valeur deduite par le prog
    ReDim MonTableau(NbrTableau)
     
    ReDim MonTableau(0).LeData(12)
    ReDim MonTableau(1).LeData(100)
    ReDim MonTableau(2).LeData(200)
    ReDim MonTableau(3).LeData(300)
    ReDim MonTableau(4).LeData(60)
     
    'affectation de valeur aux tableaux indexés
    MonTableau(0).LeData(0) = 8
    MonTableau(0).LeData(1) = 18342
    MonTableau(0).LeData(2) = 342
    '...........
    MonTableau(1).LeData(9) = 5
    '...........
    MonTableau(2).LeData(199) = 765
    '...........
    MonTableau(3).LeData(1) = 5
    '...........
    MonTableau(4).LeData(45) = 5
     
    ' le besoin a changé durant la session
    'ATTENTION perte des tableaux d'index supperieur
    ReDim Preserve MonTableau(2)
     
    ' le besoin a changé durant la session
    ReDim Preserve MonTableau(0).LeData(20)
    ReDim Preserve MonTableau(1).LeData(80)
    ReDim Preserve MonTableau(2).LeData(50)
     
    Dim T As Integer
    'pour voir
    For T = 0 To 3
     MsgBox MonTableau(0).LeData(T), vbInformation
    Next T
     
    'passage de la structure et des données vers un nouveau tableau
    ReDim Preserve MonTableau(3)
    MonTableau(3) = MonTableau(0)
    MonTableau(3).LeData(3) = 2007 'affectation valeur à index 3 du tableau 3
    For T = 0 To 3
     MsgBox MonTableau(3).LeData(T), vbInformation
    Next T
     
    End Sub
    Usine à gaz, oui mais des fois ....

    Je vous laisse analysez la différence vis-à-vis d’un tableau simple déclaré à deux dimensions, cette solution permet plus de souplesse.

    Motif de l'edition

    Un oublit dans le copier/coller
    Dans le Form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Dim MonTableau() As MultipleTableau
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  12. #12
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Bon, chose promise, chose due
    Créer une premiere classe nommée iTem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Public Value As Variant
    Mettre la propriété value comme propriété par défaut de la classe

    Créer une seconde classe nommée Tableau
    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
    Private mCol As Collection
    Private Sub Class_Initialize()
        Set mCol = New Collection
    End Sub
    Private Sub Class_Terminate()
        Set mCol = Nothing
    End Sub
    Public Property Get Item(vntIndexKey As Variant) As Item
      Set Item = mCol(vntIndexKey)
    End Property
    Public Property Get TUbound() As Long
      TUbound = mCol.Count
    End Property
    Public Sub TDim(Value As Integer)
      Dim iPnt As Integer
      Dim X As Item
      Do While mCol.Count > 0
        mCol.Remove 1
      Loop
      For iPnt = 1 To Value
        Set X = New Item
        X.Value = 0
        mCol.Add X
      Next
    End Sub
    Public Sub TDimPreserve(Value As Integer)
      Dim iPnt As Integer
      Dim X As Item
      If Value > mCol.Count Then
        For iPnt = mCol.Count To Value
          Set X = New Item
          X.Value = 0
          mCol.Add X
        Next
      Else
        For iPnt = mCol.Count To Value - 1
          mCol.Remove iPnt
        Next
      End If
    End Sub
    mettre la propriété Item comme la propriété par defaut de la classe

    Enfin voici un exemple d'utilisation dans une form avec deux boutons de commande


    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
    Dim Tabl As Tableau
    Dim Tabls As New Collection
    Private Sub Command1_Click()
      'generer un tableau de 25 élément et l'ajouter à la collection
      Dim lPnt As Long
      Set Tabl = New Tableau
      Tabl.TDim Fix(Rnd() * 100)
      For lPnt = 1 To Tabl.TUbound
        'Syntaxe developpée
          'Tabl.Item(lPnt).Value = Fix(Rnd() * 100)
        'en réglant les propriétés par defaut on peux simplifer en
          Tabl(lPnt) = Fix(Rnd() * 100)
      Next
      Tabls.Add Tabl
    End Sub
     
    Private Sub Command2_Click()
      Dim NumTableau As Long
      Dim Tabl As Tableau
      Dim lPnt As Long
      NumTableau = CLng(InputBox("Numero de tableau (de 1 à " & CStr(Tabls.Count) & ")"))
      Set Tabl = Tabls(NumTableau)
      For lPnt = 1 To Tabl.TUbound
        'syntaxe complete
          'Debug.Print lPnt, Tabl(lPnt).Value
        Debug.Print lPnt, Tabl(lPnt)
      Next
    End Sub
    Attention par manque de temps,je n'ai pas vérifier le code pour la fonction TDimPreserve

  13. #13
    Membre éprouvé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Par défaut
    Merci beaucoup ami Delbeke (ainsi que tous ceux qui ont répondu). Je regarde attentivement ton code et je reviens vers vous pour des explications si besoin.

    Merci encore

  14. #14
    Membre Expert
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Par défaut
    Aller juste comme ca une idee, qui vas un peut dans le meme sens que celui de ProgElect, c'est a dire en passant par les tableau. Mais dans mon cas par un tableau bidimensonnel. La premiere dimension represente l'index du "tableau" et la deuxieme "les donnees du tableau". Evidement va falloir faire un redim preserve pour conserver les anciennes donnees. Je crois c'est un peut plus rapide.

  15. #15
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Avec Redim Preserve tu ne peux redimensionner que le dernier indice du tableau (le deuxième donc en l'occurence)

  16. #16
    Membre Expert
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Par défaut
    Citation Envoyé par OhMonBato
    Avec Redim Preserve tu ne peux redimensionner que le dernier indice du tableau (le deuxième donc en l'occurence)
    Tu es sur ?? je n'ai pas fait VB depuis un bon bout de tempsmas je crois avoir fait un truc de ce genre. Je vais voir dans mes archives et je vous tiens au courant demain

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 730
    Par défaut
    Citation Envoyé par sovo
    Tu es sur ??
    Eh oui...

    Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la dernière dimension du tableau. Vous ne pouvez en aucun cas modifier le nombre de dimensions. Par exemple, si votre tableau n'a qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la dernière et seule dimension. Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau. L'exemple suivant montre comment augmenter la taille de la dernière dimension d'un tableau dynamique sans effacer les données qu'il contient :

    ReDim X(10, 10, 10)
    . . .
    ReDim Preserve X(10, 10, 15)

    De même, le mot clé Preserve ne permet de redimensionner un tableau qu'en modifiant la limite supérieure ; toute modification de la limite inférieure provoque une erreur.

  18. #18
    Membre Expert
    Avatar de sovo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    1 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 389
    Par défaut
    Bon apres verification dans mon projet et sur MSDN je me suis rendu compte que j'ai parler un peut trop vite.

    Je retire mes propos.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/04/2014, 23h32
  2. Tableau à nom variable
    Par CrypTloader dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 14/01/2013, 13h40
  3. nom dynamique de Variables Tableau
    Par pimpmyride dans le forum Langage
    Réponses: 1
    Dernier message: 25/02/2009, 18h46
  4. [FLASH MX] Nom de tableau variable
    Par totoche dans le forum Flash
    Réponses: 1
    Dernier message: 25/11/2005, 17h21
  5. accéder à un contrôle de formulaire avec un nom de tableau
    Par jibouze dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/07/2005, 00h57

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