Utilizando o controle MSFlexGrid e MSHFlexGrid com ADO

  1. Configurando o MSFlexGrid
  2. Vinculando o MSFlexGrid a uma fonte de dados
  3. Usando o MSHFlexGrid com ADO Data Control
  4. Usando o MSHFlexGrid sem ADO Data Control
  5. Alterando, Incluido e excluindos dados no MSFlexGrid via Código

A apresentação da informação na forma de linhas e colunas é muito usada atualmente. Desde a planilha eletrônica até os processadores de texto parece que fica mais fácil visualizar os dados quando apresentados neste formato. Eu particularmente me sinto muito confortável tendo uma visão ampla dos dados. Naturalmente a utilização ou não deste recurso vai depender da ocasião e do tipo de projeto com qual estamos trabalhando.

Atualmente o Visual Basic fornece dois controles com os quais podemos apresentar os dados no formato de linhas e colunhas, o famoso grid : O Controle DBGrid que permite editar e visualizar o conteudo de uma base de dados e o controle MSFlexGrid que pode servir também a propósitos mais genéricos.

Nosso objetivo será focar o controle MSFlexGrid e aprender a trabalhar com ele usando a ADO. Veremos do que ele é capaz de fazer.

O MSFlexGrid pode:

  1. Mostrar texto e imagens em suas células
  2. Ordernar a informação em suas linhas e colunhas permitindo uma visualização harmoniosa
  3. Congelar linhas e colunhas
  4. Fornecer nome ao cabeçalho das linhas
  5. Colorir as células individualmente de acordo com um critério
  6. Mesclar células

Configurando o MSFlexGrid

A primeira coisa a fazer para usar o MSFlexGrid é adicioná-lo a caixa de ferramentas, visto que ele não é um objeto padrão do Visual Basic. Para fazer isto basta selecionar a opção Project do menu é a seguir clicar na opção Components ; surge a tela da figura 1.0 mostrada a seguir, a seguir selecione o componente Microsoft FlexGrid Control 6.0. Pronto , o objeto MSFlexGrid é visualizado a seguir na caixa de ferramentas (Fig 2.0). Ele está pronto para ser utilizado em seus projetos. Basta você fornecer um nome para identificá-lo e configurar sua aparência e comportamento.

Fig 1.0 Fig 2.0

Assim podemos definir as seguines propriedades para definir a aparência do MsFlexGrid.

A figura abaixo mostra um formulário com um controle MsFlexGrid , exibindo o conteúdo da tabela Authors da base de dados biblio.mdb. A propriedade FixedCols foi definida como zero e FixedRows como 1.

Se o número de linhas for maior que o tamanho da área definida pelo controle , as barras de rolagem permitem a movimentação vertical ou horizontal se for o caso.
Fig 3.0 - O controle MsFlexGrid  

O controle permite configurar as cores de diversas formas , na tabela abaixo temos um resumo:

Background Color (Cor de Fundo) Foreground Color (Cor de Frente) Uso das cores
BackColor ForeColor Controla a cor das células padrão do grid, ou seja, aquelas que não fazem parte das linhas ou colunas fixas e que não são selecionadas.
BackColorFixed ForeColorFixed Controla a cor do cabeçalho das células nas linhas e colunas fixas.
BackColorSel ForeColorSel Controla a cor das células que estão selecionadas.
BackColorBkg N/A Controla a cor do espaço não ocupado pelas células.
CellBackColor CellForeColor Controla a cor de uma célula individual . (Pode ser usada somente em tempo de execução.)

A configuração da fonte das células é definida pela propriedade Font do grid, e podemos formatar as fontes usadas para células individuais conforme as seguintes propriedades:

As configurações afetam somente a célula atual ou o grupo de células selecionadas.

Para alterar a aparência de uma célula individual usamos as propriedades Color e Font juntamente com as propriedades Row e Col . Assim o exemplo a seguir selecionar a célula na linha 3 , coluna 4 e então altera a fonte para Vermelha e em Negrito.(Aqui o controle foi definido com o nome de flex_tst.)

flex_tst.Row = 3
flex_tst.Col = 4
flex_tst.Text = "Bold Font"
flex_tst.CellFontBold = True
flex_tst.CellForeColor = vbRed

Podemos também configurar as cores das linhas que compõem o grid, usamos para isso as seguintes propriedades:

Vejamos a seguir as propriedades que alteram o comportamento do controle MsFlexgrid durante a execução:

Vinculando o MsFlexGrid a uma fonte de dados

Uma das grandes utilidades do controle MsFlexGrid é permitir a visualização do conteúdo de tabelas e do resultado de consultas SQL . Basta fazer a vinculação do controle com a fonte de dados e os dados serão exibidos , mas não será permitida a atualização direta dos dados no Grid.

Para exibir dados usando o MsFlexGrid faça o seguinte:

  1. Inicie um novo projeto no Visual Basic e adicione o controle MsFlexFrid a caixa de ferramentas
  2. Insira um controle Data Control no formulário
  3. Defina a propriedade DatabaseName do controle de dados usando o nome do banco de dados que deseja acessar.
  4. Defina a propriedade RecordSource usando o nome da tabela ou consulta (instrução SQL) a qual deseja exibir.
  5. Adicione o controle MsFlexGrid ao formulário
  6. Defina a propriedade DataSource do MsFlexGrid informando o nome do controle de dados que você adicionou anteriormente ao formulário. Pronto Execute o projeto.
  7. Veja abaixo um exemplo usando a base de dados Biblio.mdb e a tabela Authors
Fig 4.0 - MsFlexGrid e Data Control no Projeto Fig 5.0 - Projeto após a execução (F5) Fig 6.0- Propriedade DataSource do MsFlexGrid
O código configurando as propriedades DataBaseName e RecordSource do controle de dados
Private Sub Form_Load()
With Data1
  .DatabaseName = "C:\Arquivos de Programas\Microsoft Visual Studio\VB98\Biblio.mdb"
  .RecordSource = "Authors"
End With
End Sub

Eu usei codigo para configurar as propriedades DataBaseName e RecordSource mas você pode configurá-las diretamente no controle.( Naturalmente o controle Data Control poderia ter a sua propriedade Visible definida para False.)

Bem , você deve estar se perguntando - "mas aonde esta a ADO ...". Calma vamos chegar lá.

Usando o controle MSHFlexGrid com ADO

O controle MSHFlexGrid tem a mesma funcionalidade do controle MSFlexGrid com a vantagem de poder exibir recordsets hierarquicos - tabelas relacionadas que são exibidas hierarquicamente.Além disto podemos usá-lo com o controle vinculado ADO Data Control. É o que veremos a seguir:

A primeira coisa a fazer e inserir os controles MSHFlexGrid e ADO Data Control na caixa de ferramentas. Veja abaixo:

Fig 7.0 - O Controle MSHFlexGrid sendo inserido na caixa de ferramentas Fig 8.0- A caixa de ferramentas com os controles já inseridos

Agora siga o roteiro :

  1. Inicie um novo projeto no Visual Basic e adicione os controles MSHFlexGrid e ADO Data Control como na figura
  2. A seguir configure o controle ADO Data Control para acessar a base de dados Biblio.mdb e a tabela Authors.(Veja como fazer em Usando os objetos de Controles Vinculados da ADO)
  3. Finalmente configura a propriedade DataSource do MSHFlexGrid indicando o nome do ADO Data Control usado.
Fig 9.0 - Os controles no projeto Fig 10 - O projeto em tempo de execução

Usando o MSHFlexGrid sem um ADO Data Control

Agora aqui vai um informação importante: Você pode usar o MSHFlexGrid para exibir dados sem necessáriamente vinculá-lo a um ADO Data Control . Vejamos como fazer isso no exemplo a seguir:

Private Sub Form_Load()
 Dim cnn As New ADODB.Connection
 Dim rst As New ADODB.Recordset
 
 cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\escola\escola.mdb"
 rst.Open "Select nome,telefone From tblalunos ", cnn, adOpenKeyset, adLockPessimistic
 
 datagrid.ColWidth(0) = 200
 datagrid.ColWidth(1) = 3000
 datagrid.ColWidth(2) = 1500

 Set datagrid.DataSource = rst
 
 rst.Close
End Sub

Inicieno VB crie um projeto padrão. A seguir referencie o controle MSHFlexGrid no projeto e inclua o controle no seu formulário padrão (dê a ele o nome de datagrid) . Clique duas vezes no formulário e digite o código mostrado acima no evento Load do formulário. Explicando:

  1. Declaramos uma variável para a conexão ( Dim cnn As New ADODB.Connection)
  2. Declaramos uma variável do tipo Recordset ( Dim rst As New ADODB.Connection )
  3. Abrimos a conexão com a base de dados (voce pode usar qualquer uma - cnn.Open )
  4. Criamos um Recordset (rst.open ) selecionando da tabela tblalunos da base escola.mdb o nome e o telefone.(Select nome,telefone From tblalunos)
  5. Configuramos a largura das colunas do DataGrid. (DataGrid.ColWidth(n) - a primeira coluna tem o índice zero)
  6. E, a linha que faz todo o trabalho( Set datagrid.DataSource = rst ) , atribuímos o Recordset criado á propriedade DataSource do MSHFlexGrid.
  7. Veja abaixo o formulário em tempo de projeto e o resultado do processamento:
Formulário com o Controle MSHFlexGrid Projeto em execução

Se quiser pode pegar o projeto clicando aqui -> flex_ado.zip ( 12 Kb)

MSFlexGrid : Alterando, Incluindo e Excluindo dados via código

Muitas das propriedades do MSFlexGrid de que já falamos podem ser configuradas via código, e agora veremos outras propriedades que usaremos para determinar e alterar o conteúdo de uma célula. Na verdade quando usamos este controle uma das tarefas mais comuns é justamente ter que determinar ou mudar o conteúdo de uma célula do grid. Se você considerar que o conteúdo de uma célula pode representar valores numéricos , texto , datas e valores monetários deve ficar atento para as conversões que necessariamente vai ter que fazer para tratar com a informação correta.

Existem três propriedades que podemos usar para determinar e atribuir valores a uma célula no MSFlexGrid : Text, TextArray e TextMatrix. Vejamos a seguir cada uma delas.

Text - Essa propriedade retorna o contéudo da célula do grid, e, você define a célula usando as propriedades Row e Col. Considerando que o valor inicial para essas propriedades é zero, ou seja , quando Row=0 e Col=0 estaremos na primeira linha e primeira coluna do grid. Assim, se para determinar o conteúdo de uma célula primeiro definimos os valores correspondentes de Row e Col para a célula e a seguir atribuimos a uma variável a propriedade Text da célula.

Determinando o Conteúdo da célula da terceira linha e segunda coluna:

Dim Conteudo as string
flxgrid.Row = 3
flxgrid.Col = 2
Conteudo = flxgrid.Text

Ao usar a propriedade Text as células afetadas vão depender da configuração da propriedade FillStyle e da seleção que o usuário efetuar. Se for selecionda somente uma célula a propriedade Text retorna o valor daquela célula. Se várias células forem selecionadas Text irá retornar o valor da célula atual se FillStyle estiver definido como 0. Se FillStyle estiver definida como 1 , Text irá retornar o valor de todas as células selecionadas. Embora simples de usar a propriedade Text somente retorna o valor do conteúdo da célula atual , e se quisermos processar várias células teremos que definir antes os valores de Row e Col para cada célula.

