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:
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;
Also hat irgend jemand eine Idee wie ich den Teil im ProjectFolder sortiert bekomme?
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.
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.