Verzeichnis auslesen mit Icons
-
Hi Community,
Ich habe mir eine Funktion geschrieben die ein Verzeichnis mit zugehörigen Icons ausliest und in eine ListView-Komponente einträgt.
Es funktioniert soweit alles sehr gut (auch wenn es weder schön , noch Komplett ist, wie man an den Kommentaren erkennen kann).
Aber leider dauert es ziemlich lange bis alles fertig ist und deshalb wollte ich fragen warum bzw. wie kann ich das ändern?void __fastcall TListe::SearchFilesList(String dir) { Form5->ListView1->Items->Clear(); WIN32_FIND_DATA filedata; HANDLE filehandle; int pos,i=0; String typ; LPWORD nummer; TIcon *MyIcon = new TIcon(); Form5->ListIcons->Clear(); filehandle = FindFirstFile((dir+"\\*.*" ).c_str(), &filedata); bool found = (filehandle != INVALID_HANDLE_VALUE); while (found == true) { String file=filedata.cFileName; if (((filedata.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0) && (file != ".") && (file != "..")){ TListItem *Subfolder = Form5->ListView1->Items->Add(); //Dateiname Subfolder->Caption=file; //Icon String lol=dir+"\\"+file; lol=ReplaceStr(lol,"\\\\","\\");// Pfad ist mit doppeltem backslash MyIcon->Handle=ExtractAssociatedIcon(Form5->Handle,lol.c_str(),nummer); if(MyIcon->Handle!=NULL) { Form5->ListIcons->AddIcon(MyIcon); } Subfolder->ImageIndex=i; i++; //FileTime Subfolder->SubItems->Add(""); if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ==0){ //Typ pos=LastDelimiter(".",filedata.cFileName); typ=String(filedata.cFileName); typ=typ.Delete(1,pos); if(typ=="Ink"){ Subfolder->SubItems->Add("Verknüpfung"); }else{ Subfolder->SubItems->Add(typ+"-Datei"); } }else{ Subfolder->SubItems->Add("Verzeichnis"); } if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0){ //Größe hierher } } else { } found = FindNextFile(filehandle, &filedata); } FindClose(filehandle); DestroyIcon(MyIcon); }Danke schonmal
XBert
-
Hi XBert,
jede gefundene Datei wird innerhalb deiner while-Schleife ins ListView eingetragen. Durch diese graphische Aufgabe wird die Funktion SearchFilesList(String dir) erheblich ausgebremst.
Vorschlag :
Schreibe innerhalb der while nicht ins ListView sondern in den Speicher (evtl. ein StringList) und am Ende der Funktion im Stück in das ListView (da die Icons ja wohl auch in einer ImageList liegen, bietet sich das an).Etwas späte Antwort auf deine Frage, und auch nur eine Anregung.
Tschö kpeter

-
Man kann auch Zeit einsparen in dem man das neu Zeichnen der ListView verhindert das ja auch beim hinzufügen entsteht, mittels:
SendMessage(lv->Handle, WM_SETREDRAW, FALSE, 0);bzw. wieder aktivieren nach dem man die Items hinzugefügt hat
SendMessage(lv->Handle, WM_SETREDRAW, TRUE, 0);