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 :

SafeArrayGetDim et tableau de tableau structuré


Sujet :

VB 6 et antérieur

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut SafeArrayGetDim et tableau de tableau structuré
    Bonjour à tous

    Attention !!! la question n'est pas simple...surtout pour moi
    J'espere que la réponse ne sera pas pire

    Pour savoir si un tableau est initialisé, j'utilise la super API SafeArrayGetDim qui me dépanne drolement

    Seulement voila, dernierement j'ai eu besoin de créer un tableau de tableau dynamique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type Tablo
     TableauDonnees() As Variant
    End Type
     
    Public TabloTableauDonnees(5) As Tablo
    Je récupere des données via EXCEL grace à cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.Transpose(rng)
    qui rempli directement le tableau soit en une dimension soit en deux dimensions
    Donc je ne connais pas à l'avance la structure du tableau

    J'arrive bien à savoir si le tableau est initialisé grace à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If SafeArrayGetDim(TabloTableauDonnees(t).TableauDonnees) Then
    mais j'aimerais savoir si il est en une ou deux dimensions et la...pas moyen d'y arriver
    Car si je fais appel à UBOUND avec l'index 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UBound(TabloTableauDonnees(t).TableauDonnees, 2)
    et bien evidemment si le tableau n'a qu'une dimension cela créé une erreur

    J'ai lu sur internet qu'il existait cette API SafeArrayGetElement() mais je ne sais pas l'utiliser ni si elle correspond à mes besoins

    Quelqu'un pourrait m'eclairer un peu dans cette demande
    Merci et bonne journée

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Par défaut
    Salut andrebernard

    Je ne connais pas SafeArrayGetElement, mais son nom ne semble pas donner d'indication sur le nombre de dimensions d'un tableau...

    J'ai trouvé un article sur le site de support de Microsoft selon lequel, le seul moyen de déterminer le nombre de dimensions d'un tableau est de jouer avec les gestions d'erreurs.

    Je donne l'exemple fourni dans l'article au cas où le lien meurt :
    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
    Sub NumberOfDimensions()
     
        'Dimensions Xarray as an array.
        Dim Xarray(1 to 10, 5 to 20, 256 to 300, 8, -5 to 0)
     
        'Sets up the error handler.
        On Error GoTo FinalDimension
     
        'Visual Basic for Applications arrays can have up to 60000
        'dimensions; this allows for that.
        For DimNum = 1 to 60000
     
            'It is necessary to do something with the LBound to force it
            'to generate an error.
            ErrorCheck = LBound(Xarray, DimNum)
     
        Next DimNum
     
        Exit Sub
     
        ' The error routine.
    FinalDimension:
     
        MsgBox "The array has " & DimNum - 1 & " dimensions"
     
    End Sub

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut
    Bonjour aniki

    Merci beaucoup de ta réponse.
    Je ferai comme ça

    Bonne journée

  4. #4
    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
    Salut

    Une autre approche retrouvée dans les bouts de code exemple sur mon DD.

    Au depart le code est de iclic dans cette discussion (cela vaut le coup de lire entièrement la discussion, on y apprend plein de choses)

    Pour tester le tableau interne ont peut faire comme cela
    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
    'code de départ proposé par iclic
    'post: http://www.developpez.net/forums/d1271406/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/tester-structure-type-nest-null/#post6943253
    Option Explicit
     
    Private Type DonneeMontage
            nId As Integer
            nDo() As Long ' <---  ATTENTION, au depart, dans l'exemple de iclic, variable non tableau
    End Type
    Private Sub Form_Load()
    Dim ListVehTram() As DonneeMontage
    ReDim ListVehTram(0) 'pour essai avec un tableau de 1 élément
    'ReDim ListVehTram(50) 'pour essai avec un tableau de 50 éléments
     
    If IsDonneeMontageInitialized(Not ListVehTram, ListVehTram) = "" Then
        MsgBox "non initialisé", vbCritical, "iclic"
        Else
        MsgBox "Nbr. d'index du Tableau = " & IsDonneeMontageInitialized(Not ListVehTram, ListVehTram), vbInformation, "iclic"
     
        'pour pousser le bouchon plus loint, ma contribution
        ReDim ListVehTram(0).nDo(5) 'pour essai avec un tableau de 1 élément et un sous tableau de 6 éléments
        If IsSousTblInitialized(Not ListVehTram(0).nDo, ListVehTram) = "" Then
            MsgBox "Nbr. d'index du Tableau interne non initialisé", vbCritical, "ProgElecT"
            Else
            MsgBox "Nbr. d'index du Tableau interne = " & IsSousTblInitialized(Not ListVehTram(0).nDo, ListVehTram), vbInformation, "ProgElecT"
        End If
    End If
    End Sub
    Private Function IsDonneeMontageInitialized(ByRef quoi, arr() As DonneeMontage) As String
        If Not quoi Then IsDonneeMontageInitialized = UBound(arr) + 1
    End Function
    'ma contribution
    Private Function IsSousTblInitialized(ByRef quoi, arr() As DonneeMontage) As String
        If Not quoi Then IsSousTblInitialized = UBound(arr(0).nDo) + 1
    End Function
    dans un deuxième temps, mettre en commentaire la ligne N°20 pour déclencher la ligne 22.
    :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 ← ← 👈

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut
    Merci beaucoup Progelec

    Je vais etudier cette solution qui m'a l'air pas mal du tout

    Je te souhaite une très bonne soirée
    Encore merci à vous deux pour votre précieuse aide

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    795
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 795
    Par défaut
    Je viens de percuter en relisant ton premier post que tu utilises SafeArrayGetDim pour savoir si ton tableau est initialisé.
    En fait, tu devrais aussi pouvoir avoir la dimension du tableau si cette fonction fait bien ce que son nom laisse suggérer...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim dimension as Long
     
    dimension = SafeArrayGetDim(TabloTableauDonnees(t).TableauDonnees)
    If dimension > 0 Then
    Et là, la variable dimension devrait contenir le nombre de dimension de ton tableau.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut
    Oui tout a fait
    J'ai utilisé safearraygetdim comme tu viens de le faire mais juste avec if devant.
    Je regarderai ce que retourne cette variable car le week end je ne suis pas devant mon code
    Merci pour ce tuyau ANIKI

    Bonne soirée

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/09/2007, 16h58
  2. Tableau dans une structure
    Par Elstak dans le forum C
    Réponses: 3
    Dernier message: 25/04/2007, 12h45
  3. manipulation d'un tableau d'une structure de donnee
    Par questionvb dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/03/2007, 15h02
  4. tableau d'éléments structurés?
    Par eultartuffe dans le forum Delphi
    Réponses: 7
    Dernier message: 05/10/2006, 22h51
  5. Tableau dynamique de structures
    Par beb30 dans le forum C
    Réponses: 13
    Dernier message: 29/04/2006, 13h41

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