CCRDude / tlistview-icon-cache-demo

Demonstrating a threaded icon loading for TListView

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

These files demonstrate how to read and cache icon indizes for a TListView in the background.

TODO

  • Some kind of cleanup could be helpful for long term use.

Delphi Users

To use this in Delphi, unit fgl would need to be replaced with Generics.Collections (I simply prefer fgl).

TFileIconCache properties

ListView field

Set the ListView field to use standard handling of your list items. This works best with OnCreateItemClass using a descendant of TFileIconListItem.

This is also uses the imagelist assigned to the ListView, if none has been specified yet.

ImageList field

To use an image list independent of a TListView, you can use this property and implement the OnGetNext and OnReceiveIconIndex events.

OnGetNext event

If you use a custom TListItem class based on TFileIconListItem, you do not need to specify the OnGetNext event. If not, you need to use it to find the next unresolved list item, like for example:

var
   liFirst: TListItem;
   iFirst: integer;
begin
   AFilename := '';
   if lvFiles.Items.Count = 0 then begin
      Exit;
   end;
   liFirst := lvFiles.TopItem;
   if not Assigned(liFirst) then begin
      liFirst := lvFiles.Items[0];
   end;
   iFirst := liFirst.Index;
   while (iFirst < lvFiles.Items.Count) do begin
      if lvFiles.Items[iFirst].ImageIndex = IconCacheNoIconLoaded then begin
         AFilename := FPath + lvFiles.Items[iFirst].Caption;
         lvFiles.Items[iFirst].ImageIndex := IconCacheIconPending;
         Exit;
      end;
      Inc(iFirst);
   end;
end;

OnReceiveIconIndex event

If you use a custom TListItem class based on TFileIconListItem, you do not need to specify the OnReceiveIconIndex index. If not, you need to use it to find the list item to assign the image index, like for example:

var
   li: TListItem;
begin
   li := lvFiles.Items.FindCaption(0, ExtractFileName(AFilename), False, True, False);
   if not Assigned(li) then begin
      Exit;
   end;
   li.ImageIndex := AIconIndex;
end;

About

Demonstrating a threaded icon loading for TListView


Languages

Language:Pascal 100.0%