Posso fazer uma TTreeNode invisível?
-
06-07-2019 - |
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.
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?
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.