Pergunta

TTreeNode não tem uma propriedade Visible, então a opção óbvia não existe. Existe alguma outra maneira de fazer uma TTreeNode e todos os seus nós filho invisível? É claro que eu quero ser capaz de torná-lo visível novamente mais tarde.

Este é com Delphi 2007.

Nota # 1:. Estou ciente da TVirtualTreeView alternativa, e eu vou verificá-la, se não há nenhuma maneira fácil de fazer isso com TTreeView

Nota # 2: Eu preciso a opção apenas para os nós de nível superior. O que eu quero esconder normalmente nem sequer ter filhos.

Foi útil?

Solução

É uma boa ideia para separar os dados a partir da interface do usuário , e esta questão com vistas árvores é um bom exemplo - não armazenam dados em uma exibição em árvore . Muitas vezes eu tenho uma unidade não-visual que contém uma classe estruturada que armazena dados. Uma unidade de interface de utilizador pode ter um TreeView que pode exibe (um subconjunto de configurável) de dados a partir dessa classe. Há uma variedade de maneiras de mover dados entre os dois. Este tipo de isolamento requer um pouco de planejamento, mas oferece muita flexibilidade e estabilidade maior.

Outras dicas

Se você quiser usar um componente de árvore melhor, por que não usar VirtualTreeview. É um dos melhores componentes já desenvolvidos para Delphi e é livre para usar com a fonte! Mas há talvez um problema lógico com escondendo um TTreeNode! Caso a árvore de mostrar um sinal + quando nenhum nó são visíveis?

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

TTreeView é um wrapper para a exibição em árvore padrão do Windows, que (a julgar pelo documentação no MSDN ) não permite aos nós hide árvores. Faz sentido também, como a exibição de árvore é conhecida por não escala para um grande número de nós, então escondendo nós da árvore ao invés de remover tudo o que não é necessário seria uma má idéia.

Você pode tornar sua vida um pouco mais fácil se você remover e inserir apenas o nó de nível superior (aquela que você deseja esconder), e criar todos os nós filhos no OnExpanding caso de re- nó adicionado. Para isso você só precisa definir o HasChildren do nó a verdade.

A única maneira de "esconder" um nó em TTreeView é realmente removê-lo. Então, para "mostrar" o nó, você simplesmente re-inseri-lo novamente.

Como eu fiz isso em DXE5 com TTreeView padrão. Eu acho que vai ser útil para alguns caras. Eu fiz-lo simples, por exemplo:

1. Item que deve ser escondido. I definir ImageIndex dele a 2.

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

2. Agora eu definir evento onAdvancedCustomDrawItem de TTreeView.

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

3. Verificá-lo com 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);

Feito. Espero que isso ajude você.

Eu resolver este problema movendo o nó para outro nó não expandido e vice-versa. Eu fiz isso na na expansão manipulador de eventos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top