Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verzeichnis in VirtualStringTree (https://www.delphipraxis.net/64453-verzeichnis-virtualstringtree.html)

colder 3. Mär 2006 20:18


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?!

generic 4. Mär 2006 02:03

Re: Verzeichnis in VirtualStringTree
 
hast du dir schon die demos angeschaut?
da wird das gezeigt.
demos und vst hier:
http://www.lischke-online.de

Die Muhkuh 4. Mär 2006 07:11

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:

etom291272 4. Mär 2006 08:24

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;

Hawkeye219 4. Mär 2006 09:57

Re: Verzeichnis in VirtualStringTree
 
Hallo colder,

vielleicht hilft Dir ja auch das hier?

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...

colder 4. Mär 2006 12:13

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:
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.

Christian Seehase 31. Dez 2009 21:25

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:
  and (SearchRec.Name[1] <> '.') then begin
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.

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