VB6 - Usando o Controle TreeView na Prática II

Dando continuação ao artigo - Usando o Controle TreeView - vamos agora por em prática a teoria exposta na primeira parte e mostrar na prática como usar este importante controle.

Você já sabe que podemos usar imagens no controle TreeView , na verdade toda vez que você quiser imagens no controle TreeView deverá usar juntamente com ele o controle ImageList. O controle ImageList irá conter as imagens que serão exibidas nos Nós. Vejamos um exemplo prático:

Vamos usar o controle Treeview exibindo imagens nos Nós e para isto vamos precisar primeiro configurar o controle ImageList, então :

Observe que temos ao lado do formulário do projeto a janela Property Pages do controle ImageList sendo exibida.  A janela exibe as imagens que iremos usar no controle Treeview , elas são incluídas através do botão Insert Picture . Cada imagem possui uma propriedade index que é um número seqüencial que identifica cada imagem. A propriedade Key será usada para identifica a imagem que vamos usar nos Nós do controle TreeView. Assim temos associadas a cada imagem a propriedade Key definida como: Fechado, Aberto e Arquivo.

Após configurarmos o controle ImageList temos que associá-lo ao controle TreeView . Podemos fazer isto através da propriedade ImageList da janela Property Pages do controle ou via código , assim:

Set TreeView1.ImageList = ImageList1

Vamos exibir agora o resultado de cada botão de comando e o seu código associado:

Etapa1: Criando um único Nó com uma imagem. Note que deixamos a propriedade Parent vazia pois queremos criar um Nó no Topo ou seja um Nó Raiz , e ele não possui nenhum Nó relacionado. 

Private Sub Command1_Click()
  'limpa qualquer nó criado
 
TreeView1.Nodes.Clear 

  'Associa o controle ImageList1 ao controle Treeview
 
Set TreeView1.ImageList = ImageList1

   Set nodx = TreeView1.Nodes.Add(, , "Raiz", "Nó Raiz", "Fechado")
End Sub

Criando um Nó Raiz e exibindo a Imagens com a key definida como "Fechado" no ImageList no Nó criado

Etapa2:  Criando vários Nós. Observe que neste exemplo , ao criarmos os nós filhos fazemos referência ao Nó Root (Nó Filho 1 , Nó Filho 2 e Nó Filho 3)   e ao nó Child (Nó Filho 1-A e Nó Filho 1-B)  conforme o relacionamento dos nós filhos.  A propriedade Expanded de cada Nó é usada para exibir a ramificação presente nos Nós.

Private Sub Command2_Click()

Dim nodx As Node

'limpa qualquer nó criado
TreeView1.Nodes.Clear

Set TreeView1.ImageList = ImageList1

'Inserindo o nó raiz
Set nodx = TreeView1.Nodes.Add(, , "Root", "Nó Raiz", "Fechado")

'Expandindo o nó raiz para exibir as ramificações
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Criando um nó filho sob o nó raiz - Root
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child1", "Nó Filho 1", "Fechado")

'Expandindo o nó para exibir as ramificações
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Criando mais nós filhos
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child2", _
"Nó Filho 2", "Arquivo")
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child3", _
"Nó Filho 3", "Arquivo")

'Criando dois nós filhos subordinado a ao primeiro nó filho da raiz - Child1
Set nodx = TreeView1.Nodes.Add("Child1", tvwChild, "Child1A", _
"Nó Filho 1-A", "Arquivo")
Set nodx = TreeView1.Nodes.Add("Child1", tvwChild, "Child1B", _
"Nó Filho 1-B", "Arquivo")

End Sub

Etapa3: Percorrendo os Nós através da ramificação. O código em azul foi acrescido para fazer este serviço. A mensagem é exibida indicando nó atual. 

Private Sub Command3_Click()
Dim nodx As Node

Set TreeView1.ImageList = ImageList1
'limpa qualquer nó criado
TreeView1.Nodes.Clear

Set nodx = TreeView1.Nodes.Add(, , "Root", "Nó Raiz", "Fechado")

'Expandindo o nó raiz para exibir as ramificações
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Criando um nó filho sob o nó raiz
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child1", "Nó Filho 1", "Fechado")

'Expandindo o nó para exibir as ramificações
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Criando mais nós filhos
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child2", _
"Nó Filho 2", "Arquivo")
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child3", _
"Nó Filho 3", "Arquivo")
Set nodx = TreeView1.Nodes.Add("Root", tvwChild, "Child4", _
"Nó Filho 4", "Arquivo")


'Criando dois nós filhos subordinado a ao primeiro nó filho da raiz
Set nodx = TreeView1.Nodes.Add("Child1", tvwChild, "Child1A", _
"Nó Filho 1-A", "Arquivo")
Set nodx = TreeView1.Nodes.Add("Child1", tvwChild, "Child1B", _
"Nó Filho 1-B", "Arquivo")

'Criando um laço para percorrer cada nó filho do nó raiz
Dim i As Long

'Define o nodx para o primeiro nó filho da raiz
Set nodx = TreeView1.Nodes("Root").Child

'Percorre cada nó filho atribuindo a ele o nodx
For i = 1 To TreeView1.Nodes("Root").Children
  MsgBox nodx.Text
  Set nodx = nodx.Next
Next

End Sub

Etapa4: Atribuindo Nós relacionados aos diretórios do sistema. Clicando em cada Nó teremos o caminho do diretório exibido na mensagem através da propriedade FullPath. (exibe o nome do Nó)

Private Sub Command4_Click()
Dim nodx As Node

Set TreeView1.ImageList = ImageList1
TreeView1.Nodes.Clear

'Insere um drive
Set nodx = TreeView1.Nodes.Add(, , , "c:", "Fechado")
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Inclui diretorio
Set nodx = TreeView1.Nodes.Add(nodx, tvwChild, , "Windows", "Fechado")
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

'Inclui outro diretorio
Set nodx = TreeView1.Nodes.Add(nodx, tvwChild, , "System", "Fechado")
nodx.ExpandedImage = "Aberto"
nodx.Expanded = True

End Sub

 Etapa5: Criando Nós e permitindo a expansão e contração do Nó. Ao clicar em cada Nó teremos uma mensagem indicando o nome do Nó. Os  evento Collapse e Expand permite a retração e expansão dos Nós.

O evento NodeCheck verifica o nó clicado e o evento NodeClick exibe o nome do Nó.

Private Sub Command5_Click()
Dim nodx As Node
Dim nodr As Node

Set TreeView1.ImageList = ImageList1
'limpa qualquer nó criado
TreeView1.Nodes.Clear

'exibe linhas
TreeView1.LineStyle = tvwTreeLines

'Exibindo caixa de verificacao
TreeView1.Checkboxes = True

'Inclui itens
Set nodx = TreeView1.Nodes.Add(, , , "Item 1", "Fechado")
Set nodx = TreeView1.Nodes.Add(, , , "Item 2")
Set nodx = TreeView1.Nodes.Add(, , , "Item 3")

'expande Nó
nodx.Expanded = True

Set nodr = TreeView1.Nodes.Add(nodx, tvwChild, , "Item 4")
nodr.Expanded = True

Set nodx = TreeView1.Nodes.Add(nodr, tvwChild, , "Item 5")
Set nodx = TreeView1.Nodes.Add(nodr, tvwChild, , "Item 6")
Set nodx = TreeView1.Nodes.Add(nodr, tvwChild, , "Item 7")

Set nodx = TreeView1.Nodes.Add(, , , "Item 8")
End Sub

------------------------------------------------------------------------------------------
Private Sub TreeView1_Collapse(ByVal Node As MSComctlLib.Node)
        MsgBox "Retraindo o Nó : " & Node.Text
End Sub

------------------------------------------------------------------------------------------
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
     MsgBox "Expandindo o Nó : " & Node.Text
