Visual Basic 6 - DataGrid, MSFlexGrid e alguns conceitos básicos.


Neste artigo estarei abordando alguns conceitos básicos ; vou mostrar como realizar algumas tarefas que podem ser simples para quem já tem uma boa noção da linguagem mas que podem ajudar muito quem esta começando. Neste artigo iremos mostrar :

  1. Como usar uma conexão ADO sem fazer referência a biblioteca - Microsoft ActiveX Data Object - no projeto
  2. Usar uma API para dar uma pausa na aplicação
  3. Usar um driver ODBC para uma conexão ADO
  4. Preencher um controle DataGrid no modo não vinculado (unbound)
  5. Preencher um controle MSFlexGrid
  6. Usar o controle Animation para exibir uma arquivo .avi
  7. Realizar uma busca dinâmica em uma base de dados e exibir o resultado nos controles Grids
  8. Uma nova maneira de nomear os controles em tempo de execução
  9. Abnr uma base de dados Access 2000
  10. Usar a ligação tardia - Late Binding.

Deu para notar que embora simples podemos extrair muita coisa da nossa aplicação. Vamos a trabalho...

Introdução

Vamos começar dando uma olhada na cara do projeto em sua fase de desenvolvimento. Veja o layout da aplicação abaixo:

- Os controles usados neste projeto são :
  1. 3 botões de opção :
    1. optNome
    2. optSetor
    3. optContato
  2. Um controle Animation - Animation1
  3. Dois controles Label - lblbusca e lblMSFlexGrid
  4. Um controle TextBox - txtBusca
  5. Dois botões de comando :
    1. cmdBusca
    2. cmdParar
  6. Um controle MSFlexGrid : MSFlexGrid1
  7. Um controle DataGrid : DataGrid1

O projeto possui um formulário chamado frmGrids.frm e um módulo chamado ModGrids.bas e acessa a base de dados Busca.mdb . (Esta base de dados é uma base de dados Access 2000 ). Iremos acessar os dados da tabela Employees cuja estrutura é a seguinte:

username
text
Department
text
ContacPerson
text

Vamos usar o arquivo Busca.avi , que consiste em uma animação de uma lanterna procurando algo , exibindo-o quando o usuário clicar no botão para efetuar uma pesquisa na base dados. Para isto vamos usar o controle Animation.

Vamos começar a comentar o código pelo arquivo - ModGris.bas :

1-) A seção - General Declarations - do módulo tem o seguinte código :

Option Explicit
'função API para dar uma pausa na aplicação
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'constantes usadas para nomear os controles
Public Const Cap1 = "Controles Grids no modo Não Vinculado com Busca"
Public Const Cap2 = "Digite Texto para Busca >>"
Public Const Cap3 = "Procurar"
Public Const Cap4 = "Sair"
Public Const Cap41 = "Parar"
Public Const Cap5 = "Empregados"
Public Const Cap6 = "Controle MSFlex Grid"
Public Const Cap7 = "Controle Data Grid "
Public Const Cap8 = "Busca por Nome"
Public Const Cap9 = "Busca por Setor"
Public Const Cap10 = "Busca por Contato"

'Variavel para o banco de dados
Public cnxnObj As Object
Public rstObj As Object

Esta seção geralmente contém as variávels que devem ser visíveis em todo o projeto. Ele começa começa com a declaração : Option Explicit ; esta declaração irá nos obrigrar a declarar todas as variáveis que vamos utilizar no projeto.

A seguir declaramos a função API - Sleep - ela é usada para dar uma pausa no processamento. O argumento da função é dado em milisegundos onde :  1000 milisegundos = 1 segundo

Definimos as constantes Publicas cap1 a cap10 atribuindo a cada uma os textos que serão usados para identificar os controles Labels e os botões de comando usados no projeto.

As variáveis públicas : cnxnObj e rstObj são declaradas com do tipo objeto e serão usadas para criar a conexão e recordset respectivamente. (Aqui usamos a ligação tardia, que será explicada mais adiante)

