Moin
Ich vermute mal (anhand Deines Beispiels), dass Du eine Verzeichnis-Explorer nachbauen möchtest...
Das ist doch relativ einfach zu machen und geht auch superflink(siehe mein Code weiter unten)
Zunächst: die doppelten Einträge sind einfach zu erklären-> im ersten Step ziehst Du dir schon die [b]gesamte[/] Verszeichnisstruktur des ausgewählten Laufwerks rein:
Code:
procedure DirsToTreeView(Dir:String; TV:TTreeview;Item:TTreeNode; addFiles:Boolean; ChildCount:Integer);
var
Sr: TSearchRec;
parent:TTreeNode;
begin
...
item:=tv.Items.AddChild(Item,sr.name); //--Knoten zuweisen
...
//--für den soeben erstellten Knoten gleich die Unterverzeichnisse suchen und eintragen
DirsToTreeView(dir+sr.name,tv,item,addfiles,ChildCount);
...
end;
Ist ja prinzipiell nicht verkehrt, nur bei einer umfangreichen Struktur dauert es halt ein bischen, bis der Baum aufgebaut ist...
Im zweiten Step klickst Du auf irgendeinen Knoten, um diesen aufzumachen und die darumnterliegende Struktur anzuzeigen bzw. die Struktur einzulesen -> genau hier erscheinen dann die doppelten Einträge -> Du liest mit der zweiten Procedure nochmals die Struktur des angewählten Knotens aus, obwohl diese schon vom ersten Step vorhanden ist...
So, nun zu meinem Lösungsvorschlag:
Delphi-Quellcode:
{Hinweis: AutoExpand beim TreeView ist FALSE!!}
//--Editfeld zur Laufwerksauswahl
procedure TfrmMain.Edit2KeyPress(Sender: TObject; var Key: Char);
var Node: TTreeNode;
begin
if key=#13 then
begin
//--RootKnoten erstellen
Node := TreeView1.Items.Add(nil,Edit2.Text);
//--erste Verzeichnisebene auslesen
VerzBaum(Edit2.Text, TreeView1, Node, false);
end;
end;
procedure TfrmMain.VerzBaum(Dir: String; aTV:TTreeView; aItem: TTreeNode);
var
SR: TSearchRec;
NeuerNode: TTreeNode;
begin
aTV.Items.BeginUpdate; //--Aufbau schneller, da nicht ständig neu gezeichnet werden muss
if findFirst(Dir+'\*.*', faAnyFile,SR) = 0 then
repeat
if (SR.Name <> '.') and (SR.Name <> '..') and (sr.Attr and faDirectory > 0) then begin
NeuerNode := aTV.Items.AddChild(aItem,SR.Name);
NeuerNode.HasChildren := True; //erstmal setzen
end;
until FindNext(SR) <> 0;
FindClose(SR);
aTV.Items.EndUpdate; //--neue Knoten anzeigen
//--Markierung entsprechend setzen
aItem.HAsChildren := (aItem.Count>0);
end;
//--Knoten expandieren bzw Struktur einlesen und Baum aufbauen
procedure TfrmMain.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var ElternKnoten: TTreeNode;
Pfad: String;
begin
//--wenn noch keine Unterknoten(Kinder) existieren
if Node.GetFirstChild = nil then
begin
//--alle Parents auslesen bis zur Root und somit den Pfadnamen zusammensetzen
Pfad := Node.Text;
ElternKnoten := Node.Parent;
while ElternKnoten <> nil do begin
Pfad := ElternKnoten.Text+ '\' + Pfad ;
ElternKnoten := ElternKnoten.Parent;
end;
VerzBaum(Pfad, TreeView1, Node, false);
//AllowExpansion := True;
end;
end;
procedure TfrmMain.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{ Dateien aus Verzeichnis mit entsprechender MAske auslesen }
procedure DateiListe(sPfad, sMaske: String; aList: TListBox);
var SR: TSearchRec;
Pfad: String;
begin
Pfad := IncludeTrailingBackSlash(sPfad);
if FindFirst (PChar(Pfad+ sMaske), faAnyFile, SR) = 0 Then
repeat
if (SR.Name <> '.') and (SR.Name <> '..') Then
aList.Items.Add(SR.Name);
until FindNext (SR ) <> 0;
FindClose(SR);
end;
var aNode, ElternKnoten: TTreeNode;
Pfad: String;
begin
ListBox1.Clear;
aNode := TreeView1.Selected;
//--feststellen, ob MausKlick auf einem Knoten erfolgte
if (htOnItem in TreeView1.GetHitTestInfoAt(X,Y)) then
begin
Pfad := aNode.Text;
ElternKnoten := aNode.Parent;
while ElternKnoten <> nil do begin
Pfad := ElternKnoten.Text+ '\' + Pfad ;
ElternKnoten := ElternKnoten.Parent;
end;
DateiListe(Pfad, '*.*', ListBox1);
end;
end;
Das Beispiel habe ich bewusst einfach gestrickt (mit den guten D5 *grins*) um das Ganze nachvollziehbar zu machen (hoff ich doch, dass es mir gelungen ist...)
Wünsche viel Erfolg beim 'studieren' und probieren...
an meine alte Heimat (sofern es OL ist)