TextArray - Esta propriedade fornece outra maneira de definir/retornar o valor de uma célula, pois pode ser usada para retornar o valor de qualquer célula , e não somente o valor da célula atual. Para trabalhar com múltiplas células esta propriedade é mais adequada que a propriedade Text.

A propriedade TextArray usa um índice para especificar a célula desejada ; este índice é obtido ao multiplicarmos o número da linha escolhida pelo número de colunas no grid adicionando a seguir a coluna escolhida. Abaixo exibimos o sistema de numeração usado pelo índice:

Para retornar o valor da célula da terceira coluna da segunda linha é dado pelo seguinte código:

Coluna_Escolhida = 2
Linha_Escolhida = 1
Valor_Retornado = Grid.TextArray(Linha_Escolhida * Grid.Cols + Coluna_Escolhida)

Obs: Note que a primeira coluna e a primeira linha são  identificadas pelo número 0

TextMatriz - Esta propriedade utiliza um índice com dois argumentos : o índice da linha e o índice da coluna desejada. Esta propriedade é bem mais fácil de usar que as duas anteriores. O código para retornar o valor da célula da terceira coluna e da segunda linha é dado abaixo:

Valor_Retornado= Grid.TextMatrix(1,2)

Vejamos um exemplo usando algumas das propriedades já vistas para inserir valores nas células . O projeto usa os dois formulários exibidos a seguir:

 
Formulário - frmMain - Exibe os Valores no Grid   formulário - frmAdd - Inclui Valores no MsFlexGrid

O código do formulário - FrmMain é o seguinte:

Option Explicit
Private Sub cmdIncluir_Click()
  frmAdd.Show
End Sub
Private Sub cmdSair_Click()
  End
End Sub
Private Sub cmdRemover_Click()
 If MsgBox("Confirma a exclusão desta linha ? ", vbYesNo) = vbYes Then
    grdestoque.RemoveItem (grdestoque.Row)
 End If
End Sub
Private Sub Form_Load()
  ' configura largura das colunas
  grdestoque.ColWidth(0) = 840
  grdestoque.ColWidth(1) = 3350
  grdestoque.ColWidth(2) = 1000
  grdestoque.ColWidth(3) = 780
  grdestoque.ColWidth(4) = 780

  ' define a altura da linha 0
  grdestoque.RowHeight(0) = 460
  
  ' Define o titulo das colunas fixas
  grdestoque.Row = 0
  grdestoque.Col = 0
  grdestoque.Text = "ID"
  grdestoque.Col = 1
  grdestoque.Text = "Descrição do Produto"
  grdestoque.Col = 2
  grdestoque.Text = "Preço (R$)"
  grdestoque.Col = 3
  grdestoque.Text = "Nivel Atual"
  grdestoque.Col = 4
  grdestoque.Text = "Nivel Ordenado"

  ' Define o alinhamento das colunas fixas
  grdestoque.FixedAlignment(0) = 2
  grdestoque.FixedAlignment(1) = 2
  grdestoque.FixedAlignment(2) = 2
  grdestoque.FixedAlignment(3) = 2
  grdestoque.FixedAlignment(4) = 2

  ' define o alinhamento das demais colunas
  grdestoque.ColAlignment(0) = 0
  grdestoque.ColAlignment(1) = 0
  grdestoque.ColAlignment(2) = 1
  grdestoque.ColAlignment(3) = 1
  grdestoque.ColAlignment(4) = 1

  ' dados da linha 1
  grdestoque.Row = 1
  grdestoque.Col = 0
  grdestoque.Text = "F001"
  grdestoque.Col = 1
  grdestoque.Text = "Unidade Disco 1.44"
  grdestoque.Col = 2
  grdestoque.Text = "4.95"
  grdestoque.Col = 3
  grdestoque.Text = "78"
  grdestoque.Col = 4
  grdestoque.Text = "60"

  ' dados da linha 2
  grdestoque.Row = 2
  grdestoque.Col = 0
  grdestoque.Text = "F002"
  grdestoque.Col = 1
  grdestoque.Text = "Unidade Disco 1.44"
  grdestoque.Col = 2
  grdestoque.Text = "6.95"
  grdestoque.Col = 3
  grdestoque.Text = "120"
  grdestoque.Col = 4
  grdestoque.Text = "99"

  ' dados da linha 3
  grdestoque.Row = 3
  grdestoque.Col = 0
  grdestoque.Text = "H012"
  grdestoque.Col = 1
  grdestoque.Text = "Hard Disk de 2.1Gb "
  grdestoque.Col = 2
  grdestoque.Text = "120.95"
  grdestoque.Col = 3
  grdestoque.Text = "7"
  grdestoque.Col = 4
  grdestoque.Text = "8"
 
