AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichnis in VirtualStringTree

Ein Thema von colder · begonnen am 3. Mär 2006 · letzter Beitrag vom 31. Dez 2009
Antwort Antwort
Benutzerbild von colder
colder

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

Verzeichnis in VirtualStringTree

  Alt 3. Mär 2006, 21:18
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?!
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Verzeichnis in VirtualStringTree

  Alt 4. Mär 2006, 03:03
hast du dir schon die demos angeschaut?
da wird das gezeigt.
demos und vst hier:
http://www.lischke-online.de
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Verzeichnis in VirtualStringTree

  Alt 4. Mär 2006, 08:11
Hi colder,

vielleicht kannst du uns mal deinen Code zeigen, dann können wir dir sagen, wo du den Fehler gemachst hast

MfG,

Manu
  Mit Zitat antworten Zitat
etom291272

Registriert seit: 16. Feb 2004
Ort: ---
232 Beiträge
 
#4

Re: Verzeichnis in VirtualStringTree

  Alt 4. Mär 2006, 09:24
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;
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Verzeichnis in VirtualStringTree

  Alt 4. Mär 2006, 10:57
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...
  Mit Zitat antworten Zitat
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
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Verzeichnis in VirtualStringTree

  Alt 31. Dez 2009, 22:25
Moin Zusammen,

ich weiss, dieser Thread ist alt, aber ich bin hier zufällig über einen "beliebten" Fehler gestolpert.

Das hier:

  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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz