7
votes

Comment faire défiler de manière fiable une arborescence virtuelle sur le bas?

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)?

J'ai essayé appeler arbores1.fullexpand alors arbores1.scrollinToView. (Tree1.getlast) , mais cela ne fonctionne pas.

Merci d'avance.


0 commentaires

4 Réponses :


6
votes

ScrollINToView fonctionne bien pour moi. Vous pouvez également essayer arbores1.focususénode: = arbre1.getlast;

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.


3 commentaires

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.



1
votes

Cela devrait également fonctionner:

tree1.TopNode := tree1.GetLast


1 commentaires

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.



3
votes

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> xxx pré>

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;


0 commentaires

4
votes

Essayez ceci:

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


0 commentaires