Il est possible de tester ces bornes par d'autres manières. Une méthode qui ne gère pas l'erreur consiste à retrouver un pointeur vers le safearray. Celui ci est nul lorsque l'array n'est pas initialisée. Voici un exemple: Private Type SAFEARRAYBOUND cElements As Long lLbound As Long End Type
Private Type SAFEARRAY cDims As Integer fFeatures As Integer cbElements As Long cLocks As Long pvData As Long End Type
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ Var() As Any _ ) _ As Long Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef Destination As Any, _ ByRef Source As Any, _ ByVal Length As Long _ )
Private Sub Form_Load() Dim MyInts() As Integer
DoSomething MyInts
ReDim MyInts(0)
DoSomething MyInts End Sub
Public Sub DoSomething(DataArray() As Integer) Dim VBArray As SAFEARRAY, ArrayBounds() As SAFEARRAYBOUND Dim ArrayPointer As Long
'Transforme le pointeur vers un pointeur en pointeur simple Call CopyMemory(ArrayPointer, ByVal VarPtrArray(DataArray), LenB(ArrayPointer))
If ArrayPointer Then Call CopyMemory(VBArray, ByVal ArrayPointer, LenB(VBArray))
If VBArray.cDims Then ReDim ArrayBounds(VBArray.cDims)
MsgBox "L'array possède " & VBArray.cDims & " dimensions (1ère dim : " & ArrayBounds(0).lLbound & " To " & ArrayBounds(0).lLbound + ArrayBounds(0).cElements - 1 & ")" End If Else MsgBox "L'array n'est pas initialisée" End If End Sub
Joli !
Pour ma part et dans la mesure du possible j'utilise des collections, le is nothing étant Object...ivement plus parlant.
Et une des raisons première était le fait de trapper l'erreur sur ubound() pour chaque variable tableau générale.
Christophe
A+
Picalausa François a écrit :
Il est possible de tester ces bornes par d'autres manières. Une méthode qui
ne gère pas l'erreur consiste à retrouver un pointeur vers le safearray.
Celui ci est nul lorsque l'array n'est pas initialisée. Voici un exemple:
Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Private Type SAFEARRAY
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
End Type
Private Declare Function VarPtrArray _
Lib "msvbvm60.dll" _
Alias "VarPtr" _
( _
Var() As Any _
) _
As Long
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long _
)
Private Sub Form_Load()
Dim MyInts() As Integer
DoSomething MyInts
ReDim MyInts(0)
DoSomething MyInts
End Sub
Public Sub DoSomething(DataArray() As Integer)
Dim VBArray As SAFEARRAY, ArrayBounds() As SAFEARRAYBOUND
Dim ArrayPointer As Long
'Transforme le pointeur vers un pointeur en pointeur simple
Call CopyMemory(ArrayPointer, ByVal VarPtrArray(DataArray),
LenB(ArrayPointer))
If ArrayPointer Then
Call CopyMemory(VBArray, ByVal ArrayPointer, LenB(VBArray))
If VBArray.cDims Then
ReDim ArrayBounds(VBArray.cDims)
MsgBox "L'array possède " & VBArray.cDims & " dimensions (1ère
dim : " & ArrayBounds(0).lLbound & " To " & ArrayBounds(0).lLbound +
ArrayBounds(0).cElements - 1 & ")"
End If
Else
MsgBox "L'array n'est pas initialisée"
End If
End Sub
Joli !
Pour ma part et dans la mesure du possible j'utilise des collections, le
is nothing étant Object...ivement plus parlant.
Et une des raisons première était le fait de trapper l'erreur sur
ubound() pour chaque variable tableau générale.
Il est possible de tester ces bornes par d'autres manières. Une méthode qui ne gère pas l'erreur consiste à retrouver un pointeur vers le safearray. Celui ci est nul lorsque l'array n'est pas initialisée. Voici un exemple: Private Type SAFEARRAYBOUND cElements As Long lLbound As Long End Type
Private Type SAFEARRAY cDims As Integer fFeatures As Integer cbElements As Long cLocks As Long pvData As Long End Type
Private Declare Function VarPtrArray _ Lib "msvbvm60.dll" _ Alias "VarPtr" _ ( _ Var() As Any _ ) _ As Long Private Declare Sub CopyMemory _ Lib "kernel32" _ Alias "RtlMoveMemory" _ ( _ ByRef Destination As Any, _ ByRef Source As Any, _ ByVal Length As Long _ )
Private Sub Form_Load() Dim MyInts() As Integer
DoSomething MyInts
ReDim MyInts(0)
DoSomething MyInts End Sub
Public Sub DoSomething(DataArray() As Integer) Dim VBArray As SAFEARRAY, ArrayBounds() As SAFEARRAYBOUND Dim ArrayPointer As Long
'Transforme le pointeur vers un pointeur en pointeur simple Call CopyMemory(ArrayPointer, ByVal VarPtrArray(DataArray), LenB(ArrayPointer))
If ArrayPointer Then Call CopyMemory(VBArray, ByVal ArrayPointer, LenB(VBArray))
If VBArray.cDims Then ReDim ArrayBounds(VBArray.cDims)
MsgBox "L'array possède " & VBArray.cDims & " dimensions (1ère dim : " & ArrayBounds(0).lLbound & " To " & ArrayBounds(0).lLbound + ArrayBounds(0).cElements - 1 & ")" End If Else MsgBox "L'array n'est pas initialisée" End If End Sub
Joli !
Pour ma part et dans la mesure du possible j'utilise des collections, le is nothing étant Object...ivement plus parlant.
Et une des raisons première était le fait de trapper l'erreur sur ubound() pour chaque variable tableau générale.