Vamos a ver:
andres1569 indica un punto crucial: ver las imágenes aleatoriamente y no secuencialmente.
marcguillot sugiere optimizar la visualización cargando imágenes por adelantado.
Ambos puntos son buenos pero algo incompatibles pues si seguimos la idea de
andres1569 será difícil saber cuáles imágenes serán las próximas a cargar y si seguimos la idea de
marcguillot será difícil dejar el acceso secuencial.
Sin embargo, ¿por qué no dejar que
Windows se encargue de cuándo cargar las imágenes y aún así permitir un acceso aleatorio?
La propuesta que hago es usar un ListView en modo virtual
Código:
OwnerData := true;
En modo virtual nosotros especificamos cuántos items hay
Código:
ListView.Items.Count := 1000000; // ¡Incluso más si lo desean!
pero no se los damos de un sólo golpe sino que usamos el evento OnData del ListView. Este evento nos da un Item "falso" con sólo una propiedad asignada: el índice del item que debe mostrarse en ese momento. Nosotros llenamos el resto:
Código:
Item.Caption := Lista[Item.Index];
donde Lista podría ser un StringList que llenamos al principio del programa con los
nombres de los archivos.
Ahora bien, ¿de dónde y cuándo sacamos la imágen de cada ítem?
Llenar un ImageList con todas las imágenes es desde luego impensable ya que justamente deseamos evitar cargar todas las imágenes al mismo tiempo.
Pero podemos usar el evento OnCustomDrawItem del ListView para cargar la imágen y dibujarla:
Código:
var
Rect: TRect;
Bmp: TBitmap;
X, Y: Integer;
begin
// Cargar la imagen
Bmp := TBitmap.Create;
Bmp.LoadFromFile('ruta al archivo' + Item.Caption);
// Obtener el rectángulo que ocupa el icono del item
ListView_GetItemRect(ListView.Handle, Item.Index, Rect, LVIR_ICON);
// Para centrar la imagen en el área del icono
X := Rect.Left + ((Rect.Right - Rect.Left) - Bmp.Width) div 2;
Y := Rect.Top + ((Rect.Bottom - Rect.Top) - Bmp.Height) div 2;
ListView.Canvas.Draw(L, T, Bmp);
Bmp.Free;
El área de los iconos deberá ser lo suficietemente grande para que quepa la imagen. Como las imágenes son "thumbnails" supongo que serán del mismo tamaño, digamos de 160x160.
Entonces sólo hay que asignar al ListView un ImageList con sus propiedades Width y Height en 160.
El ImageList no lo llenamos, es sólo para que el área de los iconos sea adecuada.
No lo he probado a consciencia más que nada porque en estos momentos no dispongode 1000 imágenes

.
Lo que hice fue usar una sóla imagen cargando la lista de nombres de archivos con el mismo nombre de manera que realmente se está cargando cada vez la imágen.
Lo probé con 100,000 items y funciona bien.
La prueba final será con las 1000 mágenes distintas pero creo que vale la pena intentarlo.
// Saludos