End Sub

------------------------------------------------------------------------------------------
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
   If Node.Checked Then
        MsgBox "Nó " & Node.Text & " Verificado"
    Else
        MsgBox "Nó " & Node.Text & " Não Verficado"
    End If
End Sub
------------------------------------------------------------------------------------------

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    MsgBox Node.FullPath
End Sub

Bem , vamos mostrar agora algo realmente que seja útil , vamos mostra como usar o controle Treeview com um banco de dados onde iremos exibir os dados de uma tabela. Para isto vamos precisar de um banco de dados , e de uma tabela . A tabela deverá possuir uma estrutura adequada , de forma que possamos exibir os dados através do controle TreeView.

Vamos supor que queremos exibir os dados da tabela Alunos presente no banco de dados Access - escola.mdb. A estrutura da tabela Alunos é a seguinte:

Tabela Alunos - contém os dados dos alunos Tabela Filiais - Contém o nome das filiais da escola

A idéia é usar o controle Treeview para exibir os dados usando a seguinte  hierarquia : Filiais - > nome das filiais -> nome de cada classe que a filial possui -> nome dos alunos para cada classe. 

Vamos usar portanto a tabela Filiais para exibir o nome das filiais no TreeView. A tabela Alunos será usada para exibir os nomes das classes e dos alunos. Mãos a obra...

Desenho do formulário com o controle TreeView e ImageList Configuração do Controle ImageList

Agora basta inserir o código como indicado abaixo:

Seção General Declarations - define as variáveis usadas no projeto
Public rsAlunos As New ADODB.Recordset
Public rsFiliais As New ADODB.Recordset
Public cn As ADODB.Connection
Dim CodigoFilial As String
Dim NomeFilial As String
Dim classe As String
Dim mNode As Node
Evento Form Load - cria conexão com o banco de dados e os recordsets
Private Sub Form_Load()

On Error GoTo errFind

Set TreeView1.ImageList = ImageList1
Set cn = New ADODB.Connection
With cn
   .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\teste\Escola.mdb"
   .Open
End With

rsAlunos.Open "Select * from Alunos", cn, adOpenStatic, adLockOptimistic
rsFiliais.Open "Select * From Filiais", cn, adOpenStatic, adLockOptimistic

' Configura o TreeView
With TreeView1
  Set mNode = TreeView1.Nodes.Add(, , "Root", "Filiais", "Fechado")
  .Sorted = True
End With

Exit Sub

errFind:

If Err = -2147467259 Then
  Set cn = Nothing
  MsgBox "Arquivo nao localizado ", vbInformation, "Usando Treeview na pratica."
  Unload Me
Else
  MsgBox Err.Description
End If
End Sub
Evento Click do botão de comando - Criar Árvore de dados - Carrega o nome das filiais na árvore
Private Sub Command1_Click()

Do While Not rsFiliais.EOF
  TreeView1.Nodes.Add "Root", tvwChild, rsFiliais("Nome"), rsFiliais("Nome"), "Aberto"
  rsFiliais.MoveNext
Loop

End Sub
Código do Evento click do botão de comando - Preencher com os nomes das classes
Private Sub Command2_Click()
rsFiliais.MoveFirst

Do While Not rsFiliais.EOF
   NomeFilial = rsFiliais("nome")
   CodigoFilial = rsFiliais("codigo")
   Do While Not rsAlunos.EOF
      If rsAlunos("filial") = CodigoFilial Then
         If rsAlunos("classe") <> classe Then
            TreeView1.Nodes.Add NomeFilial, tvwChild, , rsAlunos("classe"), "Fechado"
         End If
     End If
     classe = rsAlunos("classe")
     rsAlunos.MoveNext
   Loop
   rsFiliais.MoveNext
   rsAlunos.MoveFirst
Loop

End Sub

O resultado da execução deste código é o seguinte:

 

Como exercício , que tal preencher as classes com os nomes dos alunos ??? 

Vou ficando por aqui... adios...  

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti