Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Virtual Listview e iconos virtuales. Muy interesante pero... (https://www.clubdelphi.com/foros/showthread.php?t=15193)

Playwithfire 13-10-2004 21:25:27

Virtual Listview e iconos virtuales. Muy interesante pero...
 
Hola, llevo meses con un proyecto donde quiero visualizar listas en un listview de mas de 5000 líneas, logicamente la mejor forma era un listview virtual es decir a medida que se piden los datos los va añadiendo hay un ejemplo en las demos de delphi.
Sin embargo tambien me interesaba cargar iconos de forma virtual unos 5000 y cargarlos en memoria era una burrada y por casualidad averigue que se podia asi en Oncustomdrawitem:

item.ListView.Canvas.Draw(item.Left,item.top,icono); //En vsreport

Tuve que añadir un imagelist que nunca usaria a ese listview para que me dejase un espacio a la izquierda vacio para meter ese icono.
Mi problema vino al añadir el XPmanifest donde la carga de estos iconos se hizo hasta 10 veces mas lenta y mi pregunta es por casualidad alguien sabe como cargar iconos virtualmente mediante otro metodo?

Agradeceria mucho cualquier sugerencia. gracias

luisdevis 13-10-2004 22:11:49

Prueba con tStringList
 
Si sólo vas a cargar iconos yo suelo emplear un tStringGrid.
En cada celda pongo sólo la ubicación del archivo .ICO y manejo el evento onDrawCell.

Es muy simple y no usas tanta memoria. Sólo la parte de iconos que estas viendo.

Var i : tIcon
Begin
with StringGrid1,canvas do Begin
//-- Limpiamos el contenido visual de la celda
fillrect(rect)

//-- creamos el ICONO y lo asignamos
i := tIcon.create;
i.loadfromfile(StringGrid1.cells[Acol,Arow]);

//-- Lo mostramos en la celda;
draw(rect.left,rect.top,i);

//-- Finalmente eliminamos de memoria el icono
i.free;
end
End

Playwithfire 13-10-2004 23:34:35

Gracias Luis pero no es lo que busco
 
El componente ha de ser Listview busco listas vsreport vsicon....
Si alguien conoce mame32 es exactamente lo que busco hacer en mi listview, con un icono determinado en cada linea.

Pero muchas gracias por contestar.

Playwithfire 13-10-2004 23:54:21

Creo q es posible, pero no entiendo como lo hacen.
 
He seguido repasando la Demo de delphi de virtual listview y mi sorpresa es que no usa ningun imagelist para esto, entonces como crea esos iconos?
Seguro que alguien esta mas puesto que yo y lo sabe, me haria un gran favor en aclararmelo, gracias

Lepe 14-10-2004 15:06:28

Lo que quieres es trabajo para el VirtualStringTree

lo he usado y es extremadamente rápido con millones de nodos, es un Treeview, pero hace las veces de ListView y Grid.

En cuanto a tu pregunta, en esta linea de código, saca el imageIndex que ha de usar para pintarlo, lo hace a partir del FullID definido en el tipo de dato TShellItem. No lo he mirado con lupa, pero me parece logico que al indicar un imageIndex en el Item que se anade (de tipo TShellItem) automaticamente coja la imagen.
Código Delphi [-]
// linea de código 501
      ImageIndex := GetShellImage(FullID, ListView.ViewStyle = vsIcon, False);
Me ha picado la curiosidad y he hecho esto
Código:

   
    // linea de codigo 573
    Item.Caption := DisplayName;
    Item.ImageIndex := -1; //ImageIndex;

...Y ohh!! sorpresa, ya no aparecen los iconos en el ListView.

Como ves los tipos de datos del Shell son muy intuitivos y simples :p

En contrapartida a esta tecnica, podrías usar la función:
Código Delphi [-]
var icono :Ticon;
    lpicono:Word;
begin               
lpicono := 1; // el primer icono que haya, si es un ejecutable o dll puede tener muchos.
icono.Handle:=ExtractAssociatedIcon(handle,pchar('c:\autoexec.bat'),lpicono);
Que te devuelve un icono y puedes anadirlo a un ImageList.

saludos


La franja horaria es GMT +2. Ahora son las 22:01:27.

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