Trucos ListBox "virtual"

Este truco está sacado de un programa de demostración del nivel Premium del Development Exchange e ilustra cómo usar la clase CVirtualList que emplea el multicasting para atrapar los eventos generados por un listbox y un scrollbar vertical. Los dos controles simulan un listbox con más elementos de los visibles y el listbox pide al programa principal, mediante eventos, los elementos que deben hacerse visibles.

Cuando cargas cientos o miles de elementos en un listbox, un listbox "virtual" resulta mucho más rápido que uno "normal".
La diferencia es espectacular. El ejemplo rellena los listbox con el título de los 8569 registros de la tabla Titles y poniendo el campo PubId en la propiedad ItemData. El tiempo para un listbox normal son 7,41 seg., para uno virtual con matrices es de 1,15 seg. y para uno virtual accediendo directamente al recordset es de 0,05 seg. Sí, has leído bien 0,05 segundos.
El programa de demostración te muestra el tiempo de los dos controles y puedes variar el número de elementos que se deben cargar en los controles.

He modificado el ejemplo. Ahora hay tres listbox, uno "normal" y dos "virtuales".
La carga de los mismos se puede hacer añadiendo el número de elementos que quieras o a partir de la base de datos biblio.mdb que viene con el Visual Basic (para ello debe encontrarse en el directorio c:\Archivos de programa\DevStudio\Vb).
Si cargas los datos generando el número de elementos deseado sólo se emplean el listbox "normal" y el primero de los "virtuales". Si es a partir de la base de datos se usan los tres, ya que los virtuales se cargan de dos maneras distintas: el primero rellenando una matriz en memoria con el recordset completo y pasando ésta al listbox, y el segundo leyendo directamente del recordset los elementos necesarios cada vez.
Yo creo que el segundo método es el mejor porque la carga es más rápida, emplea menos memoria al no tener que crear matrices para almacenar los datos y la búsqueda y desplazamiento por la lista son similares al que emplea matrices.


La clase CVirtualList se debe inicializar con el método Init antes de ser usada:

Private WithEvents VList As CVirtualList

    Sub InitListbox()
        Set VList = New CVirtualList
        VList.Init List1, VScroll1, NumeroDeElementos&
    End Sub

luego tu programa debe responder al evento GetItems:

Private Sub VList_GetItems(Items() as string)
    ' rellenar el array Items() con los datos
End Sub

He añadido soporte para la propiedad ItemData, por lo que el evento queda :

Private Sub VList_GetItems(Items() as string, ItemData() as long)
    ' rellenar el array Items() con los datos
        ' rellenar el array ItemData() con la propiedad ItemData para cada elemento
End Sub


El array Items() es dimensionado por la clase CVirtualList y sus "límites" (LBound y UBound) corresponden al primero y último de los datos necesarios para mostrar correctamente el listbox. Cuando el usuario hace scroll de una fila arriba o abajo el array tendrá sólo un elemento. Puedes usar este evento para recuperar datos de una array muy grande, de un fichero de texto, de un recordset, etc.

También puedes activar la propiedad IncrementalSearch :

    VList.IncrementalSearch = True

esta propiedad hace que el listbox "virtual" simule el comportamiento del DBList, permitiendo al usuario final encontrar rápidamente un elemento tecleando sus caracteres iniciales cuando el listbox tiene el foco. Para soportar esta característica, lógicamente, debes reaccionar al evento FindItem:

    Private Sub VList_FindItem(search As String, foundIndex As Long)

donde Search son los caracteres teclados por el usuario y FoundIndex es el valor que el programa debe asignar con el siguiente elemento que satisface la búsqueda (si la búsqueda falla, simplemente déjalo sin modificar).

He modificado un poco la búsqueda porque no funcionaba cuando el elemento que buscabas estaba en la "última página" de la lista.

El listbox "virtual" también soporta otras propiedades estándar del listbox, incluyendo TopIndex, ListCout y ListIndex. Para más información consulta los comentarios del fichero CVirtualList.cls.

También he modificado un poco el ajuste de la barra de desplazamiento al listbox para que quede visualmente igual a un listbox.

En todos los cambios que he hecho a la clase CVirtualList he dejado entre comentarios el código original.

Download virtlist.zip  



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com