Einzelnen Beitrag anzeigen

Benutzerbild von colder
colder

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#6

Re: Verzeichnis in VirtualStringTree

  Alt 4. Mär 2006, 13:13
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.
Miniaturansicht angehängter Grafiken
vs_143.jpg  
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat