2009-05-06 18 views
5

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

Esto es con Delphi 2007.

Nota # 1: Soy consciente de la TVirtualTreeView alternativa, y voy a verlo si no hay una manera fácil de lograr esto con TTreeView.

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

Respuesta

7

Es una buena idea para separar datos de la interfaz de usuario, y esta cuestión con vistas de árbol es un buen ejemplo - no almacenan datos en una vista de á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 en á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 una flexibilidad y estabilidad mucho mayores.

+1

Si bien esa no es la respuesta que quería escuchar, creo que es la única solución posible, así que la aceptaré. – dummzeuch

3

TTreeView es un contenedor para la vista de árbol estándar de Windows, que (a juzgar por el documentation on MSDN) no permite ocultar los nodos de árbol. También tiene sentido, ya que se sabe que la vista de árbol no 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 se quita e inserta sólo el nodo de nivel superior (el que se desea ocultar), y crear todos los nodos hijos en caso OnExpanding del nodo añadido de nuevo. Para eso solo necesita establecer la propiedad HasChildren del nodo en verdadero.

5

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 la fuente. ¡Pero tal vez haya un problema lógico con la ocultación de un ttreenode! ¿Debería el árbol mostrar un signo + cuando no hay nodos visibles?

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

2

La única forma de "ocultar" un nodo en TTreeView es eliminarlo realmente. Luego, para "mostrar" el nodo, simplemente lo vuelve a insertar de nuevo.

2

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

1. Artículo que debe estar oculto. Me puse ImageIndex de ella a 2.

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

2. Ahora me puse onAdvancedCustomDrawItem caso de TTreeView.

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

3. Confirmar con onclick caso 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.

1

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

Cuestiones relacionadas