Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi eigene Ordnerstruktur in TreeView (https://www.delphipraxis.net/107584-eigene-ordnerstruktur-treeview.html)

Weazy 30. Jan 2008 09:07


eigene Ordnerstruktur in TreeView
 
Hallo zusammen,

Ich habe ein tStringList welches etwa wie folgt aussieht:

Ordner\
Ordner\A
Ordner\A\B
Ordner2\C\D

nun möchte ich die Strings in ein TreeView einlesen (das ist auch kein problem), jedoch möchte ich dass das dann so aussieht:

- Ordner
-A
-B
- Ordner2
-C
-D

Es sollen also die Ordner nicht einfach blind eingefügt werden, sondern si sollen strukturiert alls unterordner eingefügt werden. Vielleicht liese sich das durch Rekursion lösen.... :gruebel: Bringe es einfach nicht hin!

Danke!!!!

Kroko1999 30. Jan 2008 09:23

Re: eigene Ordnerstruktur in TreeView
 
teste mal eine Struktur in TTreeview, speichere diese und schaue dir an, wie sie ausieht.
So musst Du dann die uin TStringlist anlegen und kannst diese ohne viel zu prog. per LoadFromFile sogar direkt in TTreeview einlesen.

Weazy 30. Jan 2008 10:18

Re: eigene Ordnerstruktur in TreeView
 
Ich glaube du hast mich falsch verstanden: ich weiss wie ich untereinträge einfüge, ich suche nur nach etwas code um z.b aus dem String ordner\A\ ein parent Ordner und ein child A zu erstellen:

-Ordner
-A

Das schwierige ist dass es mit beliebig vielen unterordnern funktionieren soll!

marabu 30. Jan 2008 12:15

Re: eigene Ordnerstruktur in TreeView
 
Hallo Philippe,

es wäre natürlich toll, wenn die Pfadnamen in der StringList bereits in dem Format vorliegen würden, welches die TreeView selbst als Textrepräsentation kennt, aber ausgehend von deinen Beispieldaten kannst du so vorgehen:

Delphi-Quellcode:
function PathToNode(s: string; tn: TTreeNodes): TTreeNode;
var
  dir, subDir: string;
begin
  dir := ExcludeTrailingPathDelimiter(s);
  subDir := ExtractFileName(dir);
  dir := ExtractFileDir(dir);
  if dir = ''
    then Result := tn.AddChild(nil, subDir)
    else Result := tn.AddChild(PathToNode(dir, tn), subDir)
end;

procedure PathesToNodes(s: TStrings; tn: TTreeNodes);
var
  i: Integer;
begin
  for i := 0 to Pred(s.Count) do
    PathToNode(s[i], tn);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  i: Integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Assign(Memo.Lines);
  sl.Sorted := True;
  for i := sl.Count - 2 downto 0 do
    if AnsiStartsText(sl[i], sl[Succ(i)]) then
      sl.Delete(i);
  TreeView.Items.Clear;
  PathesToNodes(sl, TreeView.Items);
  sl.Free;
end;
Freundliche Grüße

Weazy 30. Jan 2008 14:44

Re: eigene Ordnerstruktur in TreeView
 
Vielen Dank, das ist genau wonach ich gesucht habe!!! Es gibt nur noch ein Problem wenn ein Ordner mehrere Unterordner hat, so werden die Parents mehrfach erstellt:

statt

Ordner
-a
-b

gibt es

ordner
-a
ordner
-b

marabu 30. Jan 2008 20:57

Re: eigene Ordnerstruktur in TreeView
 
Das hatte ich nicht bedacht, aber jetzt:

Delphi-Quellcode:
function PathToNode(s: TStrings; tn: TTreeNodes; path: string): TTreeNode;
var
  dir, subDir: string;
  index: Integer;
begin
  subDir := ExtractFileName(path);
  dir := ExtractFileDir(path);
  if dir = '' then
  begin
    index := s.IndexOf(subDir);
    if index < 0
      then Result := nil
      else Result := TTreeNode(s.Objects[index]);
    if not Assigned(Result) then
      Result := tn.AddChild(nil, subDir);
  end else
  begin
    index := s.IndexOf(dir);
    if index < 0
      then Result := nil
      else Result := TTreeNode(s.Objects[index]);
    if Assigned(Result)
      then Result := tn.AddChild(Result, subDir)
      else Result := tn.AddChild(PathToNode(s, tn, dir), subDir);
  end;
end;

procedure PathesToNodes(s: TStrings; tn: TTreeNodes);
var
  i: Integer;
begin
  for i := 0 to Pred(s.Count) do
    s.Objects[i] := PathToNode(s, tn, s[i]);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  i: Integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Assign(Memo.Lines);
  sl.Sort;
  for i := sl.Count - 2 downto 0 do
    if SameText(sl[i], sl[Succ(i)]) or (sl[i] = '')
      then sl.Delete(i)
      else sl[i] := ExcludeTrailingPathDelimiter(sl[i]);
  sl.Sorted := True;
  TreeView.Items.Clear;
  PathesToNodes(sl, TreeView.Items);
  sl.Free;
end;
Gute Nacht

grenzgaenger 30. Jan 2008 21:44

Re: eigene Ordnerstruktur in TreeView
 
sag mal, wieso nimmste nicht einfach 'n shelltreeview? einfach auf diene form ziehen und schon hast deine ordner schön dargestellt :-)

Weazy 31. Jan 2008 08:02

Re: eigene Ordnerstruktur in TreeView
 
Danke viel mals! Funktioniert super!!!!

an grenzgaenger:
geht nicht, da es sich um ordner handelt, welche in einem Archiv sind, wie kann ich die denn in ein ShellTreeView bringen, da kann ich ja nur "echte" Ordner anzeigen...

DelTurbo 21. Aug 2011 16:44

AW: eigene Ordnerstruktur in TreeView
 
Hi,
im moment bin ich auch an so einer stelle. Ich glaube ich bin zu dusselig da zu. Im moment stehe ich total auf dem schlauch. Ich habe es so ähnlich wie Weazy. Aber bei mir schmeisst sich das teil mit einem StackOverflow weg.

Meine zeilen sehen wie folgt aus. Wär toll wenn mir da jemand helfen könnte. Wie gesagt, im moment stehe ich auf dem schlauch und komme an dieser stelle nicht weiter.

C:\WINXP\system\
C:\WINXP\system32\
C:\WINXP\system32\1031\
C:\WINXP\system32\1033\
C:\WINXP\system32\argosoft\
C:\WINXP\system32\CatRoot\{127D0A1D-4EF2-11D1-8608-00C04FC295EE}\
C:\WINXP\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\
C:\WINXP\system32\CatRoot2\
C:\WINXP\system32\CatRoot2\{127D0A1D-4EF2-11D1-8608-00C04FC295EE}\
C:\WINXP\system32\CatRoot2\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\
C:\WINXP\system32\Com\
C:\WINXP\system32\config\
C:\WINXP\system32\config\systemprofile\
usw....

Da dürfte ja dann nur ein WINXP mit einem + sein, ein system ohne + und nur ein system32 mit einem +

Danke im voraus

Lannes 21. Aug 2011 20:29

AW: eigene Ordnerstruktur in TreeView
 
Hallo,

schau dir das mal an:
[TTreeView, VCL Win32] ...Node-Pfad (String) ins TreeView einfügen/TreeView füllen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.
Seite 1 von 2  1 2      

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