Un objet TVIRTUALStringtree avec une hauteur de nœud personnalisée, comment faire défiler de manière fiable une arborescence virtuelle sur le bas (c'est-à-dire la barre de défilement arrive en bas)? p>
J'ai essayé appeler Merci d'avance. P> arbores1.fullexpand code> alors arbores1.scrollinToView. (Tree1.getlast) code>, mais cela ne fonctionne pas. P>
4 Réponses :
ScrollINToView fonctionne bien pour moi. Vous pouvez également essayer Définissez-vous une hauteur de noeud personnalisée dans l'événement OnMeasureItem?
Si cela ne fonctionne pas, essayez de définir la valeur par défaut de l'arbre sur la valeur plus grande et dans l'événement OnMeasureItem le modifier pour réduire. J'ai remarqué que l'arbre recalcule la longueur de la barre de défilement de cette façon. P> arbores1.focususénode: = arbre1.getlast; code> p>
Merci Linas. Oui, je fixe une hauteur personnalisée pour chaque nœud de la base d'événements OnMeasureItem sur le contenu du nœud. Réglage 'Tree1.FocususedNode' ne fonctionne pas. Je vais essayer ce que vous avez dit sur la définition de la hauteur des larges pour tous les nœuds, puis ajustez les valeurs.
Salut Linas, la deuxième approche que vous avez suggéré des œuvres! Il semble que Virtual TreeView utilise defaultNodeHeight lors du calcul pendant une opération de défilement.
C'est correct, Edwin. L'alternative serait pour le contrôle d'initialiser chaque noeud dans l'arbre, même ceux qui n'ont pas encore dû être visibles. Cela peut prendre du temps.
Cela devrait également fonctionner:
tree1.TopNode := tree1.GetLast
Merci straveu. Cela ne fonctionne pas aussi ... PS. Je peux obtenir le TreeView Traditiond imprimé si je fais défiler manuellement (non programmatisé) sur le dernier nœud.
J'ai eu le même problème à travailler avec TVirtualDrawtree. Vous devez vous assurer que les hauteurs de nœud sont calculées avant que l'arbre fait défiler réellement.
C'est ce que je fais: p>
1.- Ajoutez ce code à l'événement OninitNode afin que l'arbre sache que la hauteur du nouveau nœud doit être calculé: p> 2.- Dans l'Onpesuritem, si vous ne pouvez pas calculer la hauteur (par exemple, le nœud non initialisé), assurez-vous de dire que vous dites. l'arbre à répéter l'appel en cas de besoin:
Dans le gestionnaire d'événements OnMeasureItem: P> 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;
Essayez ceci:
SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0); PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);