Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201

    [VISUAL BASIC 6] Array Associativi e Liste

    Salve a tutti
    Utilizzo Visual Basic da poco ed avrei bisogno di sapere qual è il modo più semplice per gestire un insieme dinamico di elementi il cui numero non è sovrastimabile.
    Ho provato l'oggetto collection, ma non soddisfa tutte le mie necessità, perché non ha metodi di ricerca come hasKey() o cose simili.

    Domanda n.1
    esistono in VB6 gli array associativi?

    Domanda n.2
    esiste un tipo lista completo di tutte le funzioni che ha, ad esempio, la list in java?

    Grazie

  2. #2
    1. Non nativamente (forse qualche libreria mette a disposizione classi di questo genere);
    2. Idem.
    Rivolgiti ai linguaggi .NET (come VB.NET o C#), a C++ o a Java (giusto per fare qualche esempio).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.