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:
VB.6 - Agenda com ListView e TreeView e mais alguns recursos
VB - trabalhando com formatação em campos Memo de banco de dados
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 |
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 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 evento Click - que deverá expandir ou retrair um Nó quando o usuário clicar no TreeView
O evento NodeClick - que deverá verificar qual a Tag de identificação clicada e carregar o respectivo arquivo RTF no controle RichTextBox.
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 |
A seguir uma visão da execução do projeto:
Sugestão para melhorar o projeto:
Construir uma rotina para carregar o TreeView a partir de um arquivo texto ou banco de dados de forma a reduzir o código e torná-lo mais elegante.
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: