Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cual es la forma mas rapida de recorrer un ListView (https://www.clubdelphi.com/foros/showthread.php?t=64196)

alquimista 21-03-2009 12:20:20

Cual es la forma mas rapida de recorrer un ListView
 
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.

Código Delphi [-]
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.

Código Delphi [-]

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:
Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 16:53:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi