Visual Basic 6 - Trabalhando com Arrays
Arrays ????
Rápido um dicionário !!!
Uhn... Vejamos...
Arrays - Tipo de variável que armazena um conjunto de valores do mesmo tipo ; Um arranjo de elementos em uma ou mais dimensões ; Uma coleção de elementos do mesmo tipo no qual a posição de cada elemento está definida de forma única por um inteiro.
Obs: Os arrays são semelhantes aos vetores , se você já ouviu falar em vetores e conhece algo sobre eles verá que os conceitos envolvidos são semelhantes.
Acho que não foi um bom começo , mas , vamos tentar melhorar.
Primeiro : não vou traduzir a palavra array.
Array será entendido como um tipo de variável especial.
Segundo: vamos ser mais práticos...
Vamos supor que você precise atribuir a três variáveis o nome de três pessoas que constam de uma relação. Como você faria ? Ora, ora... abaixo as três etapas básicas envolvidas no tedioso processo...
dim snome1 as string dim snome2 as string dim snome3 as string |
snome1="João
da Silva snome2="Maria Lima" snome3="Pedro Sabino" |
for i=1 to 3 msgbox snome & i Next |
declarando as variáveis | atribuindo valores | exibindo o conteúdo das variáveis |
Você teve que declarar 3 variáveis diferentes , uma para armazenar cada nome, mesmo cada nome sendo do uma variável do tipo string.
Muito Bem, e se a relação tiver 5 pessoas e você precisar atribuir os nomes a variáveis ??? Ô Loco !!!!
Ora por isso é que inventaram os arrays . Vejamos como ficaria...:
Dim sNomes(1
to 5) as String |
sNomes(1)="João
da Silva"
sNomes(4)="Marcia
de Souza" |
for i=1 to 5 msgbox snomes(i) Next |
declarando as variáveis | atribuindo valores | exibindo o conteúdo das variáveis |
O que há de novo ?
Tudo se passa como se você tivesse um "armário" com 5 "gavetas " , cada gaveta possuindo um número de identificação , e armazenando um nome distinto.
Conclusão :
Nota - Os arrays possuem a seguinte característica:
O VB trabalha com dois tipos de arrays : os fixos , que sempre permanece do mesmo tamanho e os dinâmicos cujo tamanho pode ser alterado em tempo de processamento.
Arrays Fixos
A sintaxe para declarar um array fixo é:
Dim Nome_do_Array(Índíce_Inferior To Índice_Superior) As Tipo_de_Dados
Onde:
Ex: Dim Numeros(10) as Integer , Dim Nomes(10) as String
Dica - Um laço For/Next é uma das maneiras mais tradicionais de percorrer os elementos de um array e de atribuir valores a um array. geralmente usamos a sintaxe abaixo:
For i= indice_inferior to indice_superior Nome_do_vetor(i) = Variável Next i |
For i= indice_inferior to indice_superior Print Nome_do_vetor(i) Next i |
atribuindo valores | percorrendo o array |
Obs: A partir do VB5 temos também o laço For Each ...Next , o qual é específico para ser usado com coleções e arrays. A sintaxe é:
For Each <Variant> In <nome_do_array> ... Next
Vejamos um exemplo:
Dim nRandom() As Integer Dim Elemento As Variant Dim nTamanhoArray as integer Randomize nTamanhoArray = Int (Rnd(1)) * 10) ' gera tamanho do vetor aleatório Redim nRandom(nTamanhoArray) For Each Elemento in nRandom 'percorre cada elemento do array e atribui um valor Elemento = int(Rnd(1) * 1000) Next |
Nota - Lembra-se do que uma variável do tipo Variant ?
Tipo de dados | descrição | Pode receber | Tamanho |
Variant |
qualquer tipo de variável
|
Qualquer valor |
22 bytes + tipo de
dado |
Podemos declarar um array fixo das seguintes formas com relação a visibilidade do mesmo no projeto:
Nota - Lembra-se do escopo das variáveis ?
Escopo
|
Visibilidade |
Local |
uma variável definida a
nível de procedure só é visível dentro da procedure onde foi declarada |
Módulo
/Formulário |
uma variável declarada
na General Declaration de um módulo ou de um formulário só
é visível para todas as procedures dentro do módulo ou formulário onde
foram declaradas |
Público |
uma variável declarada
em um módulo como Public é visível em todas as procedures de seu
projeto |
Ao declarar um array você não pode exceder o intervalo do tipo de dados Long ( -2.147.483.648 to -2.147.483.647) . Um número muito grande pode consumir muita memória. Por exemplo:
Veja as implicações de você declarar o seguinte array : Dim Teste(20000) As Long
Arrays contendo Arrays
Você pode criar um array do tipo Variant que contenha outros arrays de diferentes tipos de dados. O código abaixo mostra exatamente isto:
|
Entendendo:
'contadorA()
MsgBox arrX(1)(0) == > 0
MsgBox arrX(1)(1) == > 1
MsgBox arrX(1)(2) == > 2
' contadorB()
MsgBox arrX(2)(0) == >
Elemento - 0
MsgBox arrX(2)(1) == > Elemento - 1
MsgBox arrX(2)(2) == > Elemento - 2
Para determinar os limites
inferiores e superiores de um array podemos usar as funções UBound e
LBound. Assim:
LBound - Retorna um valor do tipo Long contendo o MENOR índice para a dimensão definida de um array. Sintaxe: LBound(nome_do_array[, dimensão])
Parte | Descrição |
nome_do_array | Nome do Array. Obrigatório |
dimensão | Opcional; Variant (Long). Indica qual a dimensão para qual o menor índice é retornado.Se for omitido o padrão é 1. |
Dim
A(1 To 100, 0 To 3, -3 To 4) - Vetor
com três dimensões:
Usando LBound | Valor | descrição |
LBound(A, 1) |
1 | retorna o menor índice da primeira dimensão |
LBound(A, 2) |
0 | retorna o menor índice da segunda dimensão |
LBound(A, 3) |
-3 | retorna o menor índice da terceira dimensão |
UBound - Retorna um valor do tipo Long contendo o MAIOR índice para a dimensão definida de um array. Sintaxe: LBound(nome_do_array[, dimensão])
Parte | Descrição |
nome_do_array | Nome do Array. Obrigatório |
dimensão | Opcional; Variant (Long). Indica qual a dimensão para qual o MAOIR índice é retornado.Se for omitido o padrão é 1. |
Exemplo:
Dim Superior
|
Qual a utilidade de tudo isto ???? (Se não perguntou , devia...)
Os arrays são muito usados para preencher Listas e controles como ListBox/ComboBox/ListView,etc. e podemos usá-los também para serem preenchidos com o conteúdo de um Recordset. Para ilustrar isto vejamos o exemplo a seguir que usa o método GetRows para armazenar em um vetor os dados de uma tabela:
Private Sub Command1_Click() Dim contador As Integer Dim dbvetor As Variant Set db = DBEngine.Workspaces(0).OpenDatabase("c:\teste\biblio.mdb") Set rs = db.OpenRecordset("Authors", dbOpenTable) dbvetor = rs.GetRows(10) 'retorna 10 registros e armazena-os no vetor dbvetor rs.Close Set rs = Nothing db.Close numero_de_colunas = UBound(dbvetor, 1) numero_de_registros = UBound(dbvetor, 2) 'define o numero de colunas do grid Grid1.Cols = numero_de_colunas 'defina as linhas e colunas fixas Grid1.FixedCols = 0 Grid1.FixedRows = 1 'Preenche o grid For i = 0 To numero_de_registros For j = 0 To numero_de_colunas linha = linha & dbvetor(j, i) & Chr(9) Next j Grid1.AddItem linha linha = "" Next i End Sub |
O resultado do processamento será o seguinte:
Vamos entender o código acima:
Assim quando fizemos:
numero_de_colunas = Ubound(dbvetor,1) numero_de_registros = Ubound(dbvetor,2)
Estamos retornando em numero_de_colunas o maior valor do índice para a primeira dimensão: Ora este é o valor relacionado a quantidade de campos selecionado e estamos retornando em numero_de_registros o maior valor para índice da segunda dimensão que é o valor relacionado com a quantidade de registros.
Outro exemplo de utilização seria o preenchimento de ListBox ou ComboBox com o conteúdo de um array usando as propriedades UBound e LBound. Vejamos a seguir:
menor = LBound(gVetor)
' obtem o menor indice do array maior = UBound(gVetor) ' obtêm o maior indice do array For i=menor To Maior 'insere um novo item do array na lista List1.AddItem gVetor(i) Next |
Arrays Multidimensionais
Podemos declarar arrays de mais de uma dimensão; fazemos isto informando outro valor para o índice que comporá a outra dimensão.A sintaxe para a declaração é a mesma da usada nos arrays unidimensionais. Assim temos:
- Array com duas dimensões - Dim Duas_Dimensoes(4,4) as integer
Declara um array com 5 elementos em duas dimensões(Lembre-se que o índice inferior inicial é sempre zero). Desta forma o vetor pode ser entendido como uma tabela com 5 linhas e 5 colunas. A primeira dimensão , representando as linhas são identificadas pelos índices de 0 a 4 e a segunda dimensão seriam as colunas identificadas pelos índices de 0 a 4. O total de elementos do array será 25 elementos ( 5 x 5 ).
0,0 | 0,1 | 0,2 | 0,3 | 0,4 |
1,0 | 1,1 | 1,2 | 1,3 | 1,4 |
2,0 | 2,1 | 2,2 | 2,3 | 2,4 |
3,0 | 3,1 | 3,2 | 3,3 | 3,4 |
4,0 | 4,1 | 4,2 | 4,3 | 4,4 |
Assim:
- Array com três dimensões - Dim Tres_Dimensoes(4,4,4) as integer
Declara um array com 5 elementos em cada dimensão. Aqui estamos tratando com a noção de volume ( Altura, Largura , Profundidade) - imagine em um cubo. O total de elementos deste array será 125 ( 5 x 5 x 5 ). Podemos identificar os elementos da seguinte forma:
Abaixo temos uma representação gráfica simplificada de como seria a terceira dimensão.
Você , ao declarar um array multidimensional , pode definir o índice inicial e final para cada dimensão usando a palavra chave To, então para o caso acima teríamos:
- Array com três dimensões - Dim Tres_Dimensoes(1 To 5,1 To 5,1 To 5) as integer
Neste caso o índice inicial seria 1 e o final 5 para cada dimensão.
Para percorrer ou atribuir valores para arrays multidimensionais os laços For/Next são muito úteis. Vejamos abaixo um exemplo de como preencher um array bidimensional :
|
Arrays Dinâmicos
Pode acontecer que num determinado momento você não saiba exatamente qual o tamanho do seu vetor, ou pode acontecer também que após você definir um array com um tamanho ter que alterar o este tamanho quer aumentando quer diminuindo. Como fazer isto ????
Para resolver estes problemas usamos os arrays dinâmicos , eles podem ser redimensionados a qualquer momento , além de permitir um gerenciamento de memória mais amigável , pois você pode usar um array definido para uma quantidade de elementos muito grande num momento e após usá-lo poderá liberar a memória usada por ele redimensionando-o para quantidades menores de elementos.
Para criar um array dinâmico basta declarar o array sem definir os índices inferiores e superiores das dimensões., isto é, você não define o tamanho do array .Exemplo: Dim Nomes() as String
Para alocar o número atual de elementos do array você deve usar a declaração ReDim. Assim
Redim Nomes (10) , ReDim (4 To 10)
A declaração ReDim somente pode ser usada em uma procedure .
Então primeiro você declara o array (Dim) e define o seu tamanho em seguida para , se for o caso, redimensioná-lo usando a declaração ReDim. Vejamos um exemplo:
Private Sub Command1_Click() Dim MyArray() As Integer ' Declare um array dinamico ReDim MyArray(5) ' Aloca 5 elementos For I = 1 To 5 MyArray(I) = I ' Inicializa o array Next I For I = 1 To 5 Debug.Print MyArray(I) 'exibe o conteudo do array Next I ReDim MyArray(10) ' redimensiona o array para 10 elementos For I = 1 To 10 Debug.Print MyArray(I) ' exibe o conteudo do array Next I For I = 1 To 10 MyArray(I) = I ' atribui valores ao array Next I For I = 1 To 10 Debug.Print MyArray(I) ' exibe o conteudo do array Next I ReDim Preserve MyArray(15) ' Redimensiona o array para 15 elementos For I = 1 To 15 Debug.Print MyArray(I) ' exibe o conteudo do array Next I End Sub |
Vamos explicar o código em detalhes:
Dim MyArray() As Integer ' Declare um array dinamico ReDim MyArray(5) ' Aloca 5 elementos For I = 1 To 5 MyArray(I) = I ' Inicializa o array Next I For I = 1 To 5 Debug.Print MyArray(I) 'exibe o conteudo do array Next I |
Declaramos o array dinâmico e a seguir alocamos 5 elementos para o array, a seguir atribuímos valores a cada elemento do array e exibimos o resultado que será : 1 , 2 , 3 , 4 e 5
ReDim
MyArray(10)
' redimensiona o array para 10 elementos For I = 1 To 10 Debug.Print MyArray(I) ' exibe o conteudo do array Next I For I = 1 To 10 MyArray(I) = I ' atribui valores ao array Next I For I = 1 To 10 Debug.Print MyArray(I) ' exibe o conteudo do array Next I |
Redimensionamos o array para 10 elementos e exibimos a seguir o conteúdo do mesmo. Aqui vamos observar que o resultado será: 0,0,0,0,0,0,0,0,0,0 , ou seja o conteúdo do array que antes era 1,2,3,4,5 foi perdido. Atribuímos então novos valores aos elementos do array e exibimos o resultado que será : 1,2,3,4,5,6,7,8,9 e 10.
ReDim Preserve MyArray(15) '
Redimensiona o array para 15 elementos For I = 1 To 15 Debug.Print MyArray(I) ' exibe o conteudo do array Next I |
Aqui redimensionamos novamente o array , agora usando a palavra chave Preserve , para 15 elementos e a seguir exibimos o conteúdo do array. O resultado será: 1,2,3,4,5,6,7,8,9 , 10 ,0 ,0 ,0 ,0, 0 , ou seja o conteúdo anterior foi preservado e os novos elementos incluídos com valores 0. (valores numéricos são inicializados com zero , strings com comprimento zero ("") , variant com vazio (empty)
Conclusão:
Ao redimensionar um array usando a palavra chave ReDim o conteúdo do array será perdido . Para evitar tal efeito devemos usar a palavra Preserve na declaração. Ex: RedDim Preserve Teste(1 To 15) As Integer
Você pode usar a declaração ReDim repetidamente para alterar o numero de elementos e dimensões de um array. Porem você não pode declarar um array de um tipo de dados e mais tarde usar a declaração Redim para alterar o tipo de dados a menos que o tipo de dados usado foi o Variant, neste caso a alteração pode ser feita usando a cláusula As.
Ao usar a palavra chave Preserve , você pode redimensionar somente a última dimensão do array você não pode alterar o número dimensões. Assim se você usou um array com uma dimensão , você pode alterar a dimensão , mas se você usou um array com duas dimensões você somente pode alterar a última dimensão e ainda preservar o conteúdo do array.
Exemplo:ReDim X(10, 10, 10)
==>ReDim Preserve X(10, 10, 15)
Ficamos por aqui..
Veja os
Destaques e novidades do
SUPER DVD Visual Basic (sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ? Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira... Quer aprender C# ?? Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#. Veja também os Cursos com vídeo aulas e projetos exemplos: |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#