![]() |
Verzeichnis in VirtualStringTree
Hallo,
versuche ein Verzeichnis mit SubDirs und Dateien in ein VirtualStringTree einzulesen aber es funkt einfach nicht. Könnte mir jemand mal einen Tip oder ein Beispiel geben?! |
Re: Verzeichnis in VirtualStringTree
hast du dir schon die demos angeschaut?
da wird das gezeigt. demos und vst hier: ![]() |
Re: Verzeichnis in VirtualStringTree
Hi colder,
vielleicht kannst du uns mal deinen Code zeigen, dann können wir dir sagen, wo du den Fehler gemachst hast :-) MfG, Manu :hi: |
Re: Verzeichnis in VirtualStringTree
hy
der Trick ist die Ordnerstruktur mit einer rekursiven funktion einzulesen. Mit dem folgenden Code kannst du ein verzeichnis rekursiv in ein memo einlesen. du musst nur mehr statt dem insert des memos einen knoten bzw kindelemente im vst erstellen.
Delphi-Quellcode:
procedure TForm1.GetDirsRek(RootDir: string);
var search: TSearchRec; ts: TStringList; begin ts := TStringList.Create; try if FindFirst(RootDir + '*.*', faDirectory, search) = 0 then begin repeat if ((search.Attr and faDirectory) = faDirectory) and (search.Name <> '.') and (search.Name <> '..') then begin Memo1.Lines.Add(RootDir + search.Name); //rootDir vorangestellt damit du auch weist in welchem Ordner der gefundene Ordner ist GetDirsRek(RootDir + search.Name + '\'); end; until FindNext(search) <> 0; FindClose(search); end; //ts.sort; //Memo1.Lines.AddStrings(ts); finally ts.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetDirsRek('Z:\DelphiPlattform\'); end; |
Re: Verzeichnis in VirtualStringTree
Hallo colder,
vielleicht hilft Dir ja auch ![]() Die VirtualShellTools basieren auf Mike Lischkes TreeView und stellen Komponenten zur Verfügung, mit denen man u.a. den Windows-Explorer "nachbauen" kann. Sie sind allerdings in der Anwendung ähnlich komplex wie TVirtualTreeView... |
Re: Verzeichnis in VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
erstmal danke für die Infos. Folgendes möchte ich eigentlich machen: Ich verwende VST um ein Project darzustellen. Diese Projecte bestehen aus unterschiedlichen Filetypes. Im Tree möchte ich die Dateien welche zum Project gehören in einem Folder darstellen. Weiter möchte ich Dokumente des Projects in einem weiteren Folder darstellen usw. Und am Schluss möchte ich alle Dateien und Ordner welche sich im ProjectFolder befinden wiederum in einem eigenen Folder innerhalb des Trees darstellen. das sollte so aussehen. Root(Projectname) - ProjectFiles - File1 - File2 - ProjectDocuments - Doc1 - Doc2 - ExternalFiles - File1 - File2 - ProjectFolder - Subfolders - File1 - File2 In den ProjectFolder sollen also recursiv alle Ordner und Files welche tatsächlich auf dem Filesystem sind. Das bekomme ich auch soweit hin. Allerdings ist der Teil unterhalb des Projectfolder so sortiert das z.B. folgende Strucktur herauskommt: - ProjectFolder - Datei1.txt (ist file) - Datei2.txt (ist file) - FilesFolder (ist Folder) - Gutgemacht.txt (ist file) eigentlich möchte ich schon eine Explorerstrucktur, also Ordner oben im Tree und die Files schön darunter.
Delphi-Quellcode:
Also hat irgend jemand eine Idee wie ich den Teil im ProjectFolder sortiert bekomme?
procedure TProjectTreeForm.LoadProjectInTree();
var ProjectData: TProjectData; NR, NI, NE, ND: PVirtualNode; FS: ^FileStatus; i: Integer; function AddNode(ANode: PVirtualNode; ARecord: TProjectData): PVirtualNode; var Data: PProjectData; begin Result := tvProject.AddChild(ANode); Data := tvProject.GetNodeData(Result); tvProject.ValidateNode(Result, False); Data^.Caption := ARecord.Caption; Data^.FullPath := ARecord.FullPath; Data^.OpenIndex := ARecord.OpenIndex; Data^.CloseIndex := ARecord.CloseIndex; Data^.ProjectFileTypes := ARecord.ProjectFileTypes; end; begin //Root ProjectData.Caption := EdProject.Info.Name; GetOpenAndClosedIcons(EdProject.ProjectPath, ProjectData.OpenIndex, ProjectData.CloseIndex); ProjectData.ProjectFileTypes := ftRoot; NR := AddNode(nil, ProjectData); //Internal Dateien ProjectData.Caption := 'Internal'; GetOpenAndClosedIcons(EdProject.ProjectPath, ProjectData.OpenIndex, ProjectData.CloseIndex); ProjectData.ProjectFileTypes := ftFolderInternal; NI := AddNode(NR, ProjectData); //External Dateien ProjectData.Caption := 'External'; GetOpenAndClosedIcons(EdProject.ProjectPath, ProjectData.OpenIndex, ProjectData.CloseIndex); ProjectData.ProjectFileTypes := ftFolderExternal; NE := AddNode(NR, ProjectData); //Dokument Dateien ProjectData.Caption := 'Documents'; GetOpenAndClosedIcons(EdProject.ProjectPath, ProjectData.OpenIndex, ProjectData.CloseIndex); ProjectData.ProjectFileTypes := ftFolderDocuments; ND := AddNode(NR, ProjectData); // Alle Files im ProjectDirectory ProjectData.Caption := 'Project Folder'; GetOpenAndClosedIcons(EdProject.ProjectPath, ProjectData.OpenIndex, ProjectData.CloseIndex); ProjectData.ProjectFileTypes := ftFolderProject; NF := AddNode(NR, ProjectData); // Soll recursiv das FileSystem in den Node "NF" laden LoadProjectDir(EdProject.ProjectPath, NF); .... // Hier wird die ProjectClass verarbeitet .... tvProject.EndUpdate; if ptExpand.Checked then tvProject.FullExpand(nil) else tvProject.FullCollapse(nil); end; procedure TProjectTreeForm.LoadProjectDir(sDir: string; Node: PVirtualNode); var SearchRec: TSearchRec; TempNode: PVirtualNode; PD: TProjectData; begin if sDir[length(sDir)] <> '\' then sDir := sDir + '\'; if FindFirst(sDir + '*.*', faDirectory, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then begin //Eintrag ist ein Verzeichnis if (SearchRec.Attr and faDirectory > 0) then begin //zum aktuellen Eintrag hinzufügen PD.Caption := SearchRec.Name; PD.FullPath := PathAppend(sDir, SearchRec.Name); PD.ProjectFileTypes := ftFolderProject; GetOpenAndClosedIcons(PD.FullPath, PD.OpenIndex, PD.CloseIndex); Node := AddProjectNode(Node, PD); end; //Eintrag merken TempNode := Node.Parent; //auf Untereinträge prüfen LoadProjectDir(sDir + SearchRec.Name, Node); //Eintrag wiederholen Node := TempNode; end else //Eintrag ist eine Datei if SearchRec.Name[1] <> '.' then begin PD.Caption := SearchRec.Name; PD.FullPath := PathAppend(sDir, SearchRec.Name); PD.ProjectFileTypes := ftFile; GetOpenAndClosedIcons(PD.FullPath, PD.OpenIndex, PD.CloseIndex); AddProjectNode(Node, PD); end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; end; Ach, wo jetzt so schön am Roman schreiben bin hätte ich noch eine weitere Frage. In meinem Project (IDE für eine Firmeneigene Scripting Sprache) möchte ich gerne überwachen bzw. ausgeben wenn im Code eine neue Function definiert wird, also die Function anzeigen wie z.B. im GExpert die Procedure List. Der feine Unterschied ist allerdings das die Anzeige der Function in der Liste permanent ist. Ich hab das schon mal mit einem Timer versucht der die Liste refresh, das sieht allerdings gelinde gesagt blöd aus. Wäre hier vielleicht ein Thread angesagt? Aber wie, teilweise kann der Code schon mehrere 100 Functions haben. Mit welchen Parser oder RegExt ist soetwas event. zu bewerkstelligen. |
Re: Verzeichnis in VirtualStringTree
Moin Zusammen,
ich weiss, dieser Thread ist alt, aber ich bin hier zufällig über einen "beliebten" Fehler gestolpert. Das hier:
Delphi-Quellcode:
wird zwar gerne verwendet, umd auf die Verzeichnisse . und .. zu prüfen, ist aber leider falsch, da eine Datei bzw. ein Verzeichnis auch mit einem . beginnen kann.
and (SearchRec.Name[1] <> '.') then begin
Jeder möge bitte mal in seinem Profilverzeichnis nachschauen. Viele dürften da ein Verzeichnis .borland vorfinden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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