Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-10-2004
Playwithfire Playwithfire is offline
Miembro
 
Registrado: May 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 13-10-2004
luisdevis luisdevis is offline
Miembro
 
Registrado: Mar 2004
Posts: 32
Poder: 0
luisdevis Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 13-10-2004
Playwithfire Playwithfire is offline
Miembro
 
Registrado: May 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 13-10-2004
Playwithfire Playwithfire is offline
Miembro
 
Registrado: May 2004
Posts: 20
Poder: 0
Playwithfire Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 14-10-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 22
Lepe Va por buen camino
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

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

Última edición por Lepe fecha: 14-10-2004 a las 15:17:26.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:44:12.


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