Newsgroup: it.comp.lang.delphi
Titolo: Leggere albero

Salve a tutti ho salvato i dati di un treeview su una tabella avente la 
seguente struttura
id, idpadre, descrizione
idpadre indica di quale elemento , tramite il campo id, il record corrente è 
figlio.
adesso debbo realizzare la parte per caricare il treeview ma non riesco ad 
implementare una funzione ricorsiva che mi scorra tutta la struttura, mi 
potete aiutare?
grazie 1000. 

I linguaggi, oggi, sono veramente ad alto livello.
Puoi usare :
- LoadFromFile, LoadFromStream
- SaveToFile,SaveToStream
Le trovi nell'HelpOnLine.
Ciao
Mario - (
mari...@inwind.it
)
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Forse mi sono spiegato male, il problema non è riferito al linguaggio, ma in 
generale sull'implementazione, a livello di logica, di una funzione 
ricorsiva che permetta di esplorare una struttura ad albero.
Grazie. 


http://groups.google.it/groups?hl=it&lr=&threadm=D9fYd.18246%24WC1.1021%40tornado.fastwebnet.it
ops ... ho verificato solo adesso che il thread da me
riportato era iniziato proprio da te ... ;) vabbè
ripetere non fa mai male :-S forse ... :-P
	Ciao
	MassimoB
 
---------------------------
http://www.massimobeschi.it/

Grazie. 


Fabrizio ha scritto:

Ho implementato /*esattamente*/ quello che devi fare tu in un programma 
per l'indicizzazione di documenti, file o siti internet 
(
http://www.marcobortolani.it/prodotti/contento.asp
).
In sostanza, la procedura che devi scrivere deve ricevere in input il 
nodo che stai analizzando e chiamare se stessa per ognuna dei nodi di 
cui esso è padre. Ammetti infatti di avere la tabella
     NODI (idnodo, idnodopadre, descrizione)
La tua procedura AnalizzaNodo deve fare una cosa del tipo
     proc AnalizzaNodo(anObjNodoPadre, anCodiceNodoPadre);
     begin
       // Seleziono i nodi figli di quello attuale
       select *
       from tabella
       where idnodopadre = anCodiceNodoPadre
       // Scorro l'elenco dei sottonodi
       while not select.Eof do
       begin
         new(nodo);
         nodo.idnodo = select.idnodo;
         // Se sono al primo livello devo usare la AddObject,
         // altrimenti la AddChild (vedi help in linea)
         if anObjNodoPadre= Nil then
           treeview.AddObject(Nil, nodo.idnodo, nodo)
         else
           treeview.AddChilObject(anObjNodoPadre, nodo.idnodo, nodo);
         AnalizzaNodo(nodo, select.idcategoria);
         select.Next
       end;
     end;
Al primo giro il nodo padre è nil: AnalizzaNodo(nil, -1);
Infine nodo deve essere un oggetto:
type
     TNodo = ^TDatiNodo;
     TDatiNodo = record
         idnodo : String;
     end;
Sono rimasto molto generico per non toglierti il gusto della scoperta, 
ma il tutto si basa su una soluzione realmente funzionante.
Sappici dire.
	Marco Bortolani
	info @ 
marcobortolani.it

 ripetere non fa mai male :-S forse ... :-P
Ok Grazie :) 


Grazie ho risolto, sei stato molto gentile. 

 
Come hai risolto? Con i componenti treeview data aware o con una 
procedura ricorsiva?
		Marco

 ha scritto nel messaggio 
news:vQR6e.769983$b5.34...@news3.tin.it...

Ho fatto cosi, funziona, spero che sia anche corretta da un punto di vista 
teorico.
procedure TfmMain.caricaMenuXUtente(VoceMenu:string);
  procedure CaricaAlbero(Nodo:TTreeNode;ID:String);
    var qTemp:TQuery;
    newNode:TTreeNode;
  begin
      qTemp:=Tquery.create(Self);
      qTemp.DataBasename:=qymenu.DatabaseName;
      qTemp.Sql.text:='Select * from UsersMenu Where IDPadre='+ID;
      qTemp.Active:=true;
     While not qTemp.Eof do begin
      newNode:=tvMenuUtenti.items.addchild(Nodo,qTemp.FieldByName('Descrizione').asstring);
      CaricaAlbero(newNode,inttostr(qTemp.FieldByName('ID').asinteger));
      qTemp.next;
    end;
    qTemp.Active:=false;
    FreeAndNil(qTemp);
  end;
Solo che adesso mi sono accorto che dovrei gestire anche l'ordinamento in 
quanto quando creo l'albero ho la necessità do poter inserire degli items 
anche in mezzo ad altri, comunque credo di farcela da solo.