Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [VB6] Lista dinamica (Array o collection?)

    Ciao a tutti!
    Sto sviluppando da pochissimo in VB, quindi siate magnanimi! :adhone:
    Come da oggetto, ho bisogno di una lista dinamica, cioè di cui non so a priori la dimensione. So che utilizzando un array, anche se la dimensione deve essere dichiarata prima, è possibile ridimensionarlo. Inoltre so che esistono le collection.
    Tra le due alternative (e se ce ne fosse qualche altra è ben accetta! ) quale ritenete "migliore", cioè più facilmente gestibile? Quale mi consigliate insomma? E perchè?
    Grazie mille alle anime pie che risponderanno!

  2. #2
    o ca... ho sbagliato forum!
    ehm... aspetto la mano impietosa dei moderatori... :quipy:

  3. #3

  4. #4
    Uhm..?!?
    Ma in Visual Basic non esiste la Listbox?
    Inserisci lì nò?

  5. #5
    Originariamente inviato da Michele Facchin
    Uhm..?!?
    Ma in Visual Basic non esiste la Listbox?
    Inserisci lì nò?
    ecco.. avevo giusto dimenticato...
    non c'è nessun form (suppongo che la Listbox sia nei form)... :quipy:

  6. #6
    vabbè che ho sbagliato forum.. però...

  7. #7
    Allora considerando che non ci sono form (mah ...) sara' un modulo

    Puoi fare cosi'

    A-puoi creare un array e resizarlo con questa funzione
    codice:
    Public Sub AResize(ByRef arrArray As Variant, _
            ByVal intSize As Integer, Optional _
            ByVal boolClear As Boolean)
        ' Resize the array to a new given size
        If boolClear Then
            ' Clear all existing items
            ReDim arrArray(intSize)
        Else
            ' Preserve all existing items
            ReDim Preserve arrArray(intSize)
        End If
    End Sub
    oppure se peschi da database

    codice:
    for i=1 to RS.RecordCOunt
    'qui crei l' array
    next i
    era quello che volevi?

  8. #8
    Originariamente inviato da raffaeu
    Allora considerando che non ci sono form (mah ...) sara' un modulo

    Puoi fare cosi'

    A-puoi creare un array e resizarlo con questa funzione
    codice:
    Public Sub AResize(ByRef arrArray As Variant, _
            ByVal intSize As Integer, Optional _
            ByVal boolClear As Boolean)
        ' Resize the array to a new given size
        If boolClear Then
            ' Clear all existing items
            ReDim arrArray(intSize)
        Else
            ' Preserve all existing items
            ReDim Preserve arrArray(intSize)
        End If
    End Sub
    oppure se peschi da database

    codice:
    for i=1 to RS.RecordCOunt
    'qui crei l' array
    next i
    era quello che volevi?
    eh si, solo un modulo, senza form!
    La prima parte è quella che mi interessa. Ma la differenza con le Collection qual'è? Con gli array bisogna ogni volta ridimensionare la grandezza, ma con le COllection? Tu cosa mi consiglieresti?
    Grazie comunque per la risposta!

  9. #9
    Infine per risponderti

    Se non sai a priori come sara' strutturato l' array nell' indice

    oggetto[i] dove i è l' indice, usi una variabile

    quindi fai un ciclo for i = 1 to variabile

    chiarito le idee?


  10. #10
    ma guarda che le collection sono le prorpieta' degli oggetti!!

    DA MSDN

    In Visual Basic è disponibile la classe generica Collection utilizzabile per definire insiemi personalizzati. Non vi sono limiti al numero di oggetti Collection, ovvero di istanze della classe Collection, che è possibile creare. È possibile utilizzare gli oggetti Collection come base per la creazione di classi di insiemi e modelli di oggetti personalizzati, come descritto in "Creazione di classi di insiemi personalizzate" e "Modelli di oggetti" più avanti in questo capitolo.

    Ad esempio, gli insiemi rappresentano un ottimo metodo per organizzare più form. La sezione "Applicazioni con interfaccia a documenti multipli o MDI" in "Creazione di un'interfaccia utente", descrive applicazioni in cui l'utente può aprire un numero qualsiasi di finestre del documento. Il codice indicato di seguito illustra come utilizzare il metodo Add di un insieme per mantenere aggiornato un elenco delle finestre MDI secondarie create dall'utente. Questo codice presuppone l'utilizzo di un form denominato mdiDocument, la cui proprietà MDIChild è impostata su True.

    ' Insieme a livello di modulo nel form MDI superiore.
    Public colDocuments As New Collection

    ' Codice per la creazione di un nuovo form per
    ' documento MDI secondario.
    Private Sub mnuFileNew()
    Dim f As New mdiDocument
    Static intDocumentNumber As Integer
    intDocumentNumber = intDocumentNumber + 1
    ' La riga seguente crea il form.
    f.Caption = "Documento" & intDocumentNumber
    ' Aggiunge il riferimento all'oggetto
    ' all'insieme.
    colDocuments.Add f
    f.Show
    End Sub

    L'insieme colDocuments può essere considerato un sottoinsieme dell'insieme predefinito Forms e contiene solo le istanze del form mdiDocument. Le dimensioni dell'insieme vengono adattate automaticamente a mano a mano che ogni nuovo form viene aggiunto. È possibile utilizzare For Each ... Next per eseguire un'iterazione nell'insieme. Se si desidera assegnare al form una chiave da utilizzare per il recupero del form, è possibile specificare una stringa di testo come secondo parametro del metodo Add, come descritto più avanti in questa sezione.

    La parola chiave New nella dichiarazione della variabile colDocuments determina la creazione di un oggetto Collection la prima volta che nel codice si fa riferimento alla variabile. Poiché Collection è una classe, anziché un tipo di dati, è necessario crearne un'istanza e conservare un riferimento a tale istanza (oggetto) in una variabile.

    Come qualsiasi altro oggetto, un oggetto Collection viene distrutto quando l'ultima variabile che ne contiene un riferimento viene impostata su Nothing o esce dall'area di validità. Tutti i riferimenti all'oggetto contenuti nell'insieme verranno rilasciati. Per questo motivo, la variabile colDocuments viene dichiarata nel form MDI principale, in modo che rimanga valida per tutto il ciclo di vita del programma.

    Nota Se si utilizza un insieme per organizzare i form, utilizzare il metodo Remove dell'insieme per eliminare il riferimento all'oggetto dall'insieme dopo aver scaricato il form. Non è possibile recuperare la memoria utilizzata dal form fino a quando esiste un riferimento al form, e il riferimento mantenuto dall'oggetto Collection ha lo stesso valore di un riferimento in una variabile oggetto.

    Composizione di un oggetto Collection
    Un oggetto Collection memorizza ogni elemento in una variabile Variant. Ciò significa che gli elementi che è possibile aggiungere a un oggetto Collection corrispondono agli elementi che possono essere memorizzati in una variabile Variant, tra i quali i tipi di dati standard, gli oggetti e le matrici, ma non i tipi definiti dall'utente.

    Le variabili Variant occupano sempre 16 byte, indipendentemente dal loro contenuto e pertanto l'utilizzo di un oggetto Collection non è efficiente come l'utilizzo delle matrici. Tuttavia, non è mai necessario eseguire il ReDim di un oggetto Collection, fattore che garantisce una migliore leggibilità e manutenzione del codice. Inoltre, a differenza delle matrici, gli oggetti Collection consentono una ricerca indicizzata estremamente veloce.

    Nota Per essere precisi, una variabile Variant occupa sempre 16 byte anche se i dati sono in realtà salvati altrove. Ad esempio, se si assegna una stringa o una matrice a una variabile Variant, la variabile contiene un puntatore a una copia della stringa o dei dati della matrice. Soltanto 4 byte della variabile Variant vengono utilizzati per il puntatore nei sistemi a 32 bit e i dati non si trovano in effetti all'interno della variabile Variant.

    Se viene memorizzato un oggetto, la variabile Variant contiene il riferimento all'oggetto, proprio come una variabile oggetto. Così come avviene con le stringhe e le matrici, vengono utilizzati soltanto 4 byte della variabile Variant.

    I tipi di dati numerici vengono salvati all'interno della variabile Variant. Indipendentemente dal tipo di dati, la variabile Variant occupa comunque 16 byte.

    Nonostante le dimensioni delle variabili Variant, in molti casi sarà opportuno utilizzare un oggetto Collection per salvare tutti i tipi di dati sopra elencati. È importante essere a conoscenza del compromesso a cui si va incontro: gli oggetti Collection consentono di scrivere un codice molto chiaro e gestibile ma gli elementi devono essere memorizzati in variabili Variant.

    Proprietà e metodi dell'oggetto Collection
    L'oggetto Collection include proprietà e metodi che possono essere utilizzati per inserire, eliminare e recuperare elementi negli insiemi.

    Proprietà o metodo Descrizione
    Metodo Add Aggiunge gli elementi all'insieme.
    Proprietà Count Restituisce il numero di elementi nell'insieme. Di sola lettura.
    Metodo Item Restituisce un elemento, in base all'indice o alla chiave.
    Metodo Remove Elimina un elemento dall'insieme, in base all'indice o alla chiave.


    Queste proprietà e metodi forniscono solo i servizi basilari per gli insiemi. Il metodo Add, ad esempio, non consente di verificare il tipo di un oggetto aggiunto in un insieme, per assicurarsi che l'insieme contenga solo un tipo di oggetto. È possibile integrare funzionalità aggiuntive, oltre a proprietà, metodi ed eventi, creando una classe di insieme personalizzata, come descritto in "Creazione di classi di insiemi personalizzate" più avanti in questo capitolo.

    I servizi fondamentali relativi all'aggiunta, all'eliminazione e al recupero di elementi da un insieme dipendono dalle chiavi e dagli indici. Una chiave è un valore di tipo String. Può trattarsi di un nome, di un numero di patente, di un codice fiscale o semplicemente di un valore Integer convertito in String. Il metodo Add consente di associare una chiave a un elemento, come descritto più avanti in questa sezione.

    Un indice è un valore Long compreso tra uno (1) e il numero di elementi nell'insieme. È possibile controllare il valore iniziale dell'indice di un elemento, utilizzando i parametri predefiniti before e after, ma il valore potrebbe subire delle modifiche mano a mano che altri elementi vengono aggiunti ed eliminati.

    Nota Un insieme il cui indice inizia da 1 viene definito con base uno, come descritto in "Insiemi in Visual Basic".

    È possibile utilizzare l'indice per eseguire un'iterazione tra gli elementi di un insieme. Ad esempio, il codice seguente illustra due metodi per concedere a tutti i dipendenti in un insieme di oggetti Employee un aumento del 10 per cento, supponendo che la variabile colEmployees contenga un riferimento a un oggetto Collection.

    Dim lngCt As Long
    For lngCt = 1 To mcolEmployees.Count
    mcolEmployees(lngCt).Rate = _
    mcolEmployees(lngCt).Rate * 1.1
    Next

    Dim emp As Employee
    For Each emp In mcolEmployees
    emp.Rate = emp.Rate * 1.1
    Next

    Suggerimento Per ottenere prestazioni migliori, è consigliabile utilizzare For Each per eseguire un'iterazione tra tutti gli elementi di un oggetto Collection. For Each è di gran lunga più rapido dell'iterazione con indice. Non si applica a tutte le implementazioni degli insiemi, dipende dal modo in cui l'insieme memorizza internamente i dati.

    Aggiunta di elementi in un insieme
    Utilizzare il metodo Add per aggiungere un elemento a un insieme. La sintassi è la seguente:

    Sub Add (elemento As Variant [, chiave As Variant]

    [, before As Variant] [, after As Variant] )

    Ad esempio, per aggiungere un oggetto ordine di lavoro a un insieme di ordini di lavoro, utilizzando la proprietà ID dell'ordine di lavoro come chiave, è possibile scrivere la seguente istruzioni:

    colWorkOrders.Add woNew, woNew.ID

    In questo modo si presuppone che la proprietà ID sia una stringa. Se la proprietà è un numero (ad esempio un valore Long), utilizzare la funzione CStr per convertirlo in valore String come necessario per le chiavi:

    colWorkOrders.Add woNew, CStr(woNew.ID)

    Il metodo Add supporta argomenti predefiniti. Per aggiungere un elemento come terzo elemento, è possibile scrivere:

    colWorkOrders.Add woNew, woNew.ID, after:=2

    È possibile utilizzare gli argomenti predefiniti before e after per mantenere ordinato un insieme di oggetti. Ad esempio, before:=1 inserisce un elemento all'inizio dell'insieme, in quanto gli oggetti Collection hanno indici con base uno.

    Eliminazione di elementi da un insieme
    Utilizzare il metodo Remove per eliminare un elemento da un insieme. La sintassi è la seguente:

    oggetto.Remove indice

    L'argomento indice può indicare la posizione dell'elemento che si desidera eliminare o la chiave dell'elemento. Se la chiave del terzo elemento in un insieme è "W017493", è possibile utilizzare indifferentemente una delle seguenti istruzioni per eliminarlo:

    colWorkOrders.Remove 3
    –oppure–

    colWorkOrders.Remove "W017493"

    Recupero di elementi da un insieme
    Utilizzare il metodo Item per recuperare elementi specifici da un insieme. La sintassi è la seguente:

    [Set] variabile = oggetto.Item(indice)

    Come per il metodo Remove, l'argomento indice può indicare la posizione nell'insieme o la chiave dell'elemento. Utilizzando gli stessi esempi del metodo Remove, entrambe le istruzioni che seguono consentono di recuperare il terzo elemento dell'insieme:

    Set woCurrent = colWorkOrders.Item(3)
    – o –

    Set woCurrent = colWorkOrders.Item("W017493")

    Se come chiavi vengono utilizzati dei numeri interi, è necessario utilizzare la funzione CStr per convertirli in stringhe prima di passarli ai metodi Item o Remove. Un oggetto Collection presuppone sempre che un indice sia un numero intero.

    Suggerimento È consigliabile evitare di passare un valore all'oggetto Collection senza specificare se si tratta di un indice o di una chiave. Se si desidera che un valore venga interpretato come chiave e la variabile contenente il valore non è di tipo String, utilizzare la funzione CStr per convertire il valore. Se si desidera che un valore venga interpretato come indice e la variabile contenente il valore non è di tipo Integer, utilizzare la funzione CLng per convertire il valore.

    Il metodo predefinito Item
    Item è il metodo predefinito per un oggetto Collection e pertanto è possibile ometterlo per accedere a un elemento in un insieme. L'esempio di codice precedente potrebbe quindi essere scritto anche nel modo seguente:

    Set woCurrent = colWorkOrders(3)
    –oppure–

    Set woCurrent = colWorkOrders("W017493")

    Importante Gli oggetti Collection aggiornano i numeri di indice automaticamente, in base all'aggiunta o all'eliminazione di elementi. L'indice numerico di un elemento è quindi soggetto a variazioni. Se si salva un numero di indice non si può partire dal presupposto che tale numero rimarrà invariato e quindi non è consigliabile utilizzarlo in seguito per tentare di recuperare lo stesso elemento originale. Per ottenere questo risultato è necessario utilizzare le chiavi.

    Utilizzo del metodo Item per richiamare proprietà e metodi
    Non è necessario recuperare un riferimento a un oggetto da un insieme ed inserirlo in una variabile oggetto per utilizzarlo. È possibile utilizzare il riferimento mentre si trova ancora nell'insieme.

    Si supponga, ad esempio, che per l'oggetto WorkOrder dell'esempio di codice precedente sia disponibile una proprietà Priority. Entrambe le istruzioni seguenti consentono di impostare la priorità di un ordine di lavoro:

    colWorkOrders.Item("W017493").Priority = 3
    colWorkOrders("W017493").Priority = 3

    Questa routine funziona poiché Visual Basic valuta l'espressione da sinistra a destra. In presenza del metodo Item, esplicito o implicito, Visual Basic recupera un riferimento all'elemento indicato (in questo caso, l'oggetto WorkOrder la cui chiave è W017493) e utilizza questo riferimento per valutare il resto della riga.

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.