Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora su questo benedetto albero che non ne vuol sapere( molto lungo )

Salve raga,
Sto ancora litigando con quest'albero che non ne vuol sapere di
visualizzarsi.
Ecco le routines principali della classe:
Private Sub BuildNodes(ANodes As Nodes, ANode As NodeClass, ALevel As
Integer)
   If Level = ALevel Then
     NodeKind = tvwNext
   Else
     NodeKind = tvwChild
   End If
   Level = ALevel
   If Not (ANode Is Nothing) Then
     Set CurrentNode = ANodes.Add(LastKey, NodeKind, ANode.Key,
ANode.Caption)
     BuildNodes ANodes, ANode.LeftNode, Level + 1
     BuildNodes ANodes, ANode.RightNode, Level + 1
   End If
End Sub
Public Sub Build()
  If Level = -1 Then
    Set CurrentNode = TreeNodes.Add(, NodeKind, BinaryTreeNodes.Key,
BinaryTreeNodes.Caption)
    LastKey = BinaryTreeNodes.Key
  End If
  BuildNodes TreeNodes, BinaryTreeNodes, Level + 1
End Sub
Il funzionamento, in teoria, è semplice.
Quando vuoi far visualizzare l'albero, imposti due proprietà e
chiami Build. Tutto il procedimento funziona per "livelli".
Se Build incontra un livello -1( che quello di "init" ), allora alloca
il nodo radice. Imposta l'ultima chiave al valore di BinaryTreeNodes.Key e
poi,
fuori dall'if, chiama BuildNodes incrementando il livello di 1.
Entrando in BuildNodes succede questo:
Se Level è uguale al livello passato come parametro, allora si crea un nodo
"fratello",
mentre se  è diverso, un nodo figlio.
L'idea è che se passo alla routine sempre lo stesso livello, posso ottenere
due nodi fratelli
( quindi preservando Left e Right ), mentre se il livello aumenta posso
scendere nei sottonodi.
Inoltre l'ultima chiave è sempre conservata nel suo stack-frame, quindi
dovrebbe sempre essere
corretta.
Il problema è che continua a non funzionare, dicendo "Impossibile trovare
l'elemento"
sull'istruzione:
"Set CurrentNode = ANodes.Add(LastKey, NodeKind, ANode.Key, ANode.Caption)"
nel blocco:
 Level = ALevel
   If Not (ANode Is Nothing) Then
     Set CurrentNode = ANodes.Add(LastKey, NodeKind, ANode.Key,
ANode.Caption)
     BuildNodes ANodes, ANode.LeftNode, Level + 1
che si trova in BuildNodes.
Qualcuno ha un'idea su come risolvere sto papiello?
Grazie in anticipo
Andrea

 Ecco le routines principali della classe:
[SNIP]
Abbi pazienza, LeftNode e RightNode in che parentela devono essere con il
nodo corrente? e soprattutto sono, tra loro, allo stesso livello?
La mia cultura "scolastica" sugli alberi binari fa un po' acqua, ma se non
sbaglio dovrebbero sempre essere due figli del nodo; se e' cosi' vedo un
problema qui:
    Level = ALevel
    If Not (ANode Is Nothing) Then
        Set CurrentNode = ANodes.Add(LastKey, NodeKind, _
            ANode.Key, ANode.Caption)
        BuildNodes ANodes, ANode.LeftNode, Level + 1
        BuildNodes ANodes, ANode.RightNode, Level + 1
    End If
Tra le due chiamate a BuildNodes per i nodi Left e Right la variabile Level
(dichiarata a livello di modulo/classe suppongo) viene incrementata dalla
ricorsione, quindi quelli che dovrebbero essere nodi paralleli diventano
nodi di livello differente
E' molto probabile che la chiamata corretta debba utilizzare 'ALevel+1'
Altra cosa: dato che LastKey viene memorizzata soltanto quando crei la
radice, il tree non potra mai spingersi oltre il secondo livello (puoi al
massimo creare figli della root)
E ancora: la chiamata in Build
BuildNodes TreeNodes, BinaryTreeNodes, Level + 1
non mi sembra corretta perche' questo nodo e' stato gia' aggiunto quando fai
'If Level = -1'... lo stai quindi aggiungendo come figlio di ste stesso, ma
soprattutto lo aggiungi con la stessa Key, il che certamente genera un
errore
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:b1rch7$16244q$1...@ID-170738.news.dfncis.de...

Ciao Andrea, sono un neofito di Vb e ancora non conosco bene tante sue
cose...
ho fatto un corso per l'elaborazione dati e lì me la cavo (db, ado etc) ma
questo è un altro discorso...
xò ho familiarità (molta dato che devo dare l'esame a giorni) sugli alberi
binari in C...
Io ho provato a fare una cosa tipo
public type nodotree
    dato as integer
    left as nodotree
    right as nodotree
end type
ma in vb non esistono i puntatori e quindi mi dà errore...
ho provato ad usare un treeview ma ha solo il nodo left ed è quindi
scomodo...
se mi spieghi da che punto partire magari possiamo lavorarci che ne dici?
Aspetto un tuo msg...qui sul NG
Ciao

 Ciao
Ciao
Andrea
P.S. Se lo ritieni opportuno posto il codice con le ultime modifiche,
cosě ci dai uno sguardo ok?