VB - Usando TreeView e RichTextBox


Neste artigo vou mostrar como usar o controle TreeView e o controle RichTextBox de forma conjugada para criar uma aplicação onde o usuário seleciona um item exibido no controle TreeView e um arquivo correspondente é carregado e exibido no controle RichTextBox.

 

Eu não vou repetir os conceitos sobre os controles TreeView e RichTextBox, se você ainda não conhece como funcionam estes controles leia os artigos a seguir:

Esta aplicação irá utilizar arquivos no formato RichtText(RTF) que podem ser criados no Word ou WordPad. Foram criados 28 arquivos RTF com a extensão .file , nomeados sequencialmente como 1.file, 2.file , etc. , com o conteúdo relacionado a cada provedor OleDb. Os arquivos foram colocados em uma pasta chamada Suporte.

 

Inicie um novo projeto no VB do tipo StandardEXE e no formulário principal inclua os controles : TreeView , RichtTextBox e ImageList conforme a figura abaixo:

 

 

O controle ImageList irá conter as imagens usadas no controle TreeView definidas conforme abaixo:

 

 

Na configuração do TreeView, dentre outras coisas, você deverá vincular o controle ao ImageList usado:

 

 

Usando o Menu Editor (CTRL+E) crie o menu da aplicação conforme abaixo:

 

 

Nesta aplicação vou usar o recurso de manter o formulário sempre por cima das demais janelas para isto vamos usar a API - SetWindowPos. Declare então na seção General/Declarations do formulário a API conforme a seguir :

 

'define a API usada para ativar o formulário sempre no topo
Private Declare Function SetWindowPos Lib "user32" _
                        (ByVal hwnd As Long, _
                        ByVal hWndInsertAfter As Long, _
                        ByVal X As Long, _
                        ByVal Y As Long, _
                        ByVal cX As Long, _
                        ByVal cY As Long, _
                        ByVal wFlags As Long) As Long

 

Outro recurso que vamos usar será a chamada da página via URL www.macoratti.net. Para isto vamos usar a API ShellExecute. Sua declaração deve ser feita também na seção General/Declarations do formulário como abaixo:

 

'define a função para executar programas a partir do VB
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                          (ByVal hwnd As Long, _
                          ByVal lpOperation As String,_
                          ByVal lpFile As String, _

                          ByVal lpParameters As String, _

                          ByVal lpDirectory As String, _

                          ByVal nShowCmd As Long) As Long

 

O TreeView será carregado no evento Load do formulário e o código é o seguinte :

 

Private Sub Form_Load()

'chama função para colocar a janela sempre sobre as demais janelas
Call ativaJanelaTopo(Me.hwnd, True)
'define um No
Dim No As Node

Set No = TreeView1.Nodes.Add(, , "OlePro", "OLE DB Provider", 1, 1)
'define a tag raiz
No.Tag = "OlePro"

'não expande os nós
No.Expanded = False

'----- define o nó filhol de 1-5
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "actvS", "para Active Directory Service", 2, 2)
No.Tag = "actvS"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "adVTG", "para Advantage", 2, 2)
No.Tag = "adVTG"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "as/400", "para AS/400 (IBM)", 2, 2)
No.Tag = "as/400"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "vSam", "para AS/400 e VSAM (Microsoft)", 2, 2)
No.Tag = "vSam"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "comServer", "para Commerce Server", 2, 2)
No.Tag = "comServer"
'----- define o nó filho de 6-10
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "db2MS", "para DB2 (Microsoft)", 2, 2)
No.Tag = "db2MS"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "dtsPackgs", "para DTS Packages", 2, 2)
No.Tag = "dtsPackgs"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "xChange", "para Exchange", 2, 2)
No.Tag = "xChange"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "xCell", "para Excel", 2, 2)
No.Tag = "xCell"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "inServer", "para Index Server", 2, 2)
No.Tag = "inServer"
'----- define o nó filho de 11-15
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "netPub", "para Internet Publishing", 2, 2)
No.Tag = "netPub"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "msJet", "para Microsoft Jet", 2, 2)
No.Tag = "msJet"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "paraMSProj", "para Microsoft Project", 2, 2)
No.Tag = "paraMSProj"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "SQL", "para mySQL", 2, 2)
No.Tag = "SQL"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "odbcDBS", "para ODBC Databases", 2, 2)
No.Tag = "odbcDBS"
'----- define nós filho de 16-20
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "olapSRVS", "para OLAP Services", 2, 2)
No.Tag = "olapSRVS"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "oracleMS", "para Oracle (from Microsoft)", 2, 2)
No.Tag = "oracleMS"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "oracleORCL", "para Oracle (from Oracle)", 2, 2)
No.Tag = "oracleORCL"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "prSV", "para Pervasive", 2, 2)
No.Tag = "prSV"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "smpleProvider", "para Simple Provider", 2, 2)
No.Tag = "smpleProvider"
'----- define nós filho de 21-25
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "sqlBASE", "para SQLBase", 2, 2)
No.Tag = "sqlBASE"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "sqlSRV1", "para SQL Server", 2, 2)
No.Tag = "sqlSRV1"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "sqlSRV2", "para SQL Server via SQLXMLOLEDB", 2, 2)
No.Tag = "sqlSRV2"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "asa", "para Sybase Adaptive Server Anywhere (ASA)", 2, 2)
No.Tag = "asa"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "ase", "para Sybase Adaptive Server Enterprise (ASE) ", 2, 2)
No.Tag = "ase"
'----- define os nós filhos de 25-30
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "txt", "para Text Files", 2, 2)
No.Tag = "txt"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "unvData", "para UniData e UniVerse", 2, 2)
No.Tag = "unvData"
Set No = TreeView1.Nodes.Add("OlePro", tvwChild, "vFX", "para Visual FoxPro", 2, 2)
No.Tag = "vFX"
RichTextBox1.LoadFile App.Path & "\Suporte\intro.file"
End Sub

 

 

No código acima estou definindo os Nós e atribuindo um nome e uma identificação para a Tag de forma a poder saber qual Nó o usuário irá selecionar.

 

Existem dois eventos do controle TreeView que devemos tratar:

O primeiro evento possui o seguinte código :

 

Private Sub TreeView1_Click()
   If TreeView1.Nodes.Item("OlePro").Expanded = False Then RichTextBox1.LoadFile App.Path & "\Suporte\intro.file"

End Sub

 

Como nesta aplicação temos somente uma raiz e vários Nós filhos vinculados a ela tenho apenas que verificar se a raiz esta expandida, e, neste caso carregar o arquivo intro.file

 

O evento NodeClick estamos verificando qual Nó foi clicado e carregando o seu respectivo arquivo.

 

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Select Case Node.Key
    '----- par a nó pai
    Case "OlePro"
        RichTextBox1.LoadFile App.Path & "\Suporte\intro.file"
    '----- para o nó filho de 1-10
    Case "actvS"
        RichTextBox1.LoadFile App.Path & "\Suporte\1.file"
    Case "adVTG"
        RichTextBox1.LoadFile App.Path & "\Suporte\2.file"
    Case "as/400"
        RichTextBox1.LoadFile App.Path & "\Suporte\3.file"
    Case "vSam"
        RichTextBox1.LoadFile App.Path & "\Suporte\4.file"
    Case "comServer"
        RichTextBox1.LoadFile App.Path & "\Suporte\5.file"
    Case "db2MS"
        RichTextBox1.LoadFile App.Path & "\Suporte\6.file"
    Case "dtsPackgs"
        RichTextBox1.LoadFile App.Path & "\Suporte\7.file"
    Case "xChange"
        RichTextBox1.LoadFile App.Path & "\Suporte\8.file"
    Case "xCell"
        RichTextBox1.LoadFile App.Path & "\Suporte\9.file"
    Case "inServer"
        RichTextBox1.LoadFile App.Path & "\Suporte\10.file"
    '----- para nós filho de 11-20
    Case "netPub"
        RichTextBox1.LoadFile App.Path & "\Suporte\11.file"
    Case "msJet"
        RichTextBox1.LoadFile App.Path & "\Suporte\12.file"
    Case "forMSProj"
        RichTextBox1.LoadFile App.Path & "\Suporte\13.file"
    Case "SQL"
        RichTextBox1.LoadFile App.Path & "\Suporte\14.file"
    Case "odbcDBS"
        RichTextBox1.LoadFile App.Path & "\Suporte\15.file"
    Case "olapSRVS"
        RichTextBox1.LoadFile App.Path & "\Suporte\16.file"
    Case "oracleMS"
        RichTextBox1.LoadFile App.Path & "\Suporte\17.file"
    Case "oracleORCL"
        RichTextBox1.LoadFile App.Path & "\Suporte\18.file"
    Case "prSV"
        RichTextBox1.LoadFile App.Path & "\Suporte\19.file"
    Case "smpleProvider"
        RichTextBox1.LoadFile App.Path & "\Suporte\20.file"
    '----- para nós filho de 21-28
    Case "sqlBASE"
        RichTextBox1.LoadFile App.Path & "\Suporte\21.file"
    Case "sqlSRV1"
        RichTextBox1.LoadFile App.Path & "\Suporte\22.file"
    Case "sqlSRV2"
        RichTextBox1.LoadFile App.Path & "\Suporte\23.file"
    Case "asa"
        RichTextBox1.LoadFile App.Path & "\Suporte\24.file"
    Case "ase"
        RichTextBox1.LoadFile App.Path & "\Suporte\25.file"
    Case "txt"
        RichTextBox1.LoadFile App.Path & "\Suporte\26.file"
    Case "unvData"
        RichTextBox1.LoadFile App.Path & "\Suporte\27.file"
    Case "vFX"
        RichTextBox1.LoadFile App.Path & "\Suporte\28.file"
End Select
End Sub

 

 

A carga é feita usando o método Load do controle RichTextBox.

 

Ficou faltando apenas a função ativaJanelaTopo que usa a API SetWindowPos para posicionar a janela sobre as demais.

 

Private Function ativaJanelaTopo(hwnd As Long, blnTopOrNormal As Boolean) As Long
    Dim SWP_NOMOVE
    Dim SWP_NOSIZE
    Dim FLAGS
    Dim HWND_TOPMOST
    Dim HWND_NOTOPMOST
    
    SWP_NOMOVE = 2
    SWP_NOSIZE = 1
    FLAGS = SWP_NOMOVE Or SWP_NOSIZE
    HWND_TOPMOST = -1
    HWND_NOTOPMOST = -2
    
    If blnTopOrNormal = True Then 'torna a janela o topo
        SetTopWindow = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
    Else    'torna a janela normal
        SetTopWindow = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
        SetTopWindow = False
    End If
End Function

 

 

Ao encerrar a aplicação, no evento Unload  do formulário, temos o código abaixo que pergunta ao usuário se ele deseja acessar o site www.macoratti.net . Em caso positivo chamamos a função ativaURL passando a URL desejada.

 

Private Sub Form_Unload(Cancel As Integer)

Dim strMsg As String
strMsg = "Deseja acessar o site " & vbCrLf & "www.macoratti.net : quase tudo sobre Visual Basic...."

If MsgBox(strMsg, vbQuestion + vbYesNo, "Acesso a Macoratti.net") = vbYes Then
 ativaURL "http://www.macoratti.net", Me.hwnd
End If

End Sub

 

A rotina ativaURL usa a API ShellExecute já declarada para chamar a URL desejada.(Você precisa esta conectado...)

 

Public Function ativaURL(url As String, fonteHWND As String)

'se houver qualquer erro continua
On Error Resume Next

Dim vaiParaURL
vaiParaURL = ShellExecute(fonteHWND, vbNullString, url, "", vbNullString, 1)

End Function

 

Para encerrar faltou o código que marca/desmarca a opção do menu Arquivo - Formulário sempre no Topo - que chama a rotina ativaJanelaTopo se a opção estiver marcada.

 

Private Sub mniAOT_Click()

'marca/desmarca a opção do menu
Me.mniAOT.Checked = Not Me.mniAOT.Checked = True

If Me.mniAOT.Checked = True Then
     Call ativaJanelaTopo(Me.hwnd, True)
Else
    Call ativaJanelaTopo(Me.hwnd, False)
End If

End Sub

 

A seguir uma visão da execução do projeto:

 

 

Sugestão para melhorar o projeto:

Pegue o projeto completo aqui : oledb.zip

 

Eu sei, é apenas VB, mas eu gosto  !!!

 

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