Einzelnen Beitrag anzeigen

BlueDiamond

Registriert seit: 15. Nov 2003
Ort: Trier
17 Beiträge
 
Delphi 2005 Personal
 
#1

Verzeichnis in ListView darstellen

  Alt 4. Nov 2004, 14:43
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
  Mit Zitat antworten Zitat