2-) A seguir veremos o código da rotina - Main(). Esta rotina será executa no início da aplicação. Definimos isto nas propriedades do projeto , opção Project do menu do VB opção : nome_projeto Properties opção : Startup Object.

Sub Main()
  Load frmGrids
  frmGrids.Show
End Sub
- Load frmGrids carrega o formulário : frmGrids

- frmgrids.Show - exibe o formulário carregado

3- O procedimento - AbrirBDAccess - cria uma conexão com o banco de dados - Busca.mdb.

Public Sub AbrirBDAccess()
Dim ConectaAccess As String
Dim strArquivo As String
Dim strLocal As String

strArquivo = "Busca.mdb"
strLocal = App.Path
Set cnxnObj = CreateObject("ADODB.Connection")
ConectaAccess = "Driver={Microsoft Access Driver (*.mdb)};" & _
                "Dbq=" & strArquivo & ";" & _
                "DefaultDir=" & strLocal & ";" & _
                "Uid=Admin;Pwd=;"

cnxnObj.Open ConectaAccess
End Sub

Observe que usamos a notação : Set cnxnObj = CreateObject("ADODB.Connection")

com isto não precisamos referênciar no projeto a biblioteca ADO . Para fazer isto tivemos que declarar a variável cnxnObj como sendo do tipo Object. A isto chamamos de ligação tardia. Como não sabemos o tipo de objeto que vamos utilizar usamos a declaração genérica. Leia mais sobre isto no artigo : VB - Automação OLE - Usando Early Binding e Late Binding.

A string de conexão ConectaAccess utiliza um driver ODBC para realizar a conexão : "Driver={Microsoft Access Driver (*.mdb)};"

Com isto criamos uma conexão a base de dados Access 2000 - busca.mdb. Para substituir o driver ODBC por um provedor OLE DB substitua a string de conexão ConectaAcces como indicado no quadro abaixo:

ConectaAccess = "Driver={Microsoft Access Driver (*.mdb)};" & _
"Dbq=" & strArquivo & ";" & _
"DefaultDir=" & strLocal & ";" & _
"Uid=Admin;Pwd=;"
Driver ODBC
ConectaAccess = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & strLocal & strArquivo Provedor OLE DB

Obs: A conexão usando um provedor OLE DB é mais rápida que usando um driver ODBC.

4- O procedimento - AbrirRecordsetAccess - cria um recordset do tipo ADO. Note que aqui também usamos o código: Set rstObj = CreateObject("ADODB.Recordset"). Para saber mais Leia o artigo: ADO - Otimizando a sua conexão nos detalhes.

Public Sub AbrirRecordSetAccess(strSQL As String)
   Set rstObj = CreateObject("ADODB.Recordset")
   rstObj.Open strSQL, cnxnObj, 1, 1, 1
End Sub

Agora vamos ao código do formulário - frmGrids :

1- Na seção General Declarations temos a declaração das variáveis usadas no formulário:

Option Explicit

Dim I As Integer
Dim strTextoBusca As String
Dim strBusca As String
Dim FNome As Boolean
Dim FSetor As Boolean
Dim FContato As Boolean

2- No evento Load do formulário atribuimos os textos de identificação aos controles ; abrimos o banco de dados ; abrimos o recordset passando a instrução SQL e preenchemos os grids - DataGrid e MSFlexGrid.

Private Sub Form_Load()
  'atribui os textos de identificação dos controles
  frmGrids.Caption = Cap1
  frmGrids.WindowState = 0
  lblBusca.Caption = Cap2
  cmdBusca.Caption = Cap3
  cmdParar.Caption = Cap4
  lblMsFlexGrid.Caption = Cap6
  lblDataGrid.Caption = Cap7
  Animation1.Visible = False
  optNome.Caption = Cap8
  optSetor.Caption = Cap9
  optContato.Caption = Cap10
  optNome.Value = True
' abre o banco de dados
Call AbrirBDAccess
Call AbrirRecordSetAccess("SELECT * FROM Employees Order By UserName")
Call PreencherMSFlexGrid
Call PreencherDataGrid

End Sub

