PDA

Ver la Versión Completa : Cual es la forma mas rapida de recorrer un ListView


alquimista
21-03-2009, 12:20:20
Si un listview tiene muchos nombres de ficheros y deseo saber si un fichero esta en la listview.
¿Existe alguna forma que sea muy rapida (aunque sea en asm) de recorrer el listview? o hay que usar el tipico for o while con Items.count-1.

Como esta busqueda se va a repetir muchas veces... no se si sera lento.

Un saludo

Khronos
21-03-2009, 15:25:57
Da igual que método uses, aunque exista un método a la fuerza va a recorrer uno a uno cada item del ListView, es de lógica.


function ExistsInListView(const name: string; LV: TListView): boolean;
var
i: integer;
begin
result:= false;
If Name = '' then exit;
If Assigned(LV) = false then Exit;

for i:= 0 to LV.items.count -1 do
begin
If (lowercase(name) = lowercase(LV.items[i].caption)) then
begin
result:= true;
Break;
end;
end;
end;



Podrías hacer algo como eso, también se podría hacer comparando la segunda o tercera columna. También podrías usar la funcion Pos para hacer la comparación.


Saludos.

coso
21-03-2009, 16:36:30
Hola, otra manera es usar la propiedad text, o commatext, de los items.



if pos(ListView1.Items.Text,nombre_fichero) <> 0
then showmessage('se encontro');



para saber el numero de linea en la que esta, ya seria basandose en la posicion devuelta por pos. saludos.

alquimista
22-03-2009, 00:04:20
Gracias...
En el listview almaceno nombre de archivo, path, tamaño y texto de información.
Solo me interesa saber si el archivo se encuentra en el listview y comprobar por ejemplo si tiene el mismo tamaño o path.

Un saludo...

Lepe
22-03-2009, 04:32:18
Si vas a tener muchos archivos, podrías tener un TStringlist ordenado alfabéticamente, de esta forma las búsquedas van a ser mucho más rápidas usando el típico stringlist1.indexof("miarchivo").

La ordenación del los TStringlist es un QuickSort, que viene de maravilla cuando son muchos elementos.

en ese stringlist, puedes tener un puntero almacenado en la propiedad Objects, que haría referencia al TListViewItem en cuestion con el resto de datos.

Estoy algo oxidado... pero más o menos:

var li:TListViewItem;
Lista:TStringlist;
nombre:string;
begin
Lista := TStringlist.create;
Lista.Sorted := True;
Lista.duplicates:= dupIgnore // ??? seguro???

for i:= 0 to 45 do
begin
li := TListViewitem.Create(Listview1);
ListView1.items.AddItem(li);
nombre := 'archivo ' + inttostr(i);
li.caption := nombre;
lista.AddObject(nombre, li);
end;

// para encontrar el archivo 32
if lista.indexof('archivo 32')<> -1 then
ShowMessage('found');
end;

alquimista
26-03-2009, 23:30:56
Aunque conteste tarde....

Muchas gracias.... Me habeis aclarado mucho (no conocia la propiedad commatext).

La verdad es que he aprendido cosas nuevas..
Un saludo