Einzelnen Beitrag anzeigen

raiguen
(Gast)

n/a Beiträge
 
#2

Re: TTreeView alles dopelt, warum ?

  Alt 13. Aug 2006, 20:11
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)
  Mit Zitat antworten Zitat