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:
aluno_edicao.frm - permite efetuar a manutenção dos dados dos alunos (inclui, alterar, excluir)
AlunoLista.frm - exibe os dados dos alunos usando o ListView.
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:
Conectar() - faz a conexão com o banco de dados escola.mdb
Verfica_rs() - verifica o estado do recordset rs
verficia_rsCor() - verifica o estado do recordset rsCor
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 :
rs - recordset que contém todos os dados dos alunos
rsCor - que contém os dados da configuração atual para o ListView na tabela menucores
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() |
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