Comment savoir si un tableau dynamique est dimensionné ?

Résolu
DragonicFlash Messages postés 20 Date d'inscription dimanche 22 juin 2003 Statut Membre Dernière intervention 31 octobre 2006 - 28 juil. 2005 à 17:48
DragonicFlash Messages postés 20 Date d'inscription dimanche 22 juin 2003 Statut Membre Dernière intervention 31 octobre 2006 - 2 août 2005 à 18:52
Salut à tous !

Je suis en plein développement, et là, je suis confronté à un "pseudo" problème on va dire. Je sais comment le contourner, mais si je pouvais éviter de le contourner et plutôt de le solutionner, ce serait pas mal.

Voilà... Je crée 4 tableaux dynamiques. Avec une BDD, je remplis ces tableaux en fonction d'un SELECT CASE. A chaque fois que je remplis un tableau, je fais un REDIM PRESERVE.

Une fois ces remplissages faits, je fais d'autres traitements sur chacun de ces 4 tableaux. Vu que le remplissage précédent se fait par un SELECT CASE, certains de ces tableaux peuvent ne pas être remplis, et donc de ce fait, ne pas être dimensionné... Alors forcément, si je fais un traitement sur un tableau qui finalement est déclaré mais qui n'existe pas, ça part en erreur...

Actuellement, pour contourner le problème, je fais par défaut un DIM de 1 élement pour chacun de ces tableaux, et si un tableau(0) est égal à NULL (ce sont des tableaux de Integer), je sais que mon tableau n'existe pas...

Donc pour abréger (LOL), je voudrais savoir s'il existe une fonction permettant de dire si un tableau déclaré dynamiquement a été dimensionné ou pas. Ce serait plus propre. Maintenant, s'il n'y a pas de solution, tant pis, je resterai comme ça. Mais je trouve que ça fait un peu poporc. J'avais choisi les tableaux dynamiques pour justement ne pas prendre de place quand j'en avais pas besoin.

Merci à vous tous !!

7 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 juil. 2005 à 18:26
Private Sub Command1_Click()

Dim Tableau() As Integer



If Not (Not Tableau) = False Then

MsgBox "vide"

End If



ReDim Tableau(10)



If Not (Not Tableau) = True Then

MsgBox "non vide"

End If



End Sub


Daniel
1
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2005 à 18:10
un solution comlète, comme tu l'espères, pas à ma connaissance.
ta solution 'poporc" ne l'est pas tant que çà, et à le mérite d'être rapide.
si tu veux une version "plus officielle", çà serait de faire une gestion d'erreur

Dim Montablo1() as String, Montablo2() as String, Montablo3() as String, Montablo4() as String
Dim WhichErr as String
Dim Temp as Integer

On Error Goto ERRTABLEAU
WhichErr="MonTablo1"
Temp = Ubound(MonTablo1)

WhichErr="MonTablo2"
Temp = Ubound(MonTablo2)

WhichErr="MonTablo3"
Temp = Ubound(MonTablo3)

WhichErr="MonTablo4"
Temp = Ubound(MonTablo4)

On Error Goto 0 'fin de gestion d'erreur
Temp=""
MsgBox "Les 4 tableaux sont OK", 32, "***"
Exit Sub

ERRTABLEAU :
MsgBox "Une erreur est survenue sur " & chr(34) & WichErr & chr(34), 32, "***"
Exit Sub

là tu as une gestion propre. à toi de voir l'utilité

PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2005 à 18:12
c'était WichErr que je voulais vider. çà peut te servir à ne pas faire d'Exit Sub, et de vérifier en dernière ligne
If LenB(WhichErr)=0 Then exit Sub

PCPT
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2005 à 19:42
bien bien bien... en effet
j'la connaissais pas celle là ;)
PCPT
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 juil. 2005 à 20:48
c'est une astuce pour trouver le pointeur de la SafaArray,

ça évite de passer par les API







Private Type SAFEARRAYBOUND

cElements As Long

lLbound As Long

End Type



Private Type SAFEARRAY1D

cDims As Integer

fFeatures As Integer

cbElements As Long

cLocks As Long

pvData As Long

Bounds(0 To 0) As SAFEARRAYBOUND

End Type



Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long



Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)



Private Sub Command1_Click()

Dim
SafeArray
As SAFEARRAY1D

Dim PointerToPointer As Long

Dim PointerToSafeArray As Long

Dim Pointer As Long

Dim Tableau() As Integer



ReDim Tableau(10)



Pointer = Not (Not Tableau)

MsgBox Pointer



PointerToPointer = VarPtrArray(Tableau)

Call CopyMemory(PointerToSafeArray, ByVal PointerToPointer, 4&)

MsgBox PointerToSafeArray



End Sub


Daniel
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
28 juil. 2005 à 23:07
Salut,

Bien vu Daniel !

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
DragonicFlash Messages postés 20 Date d'inscription dimanche 22 juin 2003 Statut Membre Dernière intervention 31 octobre 2006
2 août 2005 à 18:52
Bonsoir !!

Merci à tous pour vos réponses, c'est super sympa. Et spécial thank à Gobillot pour ce code "tout bête" qui permet de faire ce que j'attendais. Je faisais "not tableau" qui ne marchait pas, mais effectivement, "not (not tableau)", ça passe !

Encore merci.
0
Rejoignez-nous