VB6 - Tratamento de dados com ListView


 

Dos controles de lista, o ListView é um dos meus preferidos pela sua versatilidade e possibilidades de configuração e exibição dos dados.

 

Para ilustrar a aplicação do controle ListView e mostrar alguns de seus recursos neste artigo vou mostrar como exibir os dados de um banco de dados Access em um controle ListView. Na verdade o foco do artigo não é o acesso aos dados mas a configuração e formas de exibição do ListView.

 

Vou criar o banco de dados Escola.mdb que conterá duas tabelas : Alunos e MenuCores cuja estrutura é exibida abaixo:

 

Tabela que contém os dados dos alunos Tabela que contém as configurações para formatar o ListView

 

O projeto irá ser composto de dois formulários:

Ao executar o projeto logo será exibida a tela com a relação de alunos onde o usuário poderá configurar o modo de exibição dos dados pelo controle ListView alterando a cor , o tamanho  e o modo de exibição: negrito ou itálico.

 

Além disto poderá procurar e ordenar por Codigo ou Nome do Aluno. Poderá efetuar uma busca dinâmica de texto, a cada digitação de caractere os dados vão sendo filtrados e exibidos.

 

 

 

Ao selecionar uma linha da relação e clicar em um dos botões de comando o usuário poderá editar , incluir e deletar dados. Abaixo o formulário para edição de dados :

 

 

Temos aqui uma aplicação completa usada para manter dados de uma tabela. Vamos ver como funciona ???

 

A aplicação contém um módulo .bas onde foi definido a string de conexão com o banco de dados , o código do módulo alunos.bas é o seguinte:

 

Public cnn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public rsCor As New ADODB.Recordset

Public i As Integer
Public lst As ListItem

Public Sub Conectar()
   cnn.CursorLocation = adUseClient
   cnn.Open "provider=microsoft.jet.oledb.4.0;persist security info = false; data source = " & App.Path & "\escola.mdb;"
End Sub

Public Sub verifica_rs()
   If rs.State = 1 Then rs.Close
End Sub
Public Sub verifica_rsCor()
   If rsCor.State = 1 Then rsCor.Close
End Sub

 

No módulo temos a declaração das variáveis para que serão vistas em todo o projeto, bem como 3 rotinas:

Quando o projeto é executado o formulário AlunoLista.frm é carregado. No evento Load deste formulário temos o código :

 

Private Sub Form_Load()

Call Conectar

verifica_rs
rs.Open "select * from Alunos", cnn
rsCor.Open "select cor,bold,italic,tamanho from menucores where objeto = 'listaAlunos'", cnn

cmdCor.BackColor = rsCor(0)
ListaAlunos.ForeColor = rsCor(0)
ListaAlunos.Font.Bold = rsCor(1)
ListaAlunos.Font.Italic = rsCor(2)
ListaAlunos.Font.Size = rsCor(3)
cmdbold.FontBold = rsCor(1)
cmdItalic.FontItalic = rsCor(2)
cmdTamanho.Text = rsCor(3)
preenche_lista
End Sub

 

O código abre a conexão , verifica  e abre dois recordsets :

a seguir os dados do recordset rsCor são atribuidos ao ListView e a lista é preenchida com os dados da tabela.

 

O código da rotina preenche_lista é o seguinte :

 

Public Sub preenche_lista()

  'limpa a o controle ListView 
  ListaAlunos.ListItems.Clear
  'se não há registros então sai da rotina
  If rs.RecordCount = 0 Then Exit Sub
  
   'enquanto houver registros inclui os registros no ListView
   While Not rs.EOF
       
      Set lst = ListaAlunos.ListItems.Add(, , rs(0))
      
      For i = 1 To 5
        lst.SubItems(i) = rs(i)
      Next i
     rs.MoveNext
   Wend
   
End Sub

 

 

O código relacionado com a busca de texto , ordenação possuem o seguinte código:

 

