Newsgroup: it.comp.lang.delphi
Titolo: Treeview

Salve, mi sto cimentando con la treeview.
Ho una funzione 
makeTreeNodes(Files, Dirs: TStrings;TreeNode:TTreeNodes):boolean;
che in pratica mi estrae la lista di directory e files di una determinata
directory e mi riempie un treenodes.
Se passo treeview1.items va tutto ok. Ma non riesco ad andare oltre
questo. come passo i vari subitems che sono di tipo ttreenode?
Grazie in anticipo.
--- posted by geoForum on 
http://www.delphiedintorni.it


Un' esposizione piu' chiara aiuterebbe non poco a darti una mano...
Posta in questo modo l'unica risposta possibile (ma decisamente troppo
banale per essere quello che volevi sapere) e':
makeTreeNodes(Files, Dirs: TStrings;TreeNode:TTreeNode):boolean;
ciao
S

Sono andato avanti... ho queste funzioni:
function TForm1.makeTreeNode(Files, Dirs:
TStrings;TV:TTreeView;TN:TTreeNode):boolean;
var
  i: Integer;
begin
  if (Assigned(Dirs)) and (Assigned(Files)) then
  for i:=0 to Dirs.Count - 1 do
    TV.Items.AddChild(TN, Dirs[i]);
  for i:=0 to Files.Count - 1 do
    TV.Items.AddChild(TN, Files[i]);
end;
function TForm1.DirectoryList(Dir:String; Files, Dirs: TStrings):boolean;
var
  Sr:TSearchRec;
begin
  Files.Clear;
  Dirs.Clear;
  Result  := False;
  if (Files<>nil) or (Dirs<>nil) then
  begin
    if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\';
    if FindFirst(Dir+'*.*',faAnyFile, Sr)=0 then
    begin
      repeat
        if Sr.Attr and faDirectory=faDirectory then
        begin
          if (Dirs<>nil) and (Sr.Name<>'.') and (Sr.Name<>'..') then
          begin
            Dirs.Append(Sr.Name);
            Result := False;
          end;
        end
        else
        if Files <> nil then Files.Add(Sr.Name);
      until FindNext(Sr)<>0;
      FindClose(Sr);
    end;
  end;
end;
e la utilizzo in un tasto
procedure TForm1.Button1Click(Sender: TObject);
var Files, Dirs: TStrings;
    Directory: String;
    i: Integer;
    mynode: TTreeNode;
begin
  TreeView1.Items.Clear;
  Files   := TStringList.Create;
  Dirs    := TStringList.Create;
  mynode  := TTreeNode.Create(nil);
  TreeView1.Items.Add(nil, 'C:\');
  DirectoryList('C:\', Files, Dirs);
  makeTreeNode(Files, Dirs, TreeView1, TreeView1.Items[0]);
  for i:=0 to TreeView1.Items.Count-1 do
  begin
    Memo1.Lines.Add(IntToStr(i) + ' - ' +
IntToStr(TreeView1.Items[i].Level) + ' - ' + TreeView1.Items[i].Text);
  end;
  for i:=0 to TreeView1.Items.Count-1 do
  begin
    if TreeView1.Items[i].Level = 1 then
    begin
      mynode  := TreeView1.Items[i];
      DirectoryList(TreeView1.Items[0].Text + mynode.Text, Files, Dirs);
      makeTreeNode(Files,Dirs,TreeView1,mynode)
    end;
  end;
  Files.Free;
  Dirs.Free;
  mynode.Free;
end;
non mi aggiunge i nodi successivi... come si fa?


Se ho capito bene e cioè che vuoi portare la struttura di una directory in
un treeview ti posto questo metodo 'cinese', che sicuramente verrà
criticato dai Guru di questo NG.
Metti una ShellTreeView e poi la tua bella TreeView. La prima la metti
nascosta e fai uno swap del file puntato alla directory e la ricarichi.
Così sei sicuro di non avere bug.
ShellTreeView1.Visible:=false;
ShellTreeView1.Root:='C:\ciao\Lamiadirectory';
ShellTreeView1.FullExpand;
ShellTreeView1.SaveToFile('C:\swap.txt');
TreeView1.LoadFromFile('C:\swap.txt');
DeleteFile('C:\swap.txt');
PS. Nella tua routine stai attento che se aggiungi un child devi essere
sicuro di selezionare l'item giusto o non aggiunge niente.
Vedi istruzioni del tipo:
TreeView1.Items[0].Selected, TreeView1.Selected etc. adesso non ricordo
bene, insomma select, selected.
Se costruisci un albero devi sempre puntare all'ultimo item selezionato e
capire se aggiungere un padre o un figlio.
Vedi meglio tu.
Ciao !


La soluzione di Gatto Bianco funziona, perň se posso dire la mia, magari 
anzichč fare lo swap fai una assegnazione item a item tra le due 
strutture.
Ciao
Gatto Nero


La soluzione di Gatto Bianco funziona.
Aggiungo che è possibile fare un'assegnazione item a item anzichè fare 
lo swap su disco.
Ciao
Gatto Nero
