Tempo addietro avevo scritto qualcosa di simile alla TList di Delphi in linguaggio VB6.
Ne riporto il codice:
codice:
' Costanti private
Private Const ArrayListMaxListSize = 2048
' Campi privati
Private FCapacity As Long
Private FCount As Long
Private FList() As Variant
' Constructor()
' inizializza un'istanza dell'oggetto.
Private Sub Class_Initialize()
ReDim FList(ArrayListMaxListSize)
FCapacity = 0
FCount = 0
End Sub
' Destructor()
' dealloca la memoria utilizzata dall'oggetto.
Private Sub Class_Terminate()
Clear
Erase FList
End Sub
' Grow()
' incrementa le capacità della lista.
Private Sub Grow()
Dim Delta As Long
If FCapacity > 64 Then
Delta = FCapacity Mod 4
Else
If FCapacity > 8 Then
Delta = 16
Else
Delta = 4
End If
End If
Capacity = FCapacity + Delta
End Sub
' Add()
' aggiunge un elemento alla lista.
Public Function Add(ByVal item As Variant) As Long
Dim Result As Long
Result = FCount
If Result = FCapacity Then
Grow
End If
If IsObject(item) Then
Set FList(Result) = item
Else
FList(Result) = item
End If
FCount = FCount + 1
Add = Result
End Function
' Clear()
' elimina tutti gli elementi dalla lista.
Public Sub Clear()
Count = 0
Capacity = 0
End Sub
' Delete()
' cancella l'elemento della lista avente l'indice specificato.
Public Sub Delete(ByVal Index As Long)
Dim i As Long
Dim item As Variant
If (Index >= 0) Or (Index < FCount) Then
If Index < FCount Then
For i = (Index + 1) To (FCount - 1)
If IsObject(FList(i)) Then
Set FList(i - 1) = FList(i)
Else
FList(i - 1) = FList(i)
End If
Next
End If
FCount = FCount - 1
End If
End Sub
' Exchange()
' scambia la posizione di due elementi della lista.
Public Sub Exchange(ByVal Index1 As Long, Index2 As Long)
Dim item As Variant
If (Index1 < 0) Or (Index1 >= FCount) Then
Err.Raise 6
End If
If (Index2 < 0) Or (Index2 >= FCount) Then
Err.Raise 6
End If
If IsObject(FList(Index1)) Then
Set item = FList(Index1)
Else
item = FList(Index1)
End If
If IsObject(FList(Index2)) Then
Set FList(Index1) = FList(Index2)
Else
FList(Index1) = FList(Index2)
End If
If IsObject(item) Then
Set FList(Index2) = item
Else
FList(Index2) = item
End If
End Sub
' Expand()
' aumenta la capacità della lista, se necessario.
Public Sub Expand()
If FCount = FCapacity Then
Grow
End If
End Sub
' First()
' restituisce il primo elemento della lista.
Public Function First() As Variant
If IsObject(FList(0)) Then
Set First = FList(0)
Else
First = FList(0)
End If
End Function
' IndexOf()
' restituisce l'indice di un elemento della lista.
Public Function IndexOf(ByVal item As Variant) As Long
Dim Result As Long
Result = 0
While (Result < FCount) And (Not (FList(Result) Is item))
Result = Result + 1
Wend
If Result = FCount Then
Result = -1
End If
IndexOf = Result
End Function
' Insert()
' inserisce un elemento nella lista.
Public Sub Insert(ByVal Index As Long, item As Variant)
Dim i As Long
If (Index < 0) Or (Index > FCount) Then
Err.Raise 6
End If
If FCount = FCapacity Then
Grow
End If
If Index < FCount Then
For i = FCount To (Index + 1) Step -1
If IsObject(FList(i - 1)) Then
Set FList(i) = FList(i - 1)
Else
FList(i) = FList(i - 1)
End If
Next
End If
If IsObject(item) Then
Set FList(Index) = item
Else
FList(Index) = item
End If
FCount = FCount + 1
End Sub
' Last()
' restituisce l'ultimo elemento della lista.
Public Function Last() As Variant
If IsObject(FCount - 1) Then
Set Last = FList(FCount - 1)
Else
Last = FList(FCount - 1)
End If
End Function
' Move()
' muove un elemento all'interno della lista cambiandogli posizione.
Public Sub Move(ByVal CurIndex As Long, NewIndex As Long)
Dim item As Variant
If CurIndex <> NewIndex Then
If (NewIndex < 0) Or (NewIndex >= FCount) Then
Err.Raise 6
End If
If IsObject(FList(CurIndex)) Then
Set item = FList(CurIndex)
Else
item = FList(CurIndex)
End If
Set FList(CurIndex) = Nothing
Delete CurIndex
Insert NewIndex, Nothing
If IsObject(item) Then
Set FList(NewIndex) = item
Else
FList(NewIndex) = item
End If
End If
End Sub
' Remove()
' rimuove un elemento dalla lista.
Public Function Remove(ByVal item As Variant)
Dim Result As Long
Result = IndexOf(item)
If Result >= 0 Then
Delete (Result)
End If
Remove = Result
End Function
' Pack()
' rimuove gli elementi distrutti o nulli dalla lista.
Public Sub Pack()
Dim i As Long
For i = FCount - 1 To 0 Step -1
If FList(i) Is Nothing Then
Delete (i)
End If
Next
End Sub
' Capacity
' restituisce la capacità della lista.
Public Property Get Capacity() As Long
Capacity = FCapacity
End Property
' Capacity
' imposta la capacità della lista.
Public Property Let Capacity(ByVal NewCapacity As Long)
If (NewCapacity < FCount) Or (NewCapacity > ArrayListMaxListSize) Then
Err.Raise 6
End If
If NewCapacity <> FCapacity Then
ReDim Preserve FList(NewCapacity)
FCapacity = NewCapacity
End If
End Property
' Capacity
' restituisce il numero di elementi nella lista.
Public Property Get Count() As Long
Count = FCount
End Property
' Capacity
' imposta il numero di elementi nella lista.
Public Property Let Count(ByVal NewCount As Long)
Dim i As Long
If (NewCount < 0) Or (NewCount > ArrayListMaxListSize) Then
Err.Raise 6
End If
If NewCount > FCapacity Then
Capacity = NewCount
End If
If NewCount > FCount Then
For i = (NewCount - 1) To FCount Step -1
Set FList(i) = Nothing
Next
Else
For i = FCount - 1 To NewCount Step -1
Delete i
Next
FCount = NewCount
End If
End Property
' Items
' restituisce l'elemento della lista avente l'indice specificato.
Public Property Get Items(ByVal Index As Long) As Variant
If (Index < 0) Or (Index >= FCount) Then
Err.Raise 6
End If
If IsObject(FList(Index)) Then
Set Items = FList(Index)
Else
Items = FList(Index)
End If
End Property
' Items
' imposta il riferimento per l'elemento della lista avente l'indice specificato.
Public Property Set Items(ByVal Index As Long, ByVal item As Variant)
If (Index < 0) Or (Index >= FCount) Then
Err.Raise 6
End If
If Not (item Is FList(Index)) Then
If IsObject(item) Then
Set FList(Index) = item
Else
FList(Index) = item
End If
End If
End Property
' List
' restituisce il vettore di elementi interno.
Public Property Get List() As Variant()
List = FList
End Property
Dovrebbe trattare sia tipi valore, come Integer, Double e così via, e oggetti.
Segnalatemi eventuali bug.
Ciao!