Ho avuto lo stesso problema a lavorare con TVirtualDrawTree di. Devi assicurarti che le altezze dei nodi siano calcolate prima che l'albero scorra effettivamente.
Questo è quello che faccio:
1.- Aggiungere questo codice all'evento OnInitNode in modo che l'albero sa che l'altezza del nuovo nodo deve essere calcolata:
Node.States := node.States + [vsMultiline] - [vsHeightMeasured];
2.- nel OnMeasureItem, se non è possibile calcolare l'altezza (es nodo non ancora inizializzato), assicuratevi di informare l'albero per ripetere la chiamata quando necessario: nel gestore di eventi OnMeasureItem:
If (Node = Nil) Or (Node = tree.RootNode) Then Begin
Exclude(Node.States, vsHeightMeasured);
Exit;
End;
NodeData := tree.GetNodeData(Node);
If (NodeData = Nil) Or (NodeData^.XMLNode = Nil) Then Begin
Exclude(Node.States, vsHeightMeasured);
Exit;
End;
Try
// Code to measure node height here.
Except
Exclude(Node.States, vsHeightMeasured);
End;
Spero che ti aiuti.
fonte
2010-05-17 14:40:22
Grazie Linas. Sì, sto impostando l'altezza personalizzata per ogni nodo nella base eventi OnMeasureItem sul contenuto del nodo. l'impostazione 'tree1.FocusedNode' non funziona. Proverò a ciò che hai detto sull'impostazione dell'altezza di grandi dimensioni per tutti i nodi, quindi regoleremo i valori. –
Hi Linas, Il secondo approccio che hai suggerito funziona! Sembra che Virtual Treeview utilizzi DefaultNodeHeight durante il calcolo durante un'operazione di scorrimento. –
Esatto, Edwin. L'alternativa sarebbe che il controllo inizializzasse ogni nodo dell'albero, anche quelli che non dovevano essere ancora visibili. Questo può richiedere tempo. –