Private Sub cmbOrdem_Click()
    txtFiltro
End Sub

Private Sub cmbProcurarPor_Click()
   txtFiltro
End Sub

Private Sub cmbOrdernarPor_Click()
   txtFiltro
End Sub

Private Sub txtProcurar_Change()
   txtFiltro
End Sub

 

a rotina txtFiltro é responsável pela ação de procura e ordenação. Vejamos a seguir o seu código:

 

Public Sub txtFiltro()

Dim procurarpor As String
Dim ordernarpor As String
Dim DASC As String
'se nada foi selecionado seleciona o primeiro item da lista
If cmbProcurarPor.ListIndex = -1 Then cmbProcurarPor.ListIndex = 0
If cmbOrdernarPor.ListIndex = -1 Then cmbOrdernarPor.ListIndex = 0
If cmbOrdem.ListIndex = -1 Then cmbOrdem.ListIndex = 0

'efetua a atribuição da opção de busca escolhida
If cmbProcurarPor.ListIndex = 0 Then
   procurarpor = "codigo"
ElseIf cmbProcurarPor.ListIndex = 1 Then
   procurarpor = "nome"
ElseIf cmbProcurarPor.ListIndex = 2 Then
   procurarpor = "email"
End If

'efetua a atribuição da opção de ordenação escolhida
Select Case cmbOrdernarPor.ListIndex
Case 0
   ordernarpor = "codigo"
Case 1
   ordernarpor = "nome"
Case 2
   ordernarpor = "email"
End Select

Select Case cmbOrdem.ListIndex
Case 0
  DASC = "asc"
Case 1
  DASC = "desc"
End Select

verifica_rs
'monta a instrução SQL conforme a opção do usuário
rs.Open "select * from Alunos where " & procurarpor & " like '" & txtProcurar & "%' order by " & ordernarpor & " " & DASC, cnn

preenche_lista
End Sub

 

A rotina para alterar a cor é seguinte , ela usa o controle CommonDialog para exibir uma paleta de cores onde a seleção do usuário é armazenada na tabela menucores.

 

Private Sub cmdCor_Click()

On Error GoTo trataerro
cmdlg1.ShowColor
ListaAlunos.ForeColor = cmdlg1.Color
cmdCor.BackColor = cmdlg1.Color
cnn.Execute "update menucores set cor = '" & cmdlg1.Color & "' where objeto = 'listaAlunos'"
Exit Sub
trataerro:
verifica_rsCor
rsCor.Open "select cor from menucores where objeto = 'listaAlunos'", cnn

ListaAlunos.ForeColor = rsCor(0)
cmdCor.BackColor = rsCor(0)
End Sub

 

Vejamos agora o código dos botões : cmdTamanho,cmdBold e cmdItalic que alteram a formatação da fonte para o ListView

 

Private Sub cmdItalic_Click()
If ListaAlunos.Font.Italic = False Then
    ListaAlunos.Font.Italic = True
    cnn.Execute "update menucores set italic='true' where objeto = 'listaAlunos'"
   cmdItalic.FontItalic = True
Else
    ListaAlunos.Font.Italic = False
    cnn.Execute "update menucores set italic='false' where objeto = 'listaAlunos'"
    cmdItalic.FontItalic = False
End If
End Sub
Private Sub cmdTamanho_Click()
  cnn.Execute "update menucores set tamanho = '" & cmdTamanho.Text & "' where objeto = 'listaAlunos'"
  ListaAlunos.Font.Size = cmdTamanho.Text
End Sub

Private Sub cmdbold_Click()
If ListaAlunos.Font.Bold = False Then
  ListaAlunos.Font.Bold = True
  cnn.Execute "update menucores set bold='true' where objeto = 'listaAlunos'"
  cmdbold.FontBold = True
Else
  ListaAlunos.Font.Bold = False
  cnn.Execute "update menucores set bold='false' where objeto = 'listaAlunos'"
  cmdbold.FontBold = False
