Pregunta

TTreeNode no tiene una propiedad Visible, por lo que la opción obvia no existe. ¿Hay alguna otra forma de hacer que un TTreeNode y todos sus nodos secundarios sean invisibles? Por supuesto, quiero poder volver a hacerlo visible más tarde.

Esto es con Delphi 2007.

Nota # 1: conozco la alternativa TVirtualTreeView, y la comprobaré si no hay una manera fácil de lograr esto con TTreeView.

Nota # 2: Necesito la opción solo para nodos de nivel superior. Los que quiero ocultar generalmente ni siquiera tienen hijos.

¿Fue útil?

Solución

Es una buena idea separar los datos de la interfaz de usuario , y este problema con las vistas en árbol es un buen ejemplo: no almacene datos en una vista en árbol . A menudo tengo una unidad no visual que contiene una clase estructurada que almacena datos. Una unidad de interfaz de usuario puede tener una vista de árbol que puede mostrar (un subconjunto configurable de) datos de esa clase. Hay una variedad de formas de mover datos entre los dos. Este tipo de aislamiento requiere un poco de planificación, pero proporciona mucha más flexibilidad y estabilidad.

Otros consejos

si desea utilizar un mejor componente de árbol, ¿por qué no utilizar Virtualtreeview? Es uno de los mejores componentes jamás desarrollados para Delphi y es de uso gratuito con fuente. ¡Pero quizás haya un problema lógico al ocultar un ttreenode! ¿Debería el árbol mostrar un signo + cuando no hay nodos visibles?

http://wiki.lazarus.freepascal.org/VirtualTreeview

TTreeView es un contenedor para la vista de árbol estándar de Windows, que (a juzgar por la documentación en MSDN ) no permite ocultar nodos de árbol. También tiene sentido, ya que se sabe que la vista de árbol no se escala a una gran cantidad de nodos, por lo que ocultar nodos de árbol en lugar de eliminar todo lo que no es necesario sería una mala idea.

Puede hacer su vida un poco más fácil si quita e inserta solo el nodo de nivel superior (el que desea ocultar), y crea todos los nodos secundarios en el evento OnExpanding del restablecimiento nodo agregado. Para eso solo necesita establecer la propiedad HasChildren del nodo en true.

La única forma de " ocultar " un nodo en TTreeView es realmente eliminarlo. Luego, para "mostrar" el nodo, simplemente vuelva a insertarlo nuevamente.

Cómo lo hice en DXE5 con TTreeView estándar. Creo que será útil para algunos chicos. Lo he hecho simple, por ejemplo:

1. Artículo que debe estar oculto. Configuré ImageIndex de eso en 2.

  var
    Node:TTreeNode;
  begin
  ...
  Node:=Tree.Items.AddChild(ParentNode,'Text');
  Node.ImageIndex:=2;

2. Ahora configuro el evento AdvancedCustomDrawItem de TTreeView.

  if Node.ImageIndex=2 then
  begin
    DefaultDraw:=false;
    Node.Parent.HasChildren:=false;
  end;

3. Compruébelo con el evento onClick de TTreeView:

var
 Tree:TTreeView;
 Node:TTreeNode;
begin
  Tree:=Sender as TTreeView;
  if Tree.Selected.Index>-1 then
   if Tree.Selected.HasChildren then
    if Tree.Selected.getFirstChild.ImageIndex=2 then
     showmessage(Tree.Selected.getFirstChild.Text);

Hecho. Espero que te ayude.

Resuelvo este problema moviendo el nodo a otro nodo no expandido y viceversa. Lo hice en el controlador de eventos en expansión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top