PDA

Ver la Versión Completa : Cargar tabla Access en un TListView


dabas
19-10-2003, 01:58:13
Como se podría hacer para cargar una tabla de Access de tres campos (entero largo, char(120), doble) en un TLisView con la mayor rapidez posible.

Yo lo hacía registro por registro pero el listview cambia al hacer click y ralentiza un poco.

Por lo menos, ¿cómo puedo hacer que no se vea nada hasta que esten realmente cargados?.

Gracias por vuestro tiempo.
Hasta otra.

roman
19-10-2003, 07:03:00
Posteado originalmente por dabas
Como se podría hacer para cargar una tabla de Access de tres campos (entero largo, char(120), doble) en un TLisView con la mayor rapidez posible.

Yo lo hacía registro por registro pero el listview cambia al hacer click y ralentiza un poco.

Por lo menos, ¿cómo puedo hacer que no se vea nada hasta que esten realmente cargados?.


La segunda pregunta es muy sencilla:


ListView.Items.BeginUpdate;

{ código para cargar el listview }

ListView.Items.EndUpdate;


Pero no te recomiendo para nada este método. El listview es particularmente lento para cargar muchos registros. Con tablas de 100 o 200 registros funciona pero tablas mayores, 500 o más registros, es muy lento.

Sin embargo esto no quiere decir que no se pueda usar el listview. Lo que tienes que hacer es ponerlo en modo virtual.

Un listview virtual carga los datos conforme los va necesitando, esto es, conforme el usuario se desplaza por los items de manera que la visualización de los datos es inmediata. De hecho este modo virtual es lo que utiliza un DBGrid a final de cuentas.

Hice una pequeña prueba abriendo una tabla de Access con 74000 registros y el despliegue comienza en 2 segundos pero en realidad es el tiempo que tarde la conexión ADO en abrir. Tanto el listview como el dbgrid que usé en la prueba desplegaron los datos al mismo tiempo.

Una vez abierta la conexión el despliegue y desplazamiento por el listview son inmediatos.

Para usar el listview en modo virtual tienes que poner en true su propiedad OwnerData e indicarle cuántos items va a tener (o sea, el número de registros en la tabla). Los datos se los proporcionas en el evento OnData que pasa un parámetro Item que debes llenar según el registro que le toque (que será el marcado por la propiedad Index de Item):


procedure TForm1.AbrirTabla;
begin
AdoTable.Open;
ListView.Items.Count := AdoTable.RecordCount;
end;

procedure TForm1.ListViewData(Sender: TObject; Item: TListItem);
begin
// Colar el cursor de la tabla al índice requerido
// Se suma 1 porque RecNo comienza en 1 e Item.Index en 0
AdoTable.RecNo := Item.Index + 1;
with Item do
begin
Caption := AdoTable.FieldByName('campo1').AsString;
SubItems.Add(AdoTable.FieldByName('campo2').AsString);
SubItems.Add(AdoTable.FieldByName('campo3').AsString);
end;
end;


Yo utilicé ADO pero será similar si usas BDE u otra cosa.

// Saludos

dabas
23-10-2003, 11:09:36
Gracias, me ha ayudado mucho