![]() |
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 ![]()
Delphi-Quellcode:
Aufgerufen wird die Funktion dann wie folgt:
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;
Delphi-Quellcode:
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.
TreeView1.Items.BeginUpdate;
GetDirs('f:\', TreeView1, nil); TreeView1.AlphaSort; TreeView1.Items.EndUpdate; Kann mir da jemand auf die Sprünge helfen? |
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.
|
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: |
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 :|
|
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Zitat:
|
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: |
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Würde dir empfehlen
![]() Dort gibt es auch ein Implementationen von ShellTreeViews (und -ListViews) TVirtualTreeView wird mittlerweile auch von Borland selber verwendet. |
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Zitat:
|
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Zitat:
|
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Zitat:
|
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Die Komponenten befinden sich auf dem Seitenreiter "Beispiele".
|
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
|
Re: Alle Verzeichnisse in TTreeView - schnellere Lösung?
Zitat:
Du kannst Dir doch aus den bereits vorhandenen Knoten den Pfad zusammenbasteln:
Delphi-Quellcode:
Dabei ist natürlich wichtig, dass der gesamte Pfad inkl. Laufwerksbuchstabe im TreeView steht:
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;
Delphi-Quellcode:
PS: ADirectory, Start und Tree sind imho nicht wirklich "kryptische"Bezeichner ;)
procedure TForm1.Button1Click(Sender: TObject);
begin { Scan C:\ and create first node "C:\" in TreeView } GetDirs('C:\',TreeView1,TreeView1.Items.Add(NIL,'C:\')); end; Gruß Stephan :dance: |
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 ^^ |
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:
und schon steht der TreeView auf das in CTmp angegebene Verzeichnis :-D stvDir.RootFolder := rfDesktop; cTmp := oIni.ReadString('Options','StartDir',''); if cTmp <> '' then begin stvDir.BrowseTo(cTmp,True,True,True,false); end; 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