Liste virtuali: come caricare solo ciò che serve, quando serve

Liste virtuali, come fare per implementarle, i benefici di questi elenchi di valori al programma gestionale.

Nel mio lavoro con software gestionali, mi sono spesso trovato a gestire elenchi molto lunghi: articoli di magazzino, movimenti, report. Le list view sono strumenti potenti, ma il modo in cui carichiamo i dati può fare la differenza tra un’interfaccia fluida e una che rallenta tutto.

Statico vs Virtuale

Il caricamento statico è semplice: tutti i dati vengono inseriti nella lista all’avvio. Ma con migliaia o milioni di righe, questo approccio diventa lento e pesante.
Nei miei software gestionali, una lista con 12.000 articoli impiegava 45 secondi e 5 GB di RAM.
Con il caricamento virtuale, gli stessi dati si caricano in 0,5 secondi e consumano solo 200 MB di RAM.

Calus 5.0
Finestra con articoli in Calus 5.0, un mio vecchio software gestionale per il magazzino ora rimpiazzato da MerciGest

Come funziona una lista virtuale

In una list view virtuale, i dati non vengono caricati tutti subito. Solo quelli visibili vengono richiesti e mostrati, riga per riga, durante lo scrolling.
Il controllo scatena un evento (LVN_GETDISPINFO) e il software recupera i dati dal database in tempo reale.
Per gestire l’indice, uso un array ATL con gli identificativi, così ogni riga sa cosa deve mostrare.

Vantaggi

  • Prestazioni nettamente superiori
  • Minore consumo di RAM
  • Ottimo per dati remoti o archivi molto grandi
  • Esperienza utente più fluida

Esempi d’uso

  • Liste di articoli in magazzino
  • Movimenti contabili
  • Caselle combinate (combo box) con migliaia di voci

Se ti interessa approfondire gli aspetti tecnici, eventi, array, threading, ottimizzazioni, scrivimi nei commenti, sarò lieto di mostrarti il codice utilizzato.

Giampaolo Rossi
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Articoli: 324

Lascia una risposta

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.