End If
End Sub

 

As rotinas para incluir , editar e excluir dados estão a seguir :

 

Private Sub cmdDeletar_Click()

If MsgBox("Deseja excluir o registro : " & vbCrLf & vbCrLf & ListaAlunos.SelectedItem.ListSubItems(1).Text & _ 
vbCrLf & ListaAlunos.SelectedItem.ListSubItems(2).Text & "?", vbYesNo) = vbYes Then

   cnn.Execute "delete from Alunos where codigo = '" & ListaAlunos.SelectedItem.Text & "'"
   rs.Requery 1
   preenche_lista
End If
End Sub

Private Sub CmdEditar_Click()
If ListaAlunos.ListItems.Count = 0 Then Exit Sub
Aluno_edicao.data(0) = ListaAlunos.SelectedItem.Text
For i = 1 To 4
   Aluno_edicao.data(i).Text = ListaAlunos.SelectedItem.ListSubItems(i).Text
Next i
Aluno_edicao.cmbSexo = ListaAlunos.SelectedItem.ListSubItems(5).Text
Aluno_edicao.chave = ListaAlunos.SelectedItem.Text
Aluno_edicao.data(0).Enabled = False
Aluno_edicao.mode = "editar"
Load Aluno_edicao
Aluno_edicao.Show 1
End Sub
 
Private Sub CmdIncluir_Click()

Aluno_edicao.mode = "incluir"

For i = 0 To 4
    Aluno_edicao.data(i) = ""
Next i

Load Aluno_edicao
Aluno_edicao.Show 1

End Sub

 

No formulário aluno_edicao.frm temos o código exibido para as rotinas Salvar e Cancelar:

 

Private Sub cmdCancela_Click()
   data(0).Enabled = True
   Unload Me
End Sub
Private Sub CmdSalva_Click()

On Error GoTo trataerro
If Trim(data(0)) = "" Then
   MsgBox "Informe o código do aluno.", vbInformation + vbCritical, "Dados Inválidos!"
   data(0).SetFocus
   Exit Sub
ElseIf Trim(data(1)) = "" Then
   MsgBox "Informe o Nome.", vbInformation + vbCritical, "Dados Inválidos!"
   data(1).SetFocus
Exit Sub
   ElseIf Trim(data(2)) = "" Then
   MsgBox "Informe o Sobrenome.", vbInformation + vbCritical, "Dados Inválidos!"
   data(2).SetFocus
   Exit Sub
ElseIf Trim(cmbSexo.Text) = "" Then
   MsgBox "Informe o sexo.", vbInformation + vbCritical, "Dados Inválidos!"
   cmbSexo.SetFocus
Exit Sub

End If

If UCase(mode) = "EDITAR" Then
   cnn.Execute "update Alunos set codigo = '" & data(0) & "', nome = '" & data(1) & "', email = '" & data(2) & "',telefone = '" & _ 
 data(3) & "', endereco = '" & data(4) & "', sexo = '" & cmbSexo.Text & "' where codigo = '" & chave & "'"
   data(0).Enabled = True
ElseIf UCase(mode) = "INCLUIR" Then
  cnn.Execute "insert into Alunos values('" & data(0) & "','" & data(1) & "','" & data(2) & "','" & data(3) & "','" & data(4) &_ 
 "','" & cmbSexo.Text & "')"
End If

rs.Requery 1
relacaoAlunos.preenche_lista
Unload Me

Exit Sub

trataerro:
MsgBox Err.Number & vbCrLf & Err.Description

End Sub

 

Perceba que conforme o parâmetro recebido (EDITAR ou INCLUIR) temos a execução de um SQL para atualizar ou incluir dados na tabela.

 

Enfim um projeto simples mas muito funcional onde você pode aprender como incrementar a exibição de seus dados usando ListView.

 

Pegue o projeto aqui :  listViewCor.zip

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

 


José Carlos Macoratti