Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TreeView und ListView (https://www.delphipraxis.net/99376-treeview-und-listview.html)

Malte Koch 12. Sep 2007 15:29

Re: TreeView und ListView
 
Liest die Ordner aus:

Delphi-Quellcode:
procedure TForm2.HoleVerzeichnisse(const Pfad: String; var Tree: TTreeView;
                                  Start: TTreeNode);
var
 SR: TSearchRec;
  begin
    if FindFirst(Pfad + '\*.*', faAnyFile, SR) = 0 then
  repeat
    Application.ProcessMessages;
    if (SR.Attr AND faDirectory = faDirectory) AND (SR.Name[1] <> '.')
        AND (SR.Name[1] <> '_') then
    begin
      baum := Tree.Items.Addchild(Start, SR.Name);
      baum.SelectedIndex := 1;
      baum.ImageIndex := 1;
      baum.StateIndex := -1;
      HoleVerzeichnisse(Pfad+'\'+ SR.Name, Tree, baum);
    end;
  until (FindNext(SR) <> 0);
 SysUtils.FindClose(SR);
end;
Zeigt die entsprechenden Dateien an:

Delphi-Quellcode:
procedure TForm2.HoleDateien(const Pfad: String; ListV: TListView; Filter: String);
var
 SR: TSearchRec;
 anItem:TListItem;
   begin
    if FindFirst(Pfad + '\' + Filter, faAnyFile, SR) = 0 then
  repeat
    Application.ProcessMessages;
    if (SR.Attr AND faDirectory <> 16) AND (SR.Name[1] <> '.')
        AND (SR.Name[1] <> '_') then
    begin
            anItem:=ListV.Items.Add;
            anItem.Caption:=SR.Name;

            anItem.SubItems.Add( IntToStr(GetFileSizeEx(Pfad+'\'+SR.Name)div 1024));
            anItem.SubItems.Add( GetFileTypename(Pfad+'\'+SR.Name));
            anItem.SubItems.Add( DateToStr(GetFileLastAccessTime(Pfad+'\'+SR.name)));
            anItem.SubItems.Add( DateToStr(GetCreationTimeOfFile(Pfad+'\'+SR.Name)));
      end;
  until (FindNext(SR) <> 0);
  SysUtils.FindClose(SR);
end;

Mackhack 12. Sep 2007 21:06

Re: TreeView und ListView
 
Hm,

du musst auch noch auf

Delphi-Quellcode:
(  SR.Name[1] <> '..')
ueberpruefen!

Und was soll das sein?

Delphi-Quellcode:
  (SR.Name[1] <> '_')
Du weist schon dass du das ganze einfacher in einer einzigen Funktion mit Rekursion schreiben kannst?

Malte Koch 12. Sep 2007 21:57

Re: TreeView und ListView
 
Das
Delphi-Quellcode:
(SR.Name[1] <> '_')
habe ich gemacht, weil der mir sonst auch _history Ordner anzeigt was ich aber nich haben möchte.

Und
Delphi-Quellcode:
(SR.Name[1] <> '..')
hab ich nicht gemacht da ich es ja schon mit einem Punkt habe. Wenn das erste Zeichen ungleich '.' ist schliesst es '..' ja logischerweise auch aus, da dies ja schon 2 Zeichen sind.

Wie kann ich das denn in einer Funktion machen? Ich habe Stunden lang rumprobiert und es nicht hinbekommen. Danach habe ich mich dann für 2 Funktionen entschieden. Für eine Lösung in einer Funktion wäre ich sehr dankbar. Vorallem das mit der Rekursion wäre interessant, da ich somit dann auch Dateien aus SubOrdnern auslesen könnte.

Matze 12. Sep 2007 22:08

Re: TreeView und ListView
 
Siehe dir doch den Link in meinen ersten Beitrag (Beitrag #2) an. Da sind rekursive Funktionen zu finden, die du wenn, dann nur leicht anpassen musst.

Mackhack 12. Sep 2007 22:13

Re: TreeView und ListView
 
Entweder hast du meinen Beitrag #16 total ignoriert oder ich sehe net wo das Problem liegt :?: Du musst einfach wenn es im Result um einen Ordner handelt in diesen Ordner reingehen und dort weitersuchen bis es keine weiteren Unterordner mehr gibt.

Hab dir hier mal ein kleines Beispiel was du mit etwas anpassen verwenden kannst (hab ich aus einem aktuellen Projekt rauskopiert) oder aber auch einfach umschreiben kannst um Delphi's TSearchRec zu nutzen!

Delphi-Quellcode:
procedure SearchFiles(aRoot: String; var Files : TStringList; Mask: String = '*.*'; Recursive : Boolean = False);
var
  wfd : TWin32FindData;
  hFile : THandle;
begin
  aRoot := IncludeTrailingPathDelimiter(aRoot);
  if Recursive then
  begin
    hFile := FindFirstFile(PChar(aRoot + Mask), wfd);
    if ( hFile <> INVALID_HANDLE_VALUE ) then
    try
      repeat
        if ( wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY ) then
        begin
          if ( (String(wfd.cFileName) <> '.') and (String(wfd.cFileName) <> '..') ) then
          begin
            SearchFiles(aRoot + wfd.cFileName, Files, Mask, Recursive);  // hier wird die Rekursion angewandt
          end;
        end;
      until FindNextFile(hFile, wfd) = False;
    finally
      Windows.FindClose(hFile);
    end;
  end;
  hFile := FindFirstFile(PChar(aRoot + Mask), wfd);
  if ( hFile <> INVALID_HANDLE_VALUE ) then
  try
    repeat
      if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> FILE_ATTRIBUTE_DIRECTORY ) then
      begin
        Files.Add(wfd.cFileName);
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
end;

Malte Koch 12. Sep 2007 22:24

Re: TreeView und ListView
 
Tut mir ja leid das ich das alles noch nicht sofort verstehe aber ich arbeite noch nicht so lange mit delphi.

Ich werde das morgen dann mal ausprobieren und meinen Erfolg hier posten!

Christian Seehase 12. Sep 2007 22:32

Re: TreeView und ListView
 
Moin Malte,

Zitat:

Zitat von Malte Koch
Und
Delphi-Quellcode:
(SR.Name[1] <> '..')
hab ich nicht gemacht da ich es ja schon mit einem Punkt habe. Wenn das erste Zeichen ungleich '.' ist schliesst es '..' ja logischerweise auch aus, da dies ja schon 2 Zeichen sind.

Ich denke Mackhack wollte darauf hinweisen, dass Du explizit auf

Delphi-Quellcode:
(SR.Name <> '.') and (SR.Name <> '..')
prüfen musst.

Eine Prüfung auf SR.Name[1] <> '.' ist schlichtweg falsch, da ein Datei-/Ordername durchaus mit einem Punkt beginnen kann.
Nur weil man das im Explorer nicht so eingeben kann heisst noch lange nicht, dass es nicht geht, bzw. nicht erlaubt ist ;-)

(ich weiss, dass man das oft so sieht, aber dadurch wird es nicht richtiger ;-))

Mackhack 12. Sep 2007 22:59

Re: TreeView und ListView
 
Zitat:

Zitat von Malte Koch
Tut mir ja leid das ich das alles noch nicht sofort verstehe aber ich arbeite noch nicht so lange mit delphi.

Ich werde das morgen dann mal ausprobieren und meinen Erfolg hier posten!

Ich glaube kaum dass du dich hier entschuldigen musst. Kein Meister ist vom Himmel gefallen und jeder hat mal klein angefangen. Ich wollte das auch nicht als erhobenen Zeigefinger darstellen sondern nur drauf hinweisen dass du die Hilfen die du hier bekommst nicht uebersehen oder ignorieren sollst. Mehr net.

Und klar sag ruhig wenn es geklappt hat oder ob du noch mehr Hilfe brauchst, dazu ist ja das Forum da!

Malte Koch 13. Sep 2007 08:28

Re: TreeView und ListView
 
Entweder bin ich zu doof um die Funktion umzubauen oder die tut einfach nicht das was ich möchte.

Jetzt zeigt er mir im TreeView nichts mehr an und im ListView zeigt er mir ALLES an.

also Ordner + unterordner + dateiname

und dabei listet er die Ordner und Unterordner auch einzeln auf.

z.B.: C:\
C:\Test
C:\Test\test.txt

Hat jemand ne Lösung?

Hier meine umgebaute Funktion:
Delphi-Quellcode:
procedure TForm2.FindAllFiles(FileList: TListView;
                              RootFolder: string;
                              Mask: string ='*';
                              Recurse: Boolean = True;
                              AddFolderNames: Boolean = False;
                              IgnoreMaskAtFolderNames: Boolean = True);
  procedure LFindAllFiles(AParentFolder: String);
  var LSearchRec: TSearchRec;
  begin
    if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then
    begin
      repeat
        if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then
        begin
          if LSearchRec.Attr and faDirectory = faDirectory then
          begin
            if AddFolderNames and
               (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(LSearchRec.Name), Mask)) then
              FileList.AddItem(AParentFolder + LSearchRec.Name, TObject(True));
            if Recurse then
              LFindAllFiles(AParentFolder + LSearchRec.Name + '\');
          end
          else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then
            FileList.AddItem(AParentFolder + LSearchRec.Name, TObject(False));
        end;
      until FindNext(LSearchRec) <> 0;
      FindClose(LSearchRec);
    end;
  end;
begin
  Mask := AnsiLowerCase(Mask);
  LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder));
end;
Ich vermute einfach mal das
Delphi-Quellcode:
FileList.AddItem(AParentFolder + LSearchRec.Name, TObject(True));
auf keinen Fall so richtig ist. Aber wie komm ich an
Delphi-Quellcode:
AddObject
???

Malte Koch 13. Sep 2007 15:30

Re: TreeView und ListView
 
Hab es endlich richtig hinbekommen. Danke für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Seite 3 von 4     123 4      

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