que he tenido el mismo problema trabajar con TVirtualDrawTree de. Debe asegurarse de que las alturas de los nodos se computen antes de que el árbol se desplace.
Esto es lo que hago:
1.- Añadir este código al evento OnInitNode para que el árbol sabe que la altura del nuevo nodo debe ser calculado:
Node.States := node.States + [vsMultiline] - [vsHeightMeasured];
2.- en el OnMeasureItem, si no se puede calcular la altura (por ejemplo, nodo no inicializado aún), asegúrese de informar al árbol para repetir la llamada cuando sea necesario: en el controlador de eventos 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;
Espero que te ayude.
Gracias Linas. Sí, estoy configurando una altura personalizada para cada nodo en la base de eventos OnMeasureItem en los contenidos del nodo. la configuración de 'tree1.FocusedNode' no funciona. Probaré lo que dijiste sobre establecer la altura máxima para todos los nodos y luego ajustar los valores. –
Hola Linas, ¡El segundo enfoque que sugeriste funciona! Parece que Virtual Treeview usa DefaultNodeHeight al hacer el cálculo durante una operación de desplazamiento. –
Eso es correcto, Edwin. La alternativa sería que el control inicialice cada nodo en el árbol, incluso aquellos que no han tenido que ser visibles todavía. Eso puede llevar mucho tiempo. –