End Sub

Aqui usamos muitas propriedades já vistas neste artigo e as propriedades AddItem e RemoveItem que veremos a seguir. O projeto é apenas um exemplo simples para mostrar como usar estas propriedades.

O código do formulário - frmAdd é o seguinte :

Private Sub Command1_Click()
  frmMain.grdestoque.AddItem txtID + Chr$(9) + txtDescricao + Chr$(9) + txtPreco _
 + Chr$(9) + txtNivelAtual + Chr$(9) + txtNivelGravado
  Unload frmAdd
End Sub
Private Sub Command2_Click()
  Unload frmAdd
End Sub

Para incluir valores no Grid usamos a propriedade AddItem. O caractere chr$(9)( vbTab )- TAB - é usado para separar os valores informados nas caixas de texto e incluidos no Grid. Pegue o código do projeto aqui : flex_grd.zip

Incluindo e Excluindo linhas

Existem duas maneiras para alterar o número de linhas contidos no MsFlexGrid: Alterando a propriedade Rows do Grid ou usar os métodos AddItem e RemoveItem . Quando você altera o valor da propriedade Rows do Grid você irá incluir ou remover itens a partir da base do Grid (bottom) , já os métodos AddItem e RemoveItem permitem que você controle a posição da inclusão ou remoção do item. Para alterar o número de colunas do grid temos que configurar a propriedade Cols do grid.

AddItem - Permite incluir uma nova linha ao controle MsFlexGrid. A linha é incluida na base do Grid, mas , você pode especificar um valor indicando a posição no grid que deseja inserir. Para usar o método AddItem você deve informar o texto que deseja inserir A sua sintaxe é a seguinte:

Grid.AddItem(string, indice, numero)

Argumento Descrição
Grid O objeto FlexGrid.
string O texto a ser exibido na linha a ser incluida. Para incluir mais de um texto use o caracter vbTab(chr$(9) para separar os textos.
indice Indica a posição dentro do controle onde a nova linha será incluida. A primeira linha , terá indice=0 . Se for omitido , a nova linha torna-se a última linha.
numero Indica o numero da banda no qual a linha é incluida.

Vejamos a seguir um exemplo de código usado para incluir texto no grid:

Grid.AddItem "Nova Linha"
Grid.AddItem "Nova Linha",2
Grid.AddItem "Nova Linha" & Chr(9) & "Nova Linha"

RemoveItem - Exclui uma linha especifica do grid. Para usar este método você deve informar o número da linha a ser excluida. (Lembre-se que a primeira linha é definida como zero). A sintaxe é a seguinte:

Grid..RemoveItem(indice, numero)

Argumento Descrição
Grid O controle MsFlexGrid
indice Representa a linha a ser removida. A primeira linha tem indice=0
numero Especifica a banda da qual a linha deve ser removida.

O código abaixo exclui a segunda linha do grid:

Grid.RemoveItem 1

Para limpar o conteúdo de todas as linhas e colunas usamos o método Clear. Não afeta o número de linha e colunas presentes no Grid, remove somente o texto, figuras e formatação usadas no Grid.

Grid.Clear

Até o próximo artigo...


José Carlos Macoratti