Peut-on mettre ou enlever des variable sur le principe du redim de dim, et
comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
Peut-on mettre ou enlever des variable sur le principe du redim de dim, et
comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
Peut-on mettre ou enlever des variable sur le principe du redim de dim, et
comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
"X" <x> a écrit dans le message de news:Peut-on mettre ou enlever des variable sur le principe du redim de dim,
et comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
d'array. De toutes façons, array ne travaille qu'avec du Variant et donc,
pour des programmes effectuant du calcul intensif (et les programmes bien
écrits) il est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour gérer
un tableau fortement typé plus facilement.
Dans l'exemple suivant, l'allocation dynamique est automatisée et permet
d'augmenter les performances en effectuant des allocations de blocs
(pratique pour les grandes quantités de données).
Un exemple d'utilisation est présent dans l'événement Form_Load, pour plus
de facilité. Il montre notament comment ajouter 10 nombres, sans avoir
besoin de savoir combien ils sont réellement.
Je te laisse le soin d'optimiser le code pour ton application spécifique.
Private mData() As Long
Private mLength As Long
Private Const ChunkLenght As Long = 10 'Fonction de l'application qui
fait les allocations
Public Sub AddItem(Value As Long)
'Ajoute un élément au tableau, en prenant soin de faire les allocations
par bloc nécessaires
'Si on est à la fin du tableau, ajoute un bloc de données
If mLength = UBound(mData) + 1 Then
AllocateChunks 1
End If
'Prend en compte la nouvelle valeur
mData(mLength) = Value
mLength = mLength + 1
End Sub
Public Sub AddItems(ParamArray Values() As Variant)
'Ajoute les élément au tableau, en prenant soin de faire les
allocations par bloc nécessaires
'Commence par effectuer la conversion
Dim tNewValues() As Long, tCount As Long, i As Long
ReDim tNewValues(0 To UBound(Values) - LBound(Values))
'Cast les données qui peuvent l'être
On Error Resume Next
For i = LBound(Values) To UBound(Values)
tNewValues(tCount) = CLng(Values(i))
'Si le cast s'est produit sans erreur, on prend la valeur en compte
If Err.Number = 0 Then
tCount = tCount + 1
End If
Next i
'S'arrange pour que le tableau ait la taille requise
AllocateElements tCount - (UBound(mData) - mLength), True
'Prend en compte les nouvelles valeurs
For i = 0 To tCount
mData(mLength + i) = tNewValues(i)
Next i
mLength = mLength + tCount
End Sub
Public Sub AllocateElements(Count As Long, Optional UseChunksSize As
Boolean)
Dim mRealCount As Long
'On essaye de redimensionner que s'il y a lieu de le faire
If Count <> 0 Then
mRealCount = Count
'Si on travaille par morceaux de mémoires de taille fixe, calcul le
nombre d'éléments effectifs à ajouter
If UseChunksSize Then
mRealCount = mRealCount ChunkLenght * Count + Sgn(Count) *
ChunkLenght
End If
RedimArray UBound(mData) + mRealCount
End If
End Sub
Private Sub RedimArray(NewSize As Long)
'Redimensionne le tableau
If NewSize < 0 Then
ReDim mData(0)
Else
ReDim Preserve mData(NewSize)
End If
End Sub
Public Sub AllocateChunks(Count As Long)
'Alloue un morceau complet de mémoire de taille fixe
'(Pour désalouer, spécifier un nombre < 0)
'Calcul le nombre d'éléments correspondant, et l'ajoute
RedimArray UBound(mData) + ChunkLenght * Count
End Sub
Public Sub RemoveItem(Index As Long, Optional Sorted As Boolean, Optional
KeepMemory As Boolean)
'Supprime l'élement Index du tableau. Si sorted, garde les données dans
l'ordres
'Supprime la mémoire associé, par chunks si Keepmemory = false
If Index >= 0 And Index < mLength Then
If Sorted Then
Dim i As Long
For i = Index + 1 To mLength - 1
mData(i - 1) = mData(i)
Next i
Else
'Remplace l'élément à supprimer par le dernier
mData(Index) = mData(mLength - 1)
End If
mLength = mLength - 1
If UBound(mData) - mLength >= ChunkLenght Then
AllocateChunks -(UBound(mData) - mLength) ChunkLenght
End If
End If
End Sub
Public Property Get ItemsCount() As Long
ItemsCount = mLength
End Property
Public Property Get TotalSize() As Long
TotalSize = (UBound(mData) + 1)
End Property
Public Property Get TotalSizeInBytes() As Long
TotalSizeInBytes = (UBound(mData) + 1) * 4
End Property
Public Property Get UsedSizeInBytes() As Long
UsedSizeInBytes = mLength * 4
End Property
Public Sub Clear()
'Réinitialise le tableau de données
Erase mData
ReDim mData(0)
mLength = 0
End Sub
Private Sub Form_Load()
Dim i As Long
'Nécessaire pour l'initialisation
Clear
'Ajoute des items comme une liste
AddItems 1, 2, 3, 4, 5, 6, 7, 8, 9
'L'allocation est effectuée à l'avance pour contenir les 15 nouveaux
éléments
AllocateElements 15
For i = 10 To 15
AddItem i
Next i
'Ou sans allocations préalable
For i = 16 To 25
AddItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime le 3 ème, avec tri
RemoveItem 2, True
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime 10 éléments, sans tri
For i = 5 To 14
RemoveItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
End Sub
--
Picalausa François
"X" <x> a écrit dans le message de news:
eGKwAypHGHA.1032@TK2MSFTNGP12.phx.gbl...
Peut-on mettre ou enlever des variable sur le principe du redim de dim,
et comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
d'array. De toutes façons, array ne travaille qu'avec du Variant et donc,
pour des programmes effectuant du calcul intensif (et les programmes bien
écrits) il est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour gérer
un tableau fortement typé plus facilement.
Dans l'exemple suivant, l'allocation dynamique est automatisée et permet
d'augmenter les performances en effectuant des allocations de blocs
(pratique pour les grandes quantités de données).
Un exemple d'utilisation est présent dans l'événement Form_Load, pour plus
de facilité. Il montre notament comment ajouter 10 nombres, sans avoir
besoin de savoir combien ils sont réellement.
Je te laisse le soin d'optimiser le code pour ton application spécifique.
Private mData() As Long
Private mLength As Long
Private Const ChunkLenght As Long = 10 'Fonction de l'application qui
fait les allocations
Public Sub AddItem(Value As Long)
'Ajoute un élément au tableau, en prenant soin de faire les allocations
par bloc nécessaires
'Si on est à la fin du tableau, ajoute un bloc de données
If mLength = UBound(mData) + 1 Then
AllocateChunks 1
End If
'Prend en compte la nouvelle valeur
mData(mLength) = Value
mLength = mLength + 1
End Sub
Public Sub AddItems(ParamArray Values() As Variant)
'Ajoute les élément au tableau, en prenant soin de faire les
allocations par bloc nécessaires
'Commence par effectuer la conversion
Dim tNewValues() As Long, tCount As Long, i As Long
ReDim tNewValues(0 To UBound(Values) - LBound(Values))
'Cast les données qui peuvent l'être
On Error Resume Next
For i = LBound(Values) To UBound(Values)
tNewValues(tCount) = CLng(Values(i))
'Si le cast s'est produit sans erreur, on prend la valeur en compte
If Err.Number = 0 Then
tCount = tCount + 1
End If
Next i
'S'arrange pour que le tableau ait la taille requise
AllocateElements tCount - (UBound(mData) - mLength), True
'Prend en compte les nouvelles valeurs
For i = 0 To tCount
mData(mLength + i) = tNewValues(i)
Next i
mLength = mLength + tCount
End Sub
Public Sub AllocateElements(Count As Long, Optional UseChunksSize As
Boolean)
Dim mRealCount As Long
'On essaye de redimensionner que s'il y a lieu de le faire
If Count <> 0 Then
mRealCount = Count
'Si on travaille par morceaux de mémoires de taille fixe, calcul le
nombre d'éléments effectifs à ajouter
If UseChunksSize Then
mRealCount = mRealCount ChunkLenght * Count + Sgn(Count) *
ChunkLenght
End If
RedimArray UBound(mData) + mRealCount
End If
End Sub
Private Sub RedimArray(NewSize As Long)
'Redimensionne le tableau
If NewSize < 0 Then
ReDim mData(0)
Else
ReDim Preserve mData(NewSize)
End If
End Sub
Public Sub AllocateChunks(Count As Long)
'Alloue un morceau complet de mémoire de taille fixe
'(Pour désalouer, spécifier un nombre < 0)
'Calcul le nombre d'éléments correspondant, et l'ajoute
RedimArray UBound(mData) + ChunkLenght * Count
End Sub
Public Sub RemoveItem(Index As Long, Optional Sorted As Boolean, Optional
KeepMemory As Boolean)
'Supprime l'élement Index du tableau. Si sorted, garde les données dans
l'ordres
'Supprime la mémoire associé, par chunks si Keepmemory = false
If Index >= 0 And Index < mLength Then
If Sorted Then
Dim i As Long
For i = Index + 1 To mLength - 1
mData(i - 1) = mData(i)
Next i
Else
'Remplace l'élément à supprimer par le dernier
mData(Index) = mData(mLength - 1)
End If
mLength = mLength - 1
If UBound(mData) - mLength >= ChunkLenght Then
AllocateChunks -(UBound(mData) - mLength) ChunkLenght
End If
End If
End Sub
Public Property Get ItemsCount() As Long
ItemsCount = mLength
End Property
Public Property Get TotalSize() As Long
TotalSize = (UBound(mData) + 1)
End Property
Public Property Get TotalSizeInBytes() As Long
TotalSizeInBytes = (UBound(mData) + 1) * 4
End Property
Public Property Get UsedSizeInBytes() As Long
UsedSizeInBytes = mLength * 4
End Property
Public Sub Clear()
'Réinitialise le tableau de données
Erase mData
ReDim mData(0)
mLength = 0
End Sub
Private Sub Form_Load()
Dim i As Long
'Nécessaire pour l'initialisation
Clear
'Ajoute des items comme une liste
AddItems 1, 2, 3, 4, 5, 6, 7, 8, 9
'L'allocation est effectuée à l'avance pour contenir les 15 nouveaux
éléments
AllocateElements 15
For i = 10 To 15
AddItem i
Next i
'Ou sans allocations préalable
For i = 16 To 25
AddItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime le 3 ème, avec tri
RemoveItem 2, True
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime 10 éléments, sans tri
For i = 5 To 14
RemoveItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
End Sub
--
Picalausa François
"X" <x> a écrit dans le message de news:Peut-on mettre ou enlever des variable sur le principe du redim de dim,
et comment faire ???
Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre fois
de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
d'array. De toutes façons, array ne travaille qu'avec du Variant et donc,
pour des programmes effectuant du calcul intensif (et les programmes bien
écrits) il est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour gérer
un tableau fortement typé plus facilement.
Dans l'exemple suivant, l'allocation dynamique est automatisée et permet
d'augmenter les performances en effectuant des allocations de blocs
(pratique pour les grandes quantités de données).
Un exemple d'utilisation est présent dans l'événement Form_Load, pour plus
de facilité. Il montre notament comment ajouter 10 nombres, sans avoir
besoin de savoir combien ils sont réellement.
Je te laisse le soin d'optimiser le code pour ton application spécifique.
Private mData() As Long
Private mLength As Long
Private Const ChunkLenght As Long = 10 'Fonction de l'application qui
fait les allocations
Public Sub AddItem(Value As Long)
'Ajoute un élément au tableau, en prenant soin de faire les allocations
par bloc nécessaires
'Si on est à la fin du tableau, ajoute un bloc de données
If mLength = UBound(mData) + 1 Then
AllocateChunks 1
End If
'Prend en compte la nouvelle valeur
mData(mLength) = Value
mLength = mLength + 1
End Sub
Public Sub AddItems(ParamArray Values() As Variant)
'Ajoute les élément au tableau, en prenant soin de faire les
allocations par bloc nécessaires
'Commence par effectuer la conversion
Dim tNewValues() As Long, tCount As Long, i As Long
ReDim tNewValues(0 To UBound(Values) - LBound(Values))
'Cast les données qui peuvent l'être
On Error Resume Next
For i = LBound(Values) To UBound(Values)
tNewValues(tCount) = CLng(Values(i))
'Si le cast s'est produit sans erreur, on prend la valeur en compte
If Err.Number = 0 Then
tCount = tCount + 1
End If
Next i
'S'arrange pour que le tableau ait la taille requise
AllocateElements tCount - (UBound(mData) - mLength), True
'Prend en compte les nouvelles valeurs
For i = 0 To tCount
mData(mLength + i) = tNewValues(i)
Next i
mLength = mLength + tCount
End Sub
Public Sub AllocateElements(Count As Long, Optional UseChunksSize As
Boolean)
Dim mRealCount As Long
'On essaye de redimensionner que s'il y a lieu de le faire
If Count <> 0 Then
mRealCount = Count
'Si on travaille par morceaux de mémoires de taille fixe, calcul le
nombre d'éléments effectifs à ajouter
If UseChunksSize Then
mRealCount = mRealCount ChunkLenght * Count + Sgn(Count) *
ChunkLenght
End If
RedimArray UBound(mData) + mRealCount
End If
End Sub
Private Sub RedimArray(NewSize As Long)
'Redimensionne le tableau
If NewSize < 0 Then
ReDim mData(0)
Else
ReDim Preserve mData(NewSize)
End If
End Sub
Public Sub AllocateChunks(Count As Long)
'Alloue un morceau complet de mémoire de taille fixe
'(Pour désalouer, spécifier un nombre < 0)
'Calcul le nombre d'éléments correspondant, et l'ajoute
RedimArray UBound(mData) + ChunkLenght * Count
End Sub
Public Sub RemoveItem(Index As Long, Optional Sorted As Boolean, Optional
KeepMemory As Boolean)
'Supprime l'élement Index du tableau. Si sorted, garde les données dans
l'ordres
'Supprime la mémoire associé, par chunks si Keepmemory = false
If Index >= 0 And Index < mLength Then
If Sorted Then
Dim i As Long
For i = Index + 1 To mLength - 1
mData(i - 1) = mData(i)
Next i
Else
'Remplace l'élément à supprimer par le dernier
mData(Index) = mData(mLength - 1)
End If
mLength = mLength - 1
If UBound(mData) - mLength >= ChunkLenght Then
AllocateChunks -(UBound(mData) - mLength) ChunkLenght
End If
End If
End Sub
Public Property Get ItemsCount() As Long
ItemsCount = mLength
End Property
Public Property Get TotalSize() As Long
TotalSize = (UBound(mData) + 1)
End Property
Public Property Get TotalSizeInBytes() As Long
TotalSizeInBytes = (UBound(mData) + 1) * 4
End Property
Public Property Get UsedSizeInBytes() As Long
UsedSizeInBytes = mLength * 4
End Property
Public Sub Clear()
'Réinitialise le tableau de données
Erase mData
ReDim mData(0)
mLength = 0
End Sub
Private Sub Form_Load()
Dim i As Long
'Nécessaire pour l'initialisation
Clear
'Ajoute des items comme une liste
AddItems 1, 2, 3, 4, 5, 6, 7, 8, 9
'L'allocation est effectuée à l'avance pour contenir les 15 nouveaux
éléments
AllocateElements 15
For i = 10 To 15
AddItem i
Next i
'Ou sans allocations préalable
For i = 16 To 25
AddItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime le 3 ème, avec tri
RemoveItem 2, True
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
'Supprime 10 éléments, sans tri
For i = 5 To 14
RemoveItem i
Next i
'Affiche tous les éléments et l'occupation mémoire
For i = 0 To ItemsCount - 1
Debug.Print Format(mData(i), "00 ");
Next i
Debug.Print
Debug.Print ItemsCount & "/" & TotalSize & " (" & UsedSizeInBytes & "/"
& TotalSizeInBytes & ")"
End Sub
--
Picalausa François
"X" <x> a écrit dans le message de news:
> Peut-on mettre ou enlever des variable sur le principe du redim de
> comment faire ???
> Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre
> de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
> l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
De toutes façons, array ne travaille qu'avec du Variant et donc, pour
programmes effectuant du calcul intensif (et les programmes bien
est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour
tableau fortement typé plus facilement.
"X" <x> a écrit dans le message de news:
eGKwAypHGHA.1032@TK2MSFTNGP12.phx.gbl...
> Peut-on mettre ou enlever des variable sur le principe du redim de
> comment faire ???
> Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre
> de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
> l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
De toutes façons, array ne travaille qu'avec du Variant et donc, pour
programmes effectuant du calcul intensif (et les programmes bien
est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour
tableau fortement typé plus facilement.
"X" <x> a écrit dans le message de news:
> Peut-on mettre ou enlever des variable sur le principe du redim de
> comment faire ???
> Par exemple un fois avec l'array j'ai besoin de 3 variable, un autre
> de 10, mais sans le savoir à l'avance, c'est avec l'interface qu'on
> l'indique,
Hello,
Tu ne peux ajouter ou retirer de paramètres dynamiquement à l'appel
De toutes façons, array ne travaille qu'avec du Variant et donc, pour
programmes effectuant du calcul intensif (et les programmes bien
est a proscrire.
Par contre, il est tout à fait possible d'écrire des wrappers pour
tableau fortement typé plus facilement.