VB6 - Preenchendo o MSFLexGrid mais rápido
O controle MSFLexGrid é um ótimo controle de GRID para exibir dados em suas aplicações Visual Basic 5/6, ele não é perfeito, mas e leve e fácil de configurar via código. Se você costuma usar este controle em suas aplicações para exibir dados de tabelas de banco de dados saiba que pode ganhar muito em desempenho na hora de preencher o controle. Veja a seguir se você esta fazendo o serviço usando o método mais rápido.
Crie um novo projeto no Visual Basic do tipo Standard EXE e no formulário padrão inclua três botões de comando , um controle MSFLexGrid conforme o leiaute abaixo:
O exemplo mostrado efetua o acesso a uma base de dados Access (Teste.mdb), tabela COMUM, usando via ADO usando o provedor OLE DB e preenche um controle MSFLexGrid exibindo 6 campos da tabela.
1- Usando o método mais rápido
No evento Click do botão de comando : Preenchendo via métodos : Rcs.getString() e FlexGrid.Clip ,inclua o seguinte código:
Private Sub
Command1_Click() 'define os objetos para o acesso aos dados no Microsoft Access Dim db As New ADODB.Connection Dim rs As New ADODB.Recordset Dim lTimer As Long Screen.MousePointer = vbHourglass Command3_Click MSFlexGrid1.Refresh lTimer = Timer MSFlexGrid1.Visible = False 'abre o banco de dados e define o recordset a ser usado db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Teste.mdb;Persist Security Info=False" rs.Open "SELECT * FROM COMUM", db, adOpenStatic, adLockReadOnly rs.MoveFirst 'define o numero de linhas e colunas e configura o grid MSFlexGrid1.Rows = rs.RecordCount + 1 MSFlexGrid1.Cols = rs.Fields.Count - 1 MSFlexGrid1.Row = 0 MSFlexGrid1.Col = 0 MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1 MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 'estamos usando a propriedade Clip e o método GetString para selecionar uma região do grid MSFlexGrid1.Clip = rs.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString) MSFlexGrid1.Row = 1 MSFlexGrid1.Visible = True 'libera os objetos Set rs = Nothing Set db = Nothing Screen.MousePointer = vbDefault MsgBox "Tempo de execução : " & Timer - lTimer & " segs." & vbCr & MSFlexGrid1.Rows - 1 & " registros" End Sub |
Ao preencher o Grid usando este código teremos o seguinte resultado:
1- Usando o método mais lento
No evento Click do botão de comando : Preenchendo com o método FlexGrid.Additem , inclua o seguinte código:
Private Sub
Command2_Click() 'define os objetos para o acesso aos dados no Microsoft Access Dim db As New ADODB.Connection Dim rcs As New ADODB.Recordset Dim lTimer As Long Screen.MousePointer = vbHourglass Command3_Click MSFlexGrid1.Refresh lTimer = Timer MSFlexGrid1.Visible = False 'abre o banco de dados e define o recordset a ser usado db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Teste.mdb;Persist Security Info=False" rcs.Open "SELECT * FROM COMUM", db, adOpenStatic, adLockReadOnly rcs.MoveFirst 'define o numero de linhas e colunas e configura o grid MSFlexGrid1.Rows = 0 MSFlexGrid1.Cols = rcs.Fields.Count - 1 Do Until rcs.EOF 'estamos colectando os campos da tabela COMUM usando a sintaxe: rs(n) onde rs(0) refere-se ao primeiro campo e assim por diante MSFlexGrid1.AddItem rcs(0) & vbTab & rcs(1) & vbTab & rcs(2) & vbTab & rcs(3) & vbTab & rcs(4) & vbTab & rcs(5) rcs.MoveNext Loop MSFlexGrid1.Visible = True 'libera os objetos Set rcs = Nothing Set db = Nothing Screen.MousePointer = vbDefault MsgBox "Tempo de execução : " & Timer - lTimer & " segs." & vbCr & MSFlexGrid1.Rows - 1 & " registros" End Sub |
Ao preencher o grid usando este código iremos obter:
Comparando os tempos obtidos teremos:
1- Método Mais Rápido | 2- Método mais Lento |
0,42 segundos | 4,5 segundos |
Uma verdadeira eternidade na diferença entre os tempos , não é mesmo ?
Então avalie o seu caso e veja se é possível otimizar o desempenho usando primeiro método que usa a propriedade Clip do MSFlexGrid. Vamos dar uma recapitulada nesta propriedade:
Retorna ou define o conteúdo das células no controle MSFGrid/MSHFlexGrid da região selecionada.
Sintaxe: object.Clip [=string]
Parte | Descrição |
object | Uma objeto ao qual a propriedade se aplica. |
string | Uma expressão String que contém a área selecionada do grid. |
Obs: Ao preencher o MSFLexGrid com dados , somente as células selecionadas são afetadas e se houver mais células na região selecionada que as definidas na string , as células restantes serão desprezadas. Se houver mais células descritas na string que as células da região selecionada , a parte não utilizada será ignorada.
Nota: Limites de exibição de células nos controles de grid
Em seu artigo no link http://support.microsoft.com/default.aspx?kbid=191006 a Microsoft informa :
A Ajuda diz o seguinte: " O número mínimo de linhas e colunas é 0. O número máximo é limitado pela memória disponível no seu computador. "
Embora essa declaração é verdadeira para o
controle Hierarchical FlexGrid (MSHFLXGD.OCX), ele é incorreto para o
controle FlexGrid (MSFLXGRD.OCX).
Essa limitação de 350.000 células ocorre em qualquer computador, sem
considerar a memória que está disponível. Assim, se você tiver duas
colunas, a quantidade máxima de linhas que você pode ter é 175.000. Da mesma
forma, se você tiver cinco colunas, a quantidade máxima de linhas que você
pode ter é 70.000.
Neste quesito é sempre ter bom senso , pois querer exibir milhares registros em um grid não é lá muito indicado mesmo se você tiver a melhor máquina e muita memória. Para aplicações web então eu nem preciso falar que isto é totalmente contra indicado.
Até breve...
Pegue o projeto completo para testes aqui: msflexTeste.zip
referências:
http://support.microsoft.com/default.aspx?kbid=191006
http://support.microsoft.com/kb/194653
José Carlos Macoratti