2010-05-15 23 views

risposta

5

ScrollIntoView funziona bene per me. Puoi anche provare tree1.FocusedNode := tree1.GetLast;

Stai impostando l'altezza del nodo personalizzato nell'evento OnMeasureItem? Se non funziona, prova ad impostare DefaultNodeHeight dell'albero sul valore più grande e in OnMeasureItem event a cambiarlo. Ho notato che l'albero ricalcola la lunghezza della barra di scorrimento meglio in questo modo.

+0

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. –

+0

Hi Linas, Il secondo approccio che hai suggerito funziona! Sembra che Virtual Treeview utilizzi DefaultNodeHeight durante il calcolo durante un'operazione di scorrimento. –

+0

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. –

1

Questo dovrebbe funzionare anche:

tree1.TopNode := tree1.GetLast 
+0

Grazie Straveu. non funziona anche ... PS. Posso ottenere la visualizzazione ad albero completata stampata se manualmente (non a livello di codice) scorrere verso il basso fino all'ultimo nodo. –

1

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.

4

Prova questa:

SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0); 
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0); 
Problemi correlati