Hallo zusammen!
Nachdem ich die vorhandene ShellListView aus verschiedenen Gründen nicht mehr einsetze, habe ich mir ein eigenes zusammengestrickt. Dieses funktioniert auch soweit ohne die Probleme des
VCL-Trümmers. Leider kann ich aber nicht behaupten, dass das Einlesen von größeren Verzeichnissen zeitlich vergleichbar mit dem ShellListView ist.
Also: Wo kann man Zeit gutmachen?
Für jeden Vorschlag bin ich sehr dankbar!
Hier der Code zum Einlesen:
Delphi-Quellcode:
procedure TformMain.SysListViewRefresh;
var
dirgroesse:int64;
sr : TSearchRec;
a : integer;
li : TListItem;
fi : TSHFileInfo;
begin
SysListView.Cursor:=crHourGlass;
// init
dirgroesse:=0;
// SysListView füllen
SysListView.Items.BeginUpdate;
SysListView.Items.Clear;
a := FindFirst(includetrailingbackslash(shellcombobox.path)+ '*.*', faAnyFile,sr);
while(a = 0) do
begin
// Application.ProcessMessages;
if
(sr.Name <> '.') and
(sr.Name <> '..') and
(sr.Attr <> faSysFile) and
(sr.Attr <> faSymLink) and
// systemordner filtern
(sr.Attr <> 22 ) and
// Recent
(sr.Attr <> 19 ) and
// Favoriten
(sr.Attr <> 17 )
then
begin
// Dateiinfo ermitteln
ZeroMemory(@fi,sizeof(fi));
SHGetFileInfo(pchar(includetrailingbackslash(shellcombobox.path) + sr.Name),0,fi,sizeof(fi),
SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
// Neuen Eintrag in die Liste
li := SysListview.Items.Add;
// Name der Datei eintragen
li.Caption := sr.Name;
// Falls Ordner dann checked = true
li.Checked:=sr.Attr=16;
// Icon ermitteln
li.ImageIndex:=fi.iIcon;
// Größe eintragen falls kein Verzeichnis
if sr.Attr<>16 then li.SubItems.Add(BytesToStr(sr.Size))
else li.SubItems.Add('');
// Addieren der Ordner Total Groesse
dirgroesse:=dirgroesse+sr.Size;
li.SubItems.Add(fi.szTypeName);
li.SubItems.Add(DateTimeToStr(FileDateToDateTime(sr.Time)));
end;
a := FindNext(sr);
end;
FindClose(sr);
SysListView.Items.EndUpdate;
// Größe und freier Speicher berechnen
panelLocalDiskInfo.Caption:='Total: '+BytesToStr(dirgroesse)+' Frei: '+BytesToStr(DiskFree(Ord(shellcombobox.path[1]) - 64));
////////////////////////////////////////////////////
SysListView.Cursor:=crDefault;
end;
BlueD