3- Abaixo o código da rotina - PreencherMSFlexGrid - que irá preencher com dados o MSFlexGrid.

Sub PreencherMSFlexGrid()
 MSFlexGrid1.Cols = 4
 MSFlexGrid1.ColWidth(0) = 500
 MSFlexGrid1.TextMatrix(0, 0) = "Sr.No"
 For I = 0 To rstObj.Fields.Count - 1
   MSFlexGrid1.ColAlignment(I) = vbCenter
   MSFlexGrid1.ColWidth(I + 1) = 1500
   MSFlexGrid1.TextMatrix(0, I + 1) = rstObj.Fields(I).Name
 Next
 MSFlexGrid1.Rows = rstObj.recordcount + 1
 I = 1
 Do While Not rstObj.EOF
    MSFlexGrid1.TextMatrix(I, 0) = I
    MSFlexGrid1.TextMatrix(I, 1) = rstObj(0) 'username
    MSFlexGrid1.TextMatrix(I, 2) = rstObj(1) 'Department
    MSFlexGrid1.TextMatrix(I, 3) = rstObj(2) 'ContactPerson
    I = I + 1
    rstObj.MoveNext
 Loop
End Sub
  1. Definimos o Grid com quatro colunas - MSFlexGrid1.Cols=4
  2. Definimos a largura da primeira coluna (0) igual a 500 - MSFlexGrid1.ColWidth(0) = 500
  3. Atribuímos o nome do cabeçalho como sendo igual ao nome das colunas da tabela.
  4. O número de linhas é definida como sendo o no. de registros mais um - MSFlexGrid1.Rows = rstObj.recordcount + 1
  5. Percorremos o recordset - rstObj - e atribuimos os valores : username , department e contacPerson

Obs: para saber mais sobre as propriedades do MSFlexGrid leia o artigo: Utilizando o controle MSFlexGrid e MSHFlexGrid com ADO

4- Agora temos o código que preenche o DataGrid -PreencherDataGrid() - bem mais simples. Apenas damos nome ao cabeçalho de cada coluna e atribuimos o objeto recordset a propriedade DataSource do controle dando a seguir um Refresh.

Sub PreencherDataGrid()

DataGrid1.Caption = Cap5
DataGrid1.Columns.Add (0)

For I = 0 To rstObj.Fields.Count - 1
  DataGrid1.Columns(I).Caption = rstObj.Fields(I).Name
Next
Set DataGrid1.DataSource = rstObj
DataGrid1.Refresh
End Sub

5- O código do botão - Procurar - é dado abaixo :

Private Sub cmdBusca_Click()

On Error GoTo ErrorHandler ' tratamento de erros

If txtBusca = "" Or IsNumeric(txtBusca.Text) Then
   MsgBox "Informe um texto alfanumérico válido !", vbCritical, "Erro"
   txtBusca.Text = ""
   txtBusca.SetFocus
   Exit Sub
End If

If cmdParar.Caption = Cap4 Then
  cmdParar.Caption = Cap41
  Screen.MousePointer = vbHourglass

  Animation1.Visible = True
  Animation1.AutoPlay = True
  Animation1.Open App.Path & "/Busca.avi"
  Animation1.Play (10)
  Sleep (5000)

  strTextoBusca = Trim(txtBusca.Text)
  rstObj.Close
  Set rstObj = Nothing
  If FNome = True Then
     strBusca = "SELECT * FROM Employees where UserName Like '" & strTextoBusca & "%' Order By UserName"
     FSetor = False
     FContato = False
  End If
  If FSetor = True Then
     strBusca = "SELECT * FROM Employees where Department Like '" & strTextoBusca & "%' Order By Department"
     FNome = False
     FContato = False
  End If
  If FContato = True Then
      strBusca = "SELECT * FROM Employees where ContactPerson Like '" & strTextoBusca & "%' Order By ContactPerson"

      FNome = False
      FSetor = False
  End If

 Call AbrirRecordSetAccess(strBusca)
 MSFlexGrid1.Refresh
 Call PreencherMSFlexGrid
 DataGrid1.Refresh
 Call PreencherDataGrid

 Animation1.Visible = False
 Screen.MousePointer = vbDefault
 cmdParar.Caption = Cap4
