Access
 sql >> Base de Dados >  >> RDS >> Access

Matrizes de objetos de classe VBA do Ms-Access

Introdução.


Na semana passada, tivemos uma breve introdução de um objeto de classe personalizado simples com apenas duas Propriedades, para Comprimento e Largura Valores. Um método para calcular área de qualquer coisa, com valores de comprimento e largura. Espero que você tenha entendido o básico de um módulo de classe personalizada do Ms-Access. Se não, aqui está o link:Ms-Access Class Module e VBA. Visite a página antes de continuar.

Objetos de módulo de classe economiza muito código em seus programas. Quando você encontrar algo que você faz repetidamente no código, pense em um objeto de módulo de classe. O código repetitivo também pode ser transformado em uma função utilitária, mas para objetos de classe, você deve adotar uma abordagem diferente.

Para uma tarefa simples, pode ser necessário mais código para refinar as funções do objeto de módulo de classe, mas seus programas de módulo principal serão simples e todo o código complicado desenvolvido e refinado permanecerá oculto dos outros.

Mas por enquanto, temos um módulo de classe simples em mãos vamos tentar como criar um array de objetos para calcular a área de muitos itens.

A sub-rotina ClassArray().


O exemplo de código VBA no módulo padrão cria uma matriz de cinco objetos da classe ClsArea e imprime seus valores de propriedade e resultado do método na janela de depuração. Copie e Cole (ou melhor se você digitá-los, para conhecer melhor cada linha o que eles fazem) o seguinte código em um Módulo Padrão:
Public Sub ClassArray()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
Set tmpA = Nothing 'Remove temporary object from memory.
Next


‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

Clique em algum lugar no meio do código e pressione F5 para executar o código. Insira os valores para Descrição, Comprimento e Largura do teclado para 5 itens diferentes, um após o outro.

Exemplo de Execução do Programa é dado abaixo:

Description   Length        Width         Area
Door Mat       5             8             40 
Carpet         12            23            276 
Bed Room       21            23            483 
Store Room     15            25            375 
Terrace        40            50            2000 

Revisão do código linha por linha.


Vamos examinar o código linha por linha. Na área de declaração, declaramos uma variável de objeto tmpA do tipo ClsArea. Na segunda linha declarou um Array vazio CA() do tipo ClsArea. O número necessário de elementos será redimensionado posteriormente no programa.

Nas próximas duas linhas, declaramos as variáveis ​​title do tipo String e j, L, e U variáveis ​​do tipo Long Integer.

Em seguida, a variável title é inicializada com a string ‘ClassArray’ e será usada como um título na função InputBox(). O Para….Próximo loop é definido com uma variável de controle j para executar o loop cinco vezes. Após as próximas duas linhas de comentário, o Set declaração instancia (aloca memória) ClsArea Class Objeto na memória com o nome tmpA .

As próximas três linhas de código servem para valores de entrada para strDesc , dblComprimento, e dblWidth Propriedades do objeto de classe tmpA.

Após a próxima linha de comentário, o objeto de classe ClsArea (CA) é redimensionado para 1 a j vezes (1 a 1 vez) preservando os elementos Object existentes, se houver (este é o primeiro Object no Array). Isso continuará aumentando, por meio do ReDim instrução, para 1 a 2, 1 a 3, 1 a 4 e 1 a 5 preservando os valores de objeto anteriores, dentro do For . . . Próxima volta. A Preservar A palavra-chave garante que os objetos de matriz existentes não sejam perdidos.

Observação: A instrução Re-Dimension aumenta/diminui o número de elementos de objeto especificados, mas apaga os objetos existentes carregados na matriz anteriormente, sem o Preservar palavra-chave.

O Conjunto A instrução na próxima linha copia o objeto tmpA, com seus dados no CA(j) Objeto ClsArea recém-criado j elemento de matriz.

Próxima linha Set tmpA =Nothing remove o objeto temporário da memória.

O loop For…Next repete essa ação mais quatro vezes para inserir outros itens no objeto temporário recém-instanciado tmpA, um após o outro, e copia o objeto no CA Object Array.

As próximas duas linhas, após a linha de comentário, encontram o intervalo de índice do Object Array (encontra os números de índice mais baixos e mais altos.

O próximo Debug.Print A instrução imprime uma linha de título em zonas de 14 colunas na janela de depuração. O Para . . . Próximo loop com o L e U os intervalos de números de índice de matriz vinculados executam as instruções internas para acessar cada objeto da matriz CA, com número de índice na variável de controle j.

A referência de objeto atual é definida em With. . . Terminar com estrutura, em vez de repetir o nome do objeto CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth e CA(j).Área para imprimir os valores de propriedade do objeto e os resultados da área de método() na janela de depuração.

Remova o símbolo de comentário do 'Parar instrução para criar uma pausa no programa na instrução Stop. Execute o código novamente e insira 5 detalhes do item para que você possa experimentar o objeto Array. Você pode endereçar seletivamente qualquer propriedade do objeto, com o número do índice de matriz, para editar ou imprimir qualquer valor na janela de depuração, conforme mostrado abaixo.


A instrução Definir CA(j) =Nada dentro do Para. . . Next Loop limpa os objetos do array, um por um da Memória.

Passe a matriz de objetos de classe como parâmetro de função.


Podemos passar o Class Object Array como um parâmetro para um programa, como fizemos com o tipo de dados definido pelo usuário.

Vamos criar uma Sub-rotina de Impressão simples, cortando o Código da Seção de Impressão, do programa principal, e colocando-o no novo programa.

Copie o código da sub-rotina ClassArray(), cole-o no mesmo módulo padrão e altere o nome como ClassArray2(), como mostrado abaixo.
Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

O código ClassArray2 sem seção de impressão.


Crie uma nova sub-rotina conforme indicado abaixo:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

End Sub


Realce a seção de impressão até a instrução 'Stop no programa ClassArray2(), corte a área destacada do código e cole-a abaixo do Dim instruções no ClassPrint() Programa. A versão modificada de ambos os Códigos é fornecida abaixo:
Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea
     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

Call ClassPrint(CA) ‘Pass the Object Array to print routine

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub

O programa ClassPrint().

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

'Printing Section
'Print the Array Contents into the Debug Window.
L = LBound(clsPrint)
U = UBound(clsPrint)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With clsPrint(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

End Sub


Verifique se há alterações de código em ambos os programas e faça correções, sempre que aplicável. Clique no meio do código ClassArray2() e pressione F5 para executar o programa.

A instrução Call no primeiro programa passa a matriz de objetos de classe CA como parâmetro ByRef para a sub-rotina ClassPrint(). O programa imprime as Propriedades do Objeto e chama a função Area() para calcular e retornar o valor a ser impresso.

Na próxima semana, aprenderemos como usar nosso módulo ClsArea Class como uma classe base para criar um novo objeto de classe VBA para calcular o volume de alguma coisa.
  1. Módulo de classe MS-Access e VBA
  2. Matrizes de objetos de classe VBA do MS-Access
  3. Classe base do MS-Access e objetos derivados
  4. Classe básica do VBA e objetos derivados-2
  5. Classe base e variantes de objetos derivados
  6. Ms-Access Recordset and Class Module
  7. Módulo de classe de acesso e classes wrapper
  8. Transformação da funcionalidade da classe wrapper
  9. Noções básicas de Ms-Access e objetos de coleção
  10. Módulo de classe Ms-Access e objeto de coleção
  11. Registros de tabela em objeto e formulário de coleção
  12. Noções básicas de objetos do dicionário
  13. Noções básicas de objetos do dicionário-2
  14. Classificação de chaves e itens de objetos de dicionário
  15. Exibir registros do dicionário para o formulário
  16. Adicionar objetos de classe como itens de dicionário
  17. Atualizar item do dicionário de objetos de classe no formulário