Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Verzeichnis im Listview darstellen

  Alt 17. Jan 2005, 19:51
HI ,

ist doch eigendlich ganz einfach, mit FindFirst und FindNext.
Damit füllst Du 2 Listen eine für die Dateien und die andere List mit
den Verzeichnissen. Dann die Listen sortieren und das Listview füllen

Habe in alten Sachen was dazu gefunden:
Delphi-Quellcode:
type
  PSRec = ^TSRec;
  TSrec = record
     Attr : Array[0..4] of Char;
     Name : String;
     Size : String;
     Time : TDateTime;
  end;

var
  SearchRec : pSRec;
  FChangeDir : String;

  function Compare(Item1, Item2: Pointer): Integer;
  begin
    Result := CompareText(PSRec(Item1).Name, PSRec(Item2).Name);
  end;


  procedure CalcAttributes(FindData : TSearchRec; var Attributes : Array of Char);
  begin
    FillChar(Attributes, SizeOf(Attributes), ' ');
    if (FindData.Attr and faARCHIVE) = faARCHIVE then Attributes[0] := 'A';
    if (FindData.Attr and faREADONLY) = faREADONLY then Attributes[1] := 'R';
    if (FindData.Attr and faHIDDEN) = faHIDDEN then Attributes[2] := 'H';
    if (FindData.Attr and faSYSFILE) = faSYSFILE then Attributes[3] := 'S';
    if (FindData.Attr and faDIRECTORY) = faDIRECTORY then Attributes[4] := 'D';
  end;

  procedure FindFolders(var FolderList : TList; var NonFolderList : TList);
  var
     SRec : TSearchRec;
  begin
    if FindFirst('*.*', faAnyFile, SRec) = 0 then
    begin
      repeat
        if (SRec.Name <> '.') and (SRec.Name <> '..') then
        begin
          SearchRec := New(pSRec);
          with SearchRec^ do
          begin
            Name := SRec.Name;
            Time := FileDateToDateTime(SRec.Time);
            Size := CalcFileSize(SRec);
          end;
          CalcAttributes(SRec, SearchRec^.Attr);
          if (SRec.Attr and faDirectory) = faDirectory then FolderList.Add(SearchRec)
                                                       else NonFolderList.Add(SearchRec);
        end;
      until FindNext(SRec) <> 0;
      FindClose(SRec);
    end;
    FolderList.Sort(Compare);
    NonFolderList.Sort(Compare);
  end;
CalcFileSize(SRec) macht nichts weiter als bei (SRec.Attr and faDirectory) = faDirectory
die Größenbezeichnung = "Verzeichnis" zurück zu geben.
Da FindFirst('*.*' ohne Path aufgerufen wird, muss Du Dich selber darum kümmern, vieleicht so:

Delphi-Quellcode:
...
var
   FolderList : TList;
   NonFolderList : TList;
   FCurrDir : String;
begin
  if FChangeDir[Length(FChangeDir)] <> '\then FChangeDir := FChangeDir + '\';
  if DirectoryExists(FChangeDir) then
  begin
    GetDir(0, FCurrDir);
    ChDir(FChangeDir);
    lvFolders.Items.BeginUpdate;
    lvFolders.Items.Clear;
    FolderList := TList.Create;
    try
      NonFolderList := TList.Create;
      try
        FindFolders(FolderList, NonFolderList);
        InsertItems(FolderList);
        InsertItems(NonFolderList);
      finally
        NonFolderList.Free;
      end;
    finally
      FolderList.Free;
    end;
    lvFolders.Items.EndUpdate;
    ChDir(FCurrDir);
  end;
end;
Wenn Du alles richtig verstanden und umgesetzt hast kann es so aussehen:
Miniaturansicht angehängter Grafiken
lv_200.jpg  
  Mit Zitat antworten Zitat