Você está na página 1de 7

Programando com o TreeView

Abort;
end;
end;

Neste exemplo, vamos analisar duas propriedades mais importantes que são
ImageIndex e SelectedIndex.

Indexa uma imagem, no componente ImageList, para ser


ImageIndex
mostrada quando o Nó não estiver selecionado.
Indexa uma imagem, no componente ImageList, para ser
SelectedIndex
mostrada quando o Nó for selecionado.

Você também poderá dar o mesmo valor para as propriedades ImageIndex e


SelectedIndex. Isso significará que as imagens dos Nós não mudarão quando
forem eles selecionados.

Faça as alterações em nosso projeto, compile, execute e vejas a diferença que as


imagens proporcionam nos nosso exemplo.

Entendendo a Hierarquia de Níveis do TreeView

Verificar em qual nível um Nó se encontra em uma estrutura com o TreeView pode


ser muito útil. Obter essa informação é fácil, bastando apenas verificar na
propriedade Nível do TreeView qual o índice daquele nível.

Como exemplo na figura acima, podemos verificar facilmente que o Nó Principal


(Root), está no nível 0 (N.T: O nível 0 é o Nível Principal e não pode ser excluído).
Todos os Nós que são Nós Filhos do Nó Principal (Root), possuem o nível 1, nível
2, etc.

Como cada Nó dentro da aplicação deve representar uma única informação,


devemos evitar que existam Nós com o mesmo nome, o que causaria confusão
para o usuário. Devemos então desenvolver artifícios para evitar essa hipótese.

11 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

Prevenindo a Criação de Nós Duplicados

Uma coisa muito importante na hierarquia com o TreeView, é que todos os Nós
que pertence a um Nó Principal, devem ter um único nome para identificá-los, não
sendo possível a criação de Nós duplicados com o mesmo nome. Similar a
restrição que possuem os arquivos, que quando criados em uma pasta devem ter
um nome único, não permitindo que sejam criados outros arquivos com esse
mesmo nome. Porém, não existem propriedades específicas no TreeView para
esse controle, e portanto, essas adaptações devem ser feitas manualmente
durante a criação dos códigos.

Abaixo temos uma função exemplo para checar se o nome criado no TreeView já
existe. Para implementar esse código abra o projeto e localize a cláusula
Implementation. Logo abaixo da diretiva compiladora (N.T.:{$R *.dfm}) digite o a
função que segue:

Function NomeDuplicado( Node : TTreeNode; sNewName : string;


bInclusive : boolean) : boolean;
var
TestNode : TTreeNode;
begin

if( Node = nil ) then


begin

Result := false;
Exit;
end;

if( bInclusive = true ) then


if( CompareText( Node.Text, sNewName ) = 0 ) then
begin

12 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

Result := true;
Exit;
end;

TestNode := Node;
Repeat

TestNode := TestNode.GetPrevSibling;

if( TestNode <> nil ) then

if( CompareText( TestNode.Text, sNewName ) = 0 ) then


begin

Result := true;
Exit;
end;

until (TestNode = nil);

TestNode := Node;
Repeat

TestNode := TestNode.GetNextSibling;

if( TestNode <> nil ) then

13 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

if( CompareText( TestNode.Text, sNewName ) = 0 ) then


begin

Result := true;
Exit;
end;

until (TestNode = nil);

Result := false;
end;

Esta função verifica se existem nomes duplicados executando três passos:

1. Na inclusão de um novo Nó, verifica se o nome atribuído ao Nó é igual a um


nome já criado)
2. Verifica o nome de todos os “Nós irmãos” que estão antes do nó criado.
3. Verifica todos os “Nós Irmãos” que estão após o Nó criado.

Abaixo está uma sugestão para atualização do botão Adicionar do exemplo O


código entre parênteses indica a atualização que deverá ser feita no exemplo.
Este código deverá ser coloca no evento OnClick do referido botão.

procedure TFrmEx1.BtnAdicionarClick(Sender: TObject);


var
sText : string;
InputSim : Boolean;

Begin

if( TVEx1.Selected = nil ) then


begin

14 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

if( TVEx1.Items.Count = 0 ) then


Begin

with TVEx1.Items.AddFirst( nil, 'Principal' ) do

Begin

Selected := true;

ImageIndex := Img_Principal;
SelectedIndex := Img_Principal;

end;
end
else

begin

ShowMessage( 'Selecione um Nó' );


Exit;
end;
end
else

Begin

InputSim := InputQuery( 'Adicionar Nó', 'Insira o nome do Nó', sText );

If InputSim = true then

15 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

Begin
If Stext = '' then
Begin
ShowMessage('Digite um nome para o Nó!');
BtnAdicionar.Click;
Abort;
End;

If (NomeDuplicado(TVEx1.Selected.GetFirstChild,SText,True)) then
Begin
ShowMessage('Já existe um Nó criado com esse nome.' + #13 +
'Favor escolher outro nome.');
Exit;
End

Else
with TVEx1.Items.AddChildFirst( TVEx1.Selected, sText ) do
begin

ImageIndex := Img_Pasta_Fechada;
SelectedIndex := Img_Pasta_Aberta;

MakeVisible;
end;
end

Else
Abort;
end;
end;

16 de 17
e-mail: msarcinelli@hotmail.com
Programando com o TreeView

Nota Final
Após a conclusão da primeira parte desse tutorial, espero que tenham gostado e
aprendido a trabalhar com o TreeView. Quando encontrei esse material na Net,
logo pensei em traduzi-lo e adaptá-lo para que fosse distribuído livremente, e
embora tenha me custado muitas horas de dedicação a trabalho na adaptação de
intermináveis linhas de código, sei que será de muita valia a todos que apreciam
essa poderosa ferramenta que faz parte do Delphi. Como esse tutorial é
distribuído livremente meu único pagamento serão as sugestões e críticas que
porventura venha a receber, e que serão de grande valia para que possa ter
ânimo para completar essa série de tutoriais. Todas as pessoas que quiserem
colocar essas informações em sites particulares, estão autorizadas a fazê-lo,
desde que me comuniquem no endereço que consta no rodapé. Obrigado a todos.

Aguardem para as outras partes desse tutorial:

Usando a propriedade Data do TreeView (possibilita a associação do


TreeView com outros dados, como a abertura de um formulário, por
exemplo)
Associando um TreeView a um ListView.
Colocando uma ordem nos Nós do TreeView para facilitar a procura de
dados
Salvando o TreeView e os dados no disco

Obs: O projeto com todos os códigos constantes nesse tutorial deve estar anexo a
esse, para facilitar o estudo dos exemplos.

17 de 17
e-mail: msarcinelli@hotmail.com