FindNext,ShellIcons+system32=Flaki z olejem

0

Witam znowu,
chcialem oprogramowac sobie ListView zeby dziala w stylu ShellListView tylko troche biednej :) - NO COMMENTS - wiec robie nastepujaca rzecz:

procedure TForm1.Geticon(sciezka:string);
var Ico : PShFileInfo;
begin
GetMem(Ico, sizeof(TShFileInfo) );
 try
 ImageList1.Handle := shGetFileInfo(PChar(sciezka), 0, Ico^, sizeof(TShFileInfo), shgfi_sysiconindex or shgfi_icon or shgfi_smallicon);
 ListView1.Items.Add.ImageIndex := Ico.iIcon;
 finally
  FreeMem(ico);
 end;
end;

procedure TForm1.Szukaj;
var SearchRec:TSearchRec;
    Dir: TSHFileInfo;
begin
ListView1.Clear;
If FindFirst(sciezka+'*.*',faAnyFile,SearchRec)= 0 then
 begin
 Repeat
 If ((SearchRec.Attr and faDirectory)=16) and (SearchRec.Name <> '.') then
  begin
  GetIcon(sciezka+SearchRec.name);
  end;
 If (SearchRec.Attr <> faDirectory)then
   begin
   Application.ProcessMessages;
   GetIcon(sciezka+SearchRec.name);
   Edit2.Text := IntTOStr(ListView1.Items.Count);
   end;
 Edit3.Text := IntTOStr(ImageList1.Count);
 Until FindNext(SearchRec) <>0;
 end;

wszystko ladnie dziala ALE jesli za sciezke przyjmiemy np. system32 w ktorym jest ok 2180 plikow to program zaczyna MIELIC ze procesor sie pali :-/ - no moze bez przesady.
Czy moze da sie to zrobic szybciej? tzn. zmniejszyc czas zwloki na wyswietlenie ikon ??
P.S. Odpowiedzi typu: ShellListView jest lepszyto po co sie meczysz - odpadaja ;-) z konkursu

0

Pomysł 1:
Może niech najpierw wyświetli wszystkie pliki, z jakąś domyślną ikonką (albo bez ikonki), a później w wątku niech je doczytuje...
Pomysł 2:
Niech zapamiętuje w jakiejś tablicy ikony dla danego rozszerzenia, wtedy nie będzie musiał dla każdego pliku osobno za każdym razem jej szukać...

ps: powodzenia:]

0

Masz systemową liste icon wystarczy przyporządkować ją do ListView i operować na numerach ikon.

Zajrzyj do SDK.

Shell_GetCachedImageIndex
Retrieves the cache index of a cached icon.

Shell_GetImageLists
Retrieves system image lists for large and small icons.

0

Pomysł 2:
Niech zapamiętuje w jakiejś tablicy ikony dla danego rozszerzenia, wtedy nie będzie musiał dla każdego pliku osobno za każdym razem jej szukać...

No drugi pomysl mi sie podoba :) dzieki...
A czy moglby mi ktos powiedziec tak na marginesie dlaczego ShellListView tak szybko dziala chociaz do doczytywania ikonek jest ta sama funckja - chyba nie ma tam takich glupot jak findfirst i findnext ;-)

O szymek dzieki za podpowiedz, nawet nie widzialem jak sie dopisywales :-D ty moj guru

0

Shell_GetCachedImageIndex
Retrieves the cache index of a cached icon.

Shell_GetImageLists
Retrieves system image lists for large and small icons.

Za chiny ludowe nie umiem tego zaimplementowac (co chwile wyskakuja jakies byki [wstyd] ) moze jakis kawalek zrodelka [???]

Sory ze nie dopisalem do wczesniejszego posta ale to tak z rozpedu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1