End If
Exit Sub
ErrorHandler:  'inicio do tratamento de erros
  MsgBox "Erro  No. :" & Err.Number & vbCr & " Descrição :" & Err.Description
  Animation1.Visible = False
  Screen.MousePointer = vbDefault
  Resume ' retorna a execução para a mesma linha onde ocorreu o erro
  cnxnObj.Close
  Set cnxnObj = Nothing
End Sub

1- a primeira coisa que fazemos é ativar o tratamento de erros :- On Error GoTo ErrorHandler

2- a seguir verificamos se o usuário informou um valor válido para buscar :

If txtBusca = "" Or IsNumeric(txtBusca.Text) Then
   MsgBox "Informe um texto alfanumérico válido !", vbCritical, "Erro"
   txtBusca.Text = ""
   txtBusca.SetFocus
   Exit Sub
End If

3- Ao clicar no botão Procurar , usamos o controle Animation para exibir um video de uma lanterna procurando algo(arquivo busca.avi) ; o código é o seguinte:

1 Animation1.Visible = True
2 Animation1.AutoPlay = True
3 Animation1.Open App.Path & "/Busca.avi"
4 Animation1.Play (10)

5 Sleep (5000)
  1. Na linha 1 tornamos o controle animation1 visivel
  2. Na linha 2 iniciamos a execução do video
  3. Na linha 3 abrimos o arquivo de video - busca.avi
  4. Na linha 4 executamos o video 10 vezes

O Controle Animation utiliza os seguintes comandos para realizar suas operações básicas :

O comando Play possui ainda três argumentos : repeat , start e stop que determinam quantas vezes o arquivo será executado , em qual frame será iniciada a execução e onde a execução será finalizada. Se o argumento repeat não for informado o arquivo será executado de forma ininterrupta. Exemplos:

a - Animation1.Play (toca o arquivo de forma ininterrupta)

b - Animation1.Play 10, 5, 15 (executa o arquivo 10 vezes , do sexto ao decimo sexto frame)

4- O código abaixo irá construir a instrução SQL conforme o botão de opção que o usuário clicar: Nome , Setor ou Contato.

If FNome = True Then
  strBusca = "SELECT * FROM Employees where UserName Like '" & strTextoBusca & "%' Order By UserName"
  FSetor = False
  FContato = False
End If
If FSetor = True Then
  strBusca = "SELECT * FROM Employees where Department Like '" & strTextoBusca & "%' Order By Department"
  FNome = False
  FContato = False
End If
If FContato = True Then
 strBusca = "SELECT * FROM Employees where ContactPerson Like '" & strTextoBusca & "%' Order By ContactPerson"
 FNome = False
 FSetor = False
End If

5- A seguir abrimos o recordset usando a instrução SQL(strBusca) e preenchemos cada grid com os dados.

Call AbrirRecordSetAccess(strBusca)
MSFlexGrid1.Refresh
Call PreencherMSFlexGrid
DataGrid1.Refresh
Call PreencherDataGrid

6- Tornamos o controle Animation1 invisivel e atribuimos o texto definido em Cap4 ao botão de comando.

Animation1.Visible = False
Screen.MousePointer = vbDefault
cmdParar.Caption = Cap4

7- No tratamento de erros exibimos o número do erro e sua descrição , tornamos o controle Animation1 invisivel , retornamos para linha onde o erro ocorreu e fechamos os objetos Connection e recordset.

ErrorHandler: 'inicio do tratamento de erros
MsgBox "Erro No. :" & Err.Number & vbCr & " Descrição :" & Err.Description
Animation1.Visible = False
Screen.MousePointer = vbDefault

Resume ' retorna a execução para a mesma linha onde ocorreu o erro
cnxnObj.Close
Set cnxnObj = Nothing

Ao executar o projeto , informar um Nome e clicar no botão procurar teremos os seguinte resultado:

Iniciando a busca O resultado da busca

Moleza , não é mesmo ...até a próxima...

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?


  Gostou
?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti