2010-11-20 23 views
8

Hay una vista de lista con varios campos en Delphi. Un hilo revisa y agrega elementos a la vista de lista. Si hay el mismo título, se agregará un número entero en el subelemento de este título. Cuando el recuento de elementos es inferior a 2000, el rendimiento es correcto. Cuando se revisan y agregan elementos y el recuento de elementos es más de aproximadamente 2000, el rendimiento es pobre. Cuando el número de elementos es mayor a 20,000, el rendimiento puede describirse como extremadamente lento. ¿Hay alguna forma de leer y escribir rápidamente en la lista cuando los artículos pueden llegar a 50,000 o 100,000?¿Cómo leer y escribir rápidamente en listview en delphi?

Muchas gracias de antemano

Editar:

Hemos leído todas sus respuestas y gracias a todos por su ayuda.

Respuesta

9

Solo necesita usar su lista en modo "virtual".

  1. Ponga un TListBox en su formulario;
  2. Establezca la propiedad Style en lbVirtual.
  3. Establezca la propiedad Count en la cantidad de elementos de su lista.
  4. A continuación, utilice el controlador de OnData para proporcionar el texto que se mostrará en la solicitud:

Al igual que en el código (sustituir con algunos datos de su base de datos o un TStringList o tal):

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer; 
    var Data: String); 
begin 
    Data := Format('Item %d',[Index+1]); // set the text to be displayed 
end; 

Puede personalizar aún más el dibujo utilizando el estilo lbVirtualOwnerDraw, y debe dibujar elementos utilizando un controlador de eventos OnDrawItem. Hay algún código de muestra en la documentación de Delphi (al menos en Delphi 7). ;)

En el modo Virtual, puede visualizar 50000 o 100000 elementos de forma instantánea.

Para almacenar el texto, utilizar una buena TStringList será más rápido que el método Items de TListBox, porque esta propiedad Items [] tendrá que comunicarse con Windows con mensajes GDI "lentos" para cada elemento, mientras que una TStringList solo almacenará el texto en el montón Delphi, que suele ser mucho más rápido.

+0

Muchas gracias. – Dylan

6

Puede llamar a BeginUpdate y EndUpdate en la vista de lista para mejorar el rendimiento, evitando que la vista de lista se rediseñe durante la actualización. Pero esto probablemente no te dará el impulso que deseas. Además, debe saber que acceder a los controles VCL directamente desde un subproceso no es seguro a menos que esté sincronizado.

Creo que sería mejor omitir la vista de lista y elegir un control de terceros como Virtual Tree View que es genial y gratis. :)

+0

Miré rápidamente el componente Vista de árbol virtual. ¿Qué tan "difícil" es colocarlo en su lugar en una aplicación que utiliza varios controladores y accesos estándar TListView y TTreeView y funciona en las columnas y nodos de árbol en todo el código? ¿Estamos hablando de una reescritura completa de esas partes? Si es así, ¿cuánta diferencia en la ganancia de velocidad sería simplemente quedarse con TTreeView y TListView bu cambiarlos para que funcionen como virtuales? – inquam

+0

Honestamente, no sé la diferencia de velocidad. Creo que un TListView virtual también podría ser bastante rápido, pero no lo he usado de esa manera, así que no puedo darte una comparación adecuada. – GolezTrol

10

El control Delphi TListView es un envoltorio alrededor del componente de vista de lista de Windows. En su modo de funcionamiento predeterminado, las copias de los datos de la lista se transfieren desde su aplicación al control de Windows y esto es lento.

La alternativa a esto se conoce como una vista de lista virtual en la terminología de Windows. Su aplicación no pasa los datos al control de Windows. En cambio, cuando el control necesita mostrar datos, solicita a su aplicación solo los datos que se necesitan.

El control Delphi TListView expone vistas de lista virtual mediante el uso de la propiedad OwnerData. Tendrá que volver a escribir el código de la vista de lista, pero en realidad es la única solución.

+2

también iba a sugerir que tenía que cambiar al modo virtual de la vista de lista. Personalmente utilizamos el Virtual TreeView que mencionó Golztrol. –

+1

La vista de árbol virtual de Mike Lischke es bastante impresionante. Sin embargo, hay mucho que decir sobre el uso del componente de vista de lista si tiene una lista en lugar de un árbol porque le permite usar el componente nativo para la plataforma. Además, la vista de árbol virtual presenta bastante curva de aprendizaje. –

+1

Desafortunadamente en este modo, la vista de lista no es compatible con GroupView ... – Tupel

2

Pruebe una vista de lista virtual, utilizando el controlador OnData.

Los datos se mantienen en su propia estructura de datos, la vista de lista llama a su manejador OnData para obtener solo los elementos de datos que necesita cada vez que los necesita. es decir, extrae los datos particulares de su estructura de datos cuando pregunta.

Su otro trabajo es mantener el ItemCount del listview en la cantidad de elementos en la lista. Hace

3

varios años encontramos que además de BeginUpdate/EndUpdate cambiar ViewStyle del ListView a vsIcon antes de la adición de grandes cantidades de datos a la misma, y ​​de nuevo a vsRepord después nos hecho mucho mejor rendimiento. Eso fue en Windows 98 y Windows 2000 si recuerdo correctamente, así que no estoy seguro de si este sigue siendo el caso.

3

BeginUpdate y EndUpdate son una necesidad absoluta al actualizar los elementos. Según su descripción, suena como si recorriera los elementos buscando un título específico. Esto es lento y se hará más notorio con grandes cantidades de datos, obviamente.

Puesto que usted busca un subtítulo correspondiente utilice la función listviews FindCaption.

Esto hace una llamada de Windows para buscar los elementos y es bastante rápido y simple. Si lo encuentra, lo devuelve y puede consultarlo para actualizar el subelemento. De lo contrario, crea un nuevo elemento y continúa con tu procesamiento.

Siempre que su hilo sea seguro y pueda ver un rendimiento decente.

HTH.

+0

FindCaption IIRC conduce a una llamada API, pero puedo estar equivocado al respecto. No tengo Delphi en esta máquina para estar 100% seguro. –