Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alle Verzeichnisse in TTreeView - schnellere Lösung? (https://www.delphipraxis.net/76931-alle-verzeichnisse-ttreeview-schnellere-loesung.html)

Sicho 12. Sep 2006 10:57


Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Hallo,

ich will in einem Programm alle Verzeichnisse eines Drives in einem TTreeView anzeigen lassen. Als ich im Internet nach einer Lösung gesucht habe (da ich noch nie vorher mit TTreeView gearbeitet habe), fand' ich folgenden, funktionierenden Code bei dsdt.info

Delphi-Quellcode:
procedure GetDirs(const ADirectory: string; var Tree: TTreeView; Start: TTreeNode);

  function SlashSep(const Path, S: string): string;
  begin
   if AnsiLastChar(Path)^ <> '\' then
     Result := Path + '\' + S   else
     Result := Path + S;
  end;

var SearchRec: TSearchRec;
   NewNode: TTreeNode;

begin
  if FindFirst(SlashSep(ADirectory, '*.*'), faAnyFile, SearchRec) = 0 then begin
    try
      repeat
        if ((SearchRec.Attr and faDirectory) <> 0) then begin
          if ((SearchRec.Name <> '.') and (SearchRec.Name <> '..')) then begin
            NewNode:=Tree.Items.AddChild(Start, SearchRec.Name);
            GetDirs(SlashSep(ADirectory, SearchRec.Name), Tree, NewNode);
          end;
        end;
      until FindNext(SearchRec) <> 0;
    finally
      SysUtils.FindClose(SearchRec);
    end;
  end;
end;
Aufgerufen wird die Funktion dann wie folgt:

Delphi-Quellcode:
TreeView1.Items.BeginUpdate;
  GetDirs('f:\', TreeView1, nil);
  TreeView1.AlphaSort;
  TreeView1.Items.EndUpdate;
An und für sich funktioniert das auch, nur ist es sehr sehr langsam. Deswegen suche ich nun einen Weg, das ganze zu beschleunigen, ohne jetzt aber unbedingt all zu viel umstellen zu müssen.

Kann mir da jemand auf die Sprünge helfen?

Luckie 12. Sep 2006 11:02

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Lies nur die Eintrage der obersten Ebene ein und erst wenn die Knoten erweitert werden, liest du die eventuell vorhandenen Unterknoten ein.

Steve 12. Sep 2006 11:08

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Hi,

ab Delphi 6 gibt's auch ne Komponente "TShellTreeView" unter "Beispiele". Setz dort "Root" auf Dein gewünschtes Laufwerk und fertig... Ob Du damit das machen kannst, was Du vorhast, also ob das ein passender Ersatz für die TTreeView-Variante ist, weiß ich natürlich nicht, aber u.U. hilfts Dir ja weiter :)

Gruß
Stephan :dance:

Sicho 12. Sep 2006 11:09

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Ich will ehrlich sein: ich werde aus dem Code nicht ganz besonders schlau (ist ja auch nicht kommentiert). Ich kann mir teilweise schon vorstellen wo was passiert, aber dennoch hapert es am Verständnis des mir vorliegenden Codes. Von daher weiß ich auch gar nicht wo und wie ich die von dir vorgeschlagene Änderung vornehmen sollte :|

Sicho 12. Sep 2006 11:55

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Zitat:

Zitat von Steve
Hi,

ab Delphi 6 gibt's auch ne Komponente "TShellTreeView" unter "Beispiele". Setz dort "Root" auf Dein gewünschtes Laufwerk und fertig... Ob Du damit das machen kannst, was Du vorhast, also ob das ein passender Ersatz für die TTreeView-Variante ist, weiß ich natürlich nicht, aber u.U. hilfts Dir ja weiter :)

Gruß
Stephan :dance:

Ich kann die leider nicht finden :shock:

Steve 12. Sep 2006 12:25

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Hm evtl. gibts die Komponente nach D7 oder so nicht mehr? :gruebel:

Zum Code:

GetDirs wird rekursiv aufgerufen (Zeile 20). Lass diesen Aufruf weg, und dann werden die jeweiligen Unterverzeichnisse nicht gesucht. Dafür ruf im entsprechenden Ereignis, wenn ein Eintrag im TreeView ausgewählt wird, die Routine GetDirs mit entsprechenden Parametern auf (natürlich nur beim ersten mal).

Gruß
Stephan :dance:

hsg 12. Sep 2006 12:27

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Würde dir empfehlen TVirtualTreeView von Mike Lischke zu verwenden.
Dort gibt es auch ein Implementationen von ShellTreeViews (und -ListViews)

TVirtualTreeView wird mittlerweile auch von Borland selber verwendet.

Sascha L 12. Sep 2006 12:29

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Zitat:

Zitat von Sicho

Ich kann die leider nicht finden :shock:

Musst man in den Unterordnern von Delphi schauen, da liegt irgendwo das Package, falls es nicht standardmäßig mit installiert wurde. Dann kannst du es manuell installieren.

Sicho 12. Sep 2006 14:05

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Zitat:

Zitat von Steve
GetDirs wird rekursiv aufgerufen (Zeile 20). Lass diesen Aufruf weg, und dann werden die jeweiligen Unterverzeichnisse nicht gesucht. Dafür ruf im entsprechenden Ereignis, wenn ein Eintrag im TreeView ausgewählt wird, die Routine GetDirs mit entsprechenden Parametern auf (natürlich nur beim ersten mal).

hm..das Problem ist dass ich die entsprechenden Parameter ja dann (beim Aufruf des Events des TTreeview On Click) nicht mehr zur Verfügung habe... bzw. ich mit diesen kryptischen Variablennamen des UrsprungsCodes nicht viel anfangen kann, da ich nicht weiß, was er meint =/

Sicho 12. Sep 2006 14:06

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Zitat:

Zitat von Sascha L
Zitat:

Zitat von Sicho

Ich kann die leider nicht finden :shock:

Musst man in den Unterordnern von Delphi schauen, da liegt irgendwo das Package, falls es nicht standardmäßig mit installiert wurde. Dann kannst du es manuell installieren.

auch das finde ich leider nicht. Wie ist der Name des Packages?

Luckie 12. Sep 2006 14:16

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Die Komponenten befinden sich auf dem Seitenreiter "Beispiele".

Sicho 12. Sep 2006 14:22

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Das wäre ja dann in meinem englischsprachigem Delphi "Samples" - aber da ist sie leider nicht zu finden

Steve 12. Sep 2006 14:51

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Zitat:

Zitat von Sicho
hm..das Problem ist dass ich die entsprechenden Parameter ja dann (beim Aufruf des Events des TTreeview On Click) nicht mehr zur Verfügung habe... bzw. ich mit diesen kryptischen Variablennamen des UrsprungsCodes nicht viel anfangen kann, da ich nicht weiß, was er meint =/

Doch, die hast Du :mrgreen:
Du kannst Dir doch aus den bereits vorhandenen Knoten den Pfad zusammenbasteln:
Delphi-Quellcode:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  txt : String;
  tn : TTreeNode;
begin
  { Add subitems only once }
  IF NOT Node.HasChildren THEN
  BEGIN
    txt := '';
    tn := Node;
    REPEAT
      { Get path }
      txt := tn.Text + '\' + txt;
      tn := tn.Parent;
    UNTIL (tn=NIL);
    GetDirs(txt,TreeView1,Node);
  END;
END;
Dabei ist natürlich wichtig, dass der gesamte Pfad inkl. Laufwerksbuchstabe im TreeView steht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  { Scan C:\ and create first node "C:\" in TreeView }
  GetDirs('C:\',TreeView1,TreeView1.Items.Add(NIL,'C:\'));
end;
PS: ADirectory, Start und Tree sind imho nicht wirklich "kryptische"Bezeichner ;)


Gruß
Stephan :dance:

Sicho 12. Sep 2006 15:06

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Danke jetzt klappt's um einiges besser :)

btw hatte mich auch an der vorgeschlagenen TVirtualTreeView versucht, aber da klappte irgendwie das nicht so wie ich es wollte ^^

hsg 13. Sep 2006 08:30

Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
 
Was hat bei TVirtualTreeView nicht funktioniert?

Hast du die Komponente TVirtualExplorerTreeView gefunden und benutzt? (wenn nicht: google mal danach)
der Rest ist dann easy:
Delphi-Quellcode:
 
stvDir.RootFolder := rfDesktop;
cTmp              := oIni.ReadString('Options','StartDir','');
if cTmp <> '' then begin
  stvDir.BrowseTo(cTmp,True,True,True,false);
end;
und schon steht der TreeView auf das in CTmp angegebene Verzeichnis :-D
Gruss
Jörg


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

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