Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verzeichnis im Listview darstellen (https://www.delphipraxis.net/38326-verzeichnis-im-listview-darstellen.html)

ehem. Benutzer 17. Jan 2005 18:04


Verzeichnis im Listview darstellen
 
Guten Abend,
ich habe bereits in der Delphi Hilfe und im Delphi Forum gesucht,
aber nichts genaues dazu gefunden.
Meine Frage: Wie kann ich ein Verzeichnis auf der Festplatte, welches man durch eine
TShellComboBox wählt, in einem ListView darstellen?

Die Lösung ist sicherlich sehr einfach, nur komm ich leider nicht drauf :wall:



MfG

Alter Mann 17. Jan 2005 18:51

Re: Verzeichnis im Listview darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 :wink:

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:

Alexander 18. Jan 2005 09:02

Re: Verzeichnis im Listview darstellen
 
Du kannst natürlich auch einfach die TShellListView nehmen und die ggf. erweitern. Bei der TShellComboBox gibt es das Property Listview o.ä., was du einfach mit der TShellListview verbinden kannst....
Dann brauchst du dich gar nicht darum kümmern.

ehem. Benutzer 25. Jan 2005 15:18

Re: Verzeichnis im Listview darstellen
 
Vielen Dank es geht,
nun muss ich nur noch rausfinden wie ich ein ShellListView mit IdFTP verbinde.



MfG

Luckie 25. Jan 2005 15:22

Re: Verzeichnis im Listview darstellen
 
Gar nicht. Der ShellListview arbeitet intern mit den API-Funktionen FindFirstFile und FindNextFile. Nur leider haben die mit dem FTP Protokoll rein gar nichts am Hut. Da wirst du wohl die List Methode deiner FT-Komponenten bemühen müssen, um per FTP ein Verzeichnis aufgelistet zu bekommen.

ehem. Benutzer 25. Jan 2005 15:25

Re: Verzeichnis im Listview darstellen
 
Ok, danke.
Werde dann eine "normale" ListView nehmen.



MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz