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

Módulo de classe de acesso e classes wrapper

Introdução.


Há momentos em que um módulo de classe específico precisa ser instanciado mais de uma vez, para usar um conjunto semelhante de valores para um aplicativo específico.

Por exemplo, nosso Módulo de Classe ClsArea, que projetamos para calcular a área do carpete de Salas, é candidato a aplicações semelhantes. Suponha que gostaríamos de descobrir quantos pisos precisamos colocar em uma sala, então devemos ser capazes de inserir os valores de Comprimento e Largura de Tile também, além dos valores de dimensão de Floor. Como Floor e Tile têm valores de propriedade semelhantes como entrada, podemos usar duas instâncias do módulo de classe ClsArea, uma instância para a área FLOOR e a segunda instância para a área TILE. Área de Piso / Área de Ladrilhos fornece o número total de ladrilhos para uma sala específica.

Duas instâncias do mesmo módulo de classe.


Podemos fazer isso criando duas instâncias diferentes do módulo de classe ClsArea no programa de módulo padrão se houver apenas uma sala.
Public Sub FloorTiles()
Dim FLOOR As ClsArea
Dim TILES As ClsArea
Dim flrArea As Double, tilearea As Double
Dim lngTiles As Long

Set FLOOR = New ClsArea
Set TILES = New ClsArea

FLOOR.strDesc = "Bed Room1"
FLOOR.dblLength = 25
FLOOR.dblWidth = 15
flrArea = FLOOR.Area()

TILES.strDesc = "Off-White"
TILES.dblLength = 2.5
TILES.dblWidth = 1.25
tilearea = TILES.Area()

lngTiles = flrArea / tilearea

Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc

Set FLOOR = Nothing
Set TILES = Nothing

End Sub

Como lidar com uma matriz de objetos.


Mas e se precisarmos aplicar o método acima para uma matriz de várias salas com diferentes tamanhos ou cores de ladrilhos? A resposta para isso é criar um novo módulo de classe com duas instâncias da mesma ClsArea Classe, uma instância para Floor, e outro para Ladrilhos Propriedades. Ambas as instâncias são agrupadas em um novo módulo de classe.

Vamos fazer isso.
  1. Abra seu banco de dados e exiba a janela de edição de código (ALT+F11).
  2. Selecione o Módulo de turma de Inserir Menu.
  3. Alterar o Nome Valor da propriedade para ClsTiles .
  4. Copie e cole o seguinte código VBA no módulo de classe ClsTiles e salve o código:
    Option Compare Database
    Option Explicit
    
    Private pFLOOR As ClsArea
    Private pTILES As ClsArea
    
    Private Sub Class_Initialize()
        Set pFLOOR = New ClsArea
        Set pTILES = New ClsArea
    End Sub
    
    Private Sub Class_Terminate()
        Set pFLOOR = Nothing
        Set pTILES = Nothing
    End Sub
    
    Public Property Get Floor() As ClsArea
     Set Floor = pFLOOR
    End Property
    
    Public Property Set Floor(ByRef NewValue As ClsArea)
      Set pFLOOR = NewValue
    End Property
    
    Public Property Get Tiles() As ClsArea
      Set Tiles = pTILES
    End Property
    
    Public Property Set Tiles(ByRef NewValue As ClsArea)
      Set pTILES = NewValue
    End Property
    
    Public Function NoOfTiles() As Long
       NoOfTiles = pFLOOR.Area() / pTILES.Area()
    End Function
    

    Ambas as instâncias, pFLOOR e pTILES são declaradas como propriedades privadas do objeto de classe ClsTiles.

    A Class_Initialize() A sub-rotina instancia ambos os objetos na memória quando o ClsTiles O módulo de classe é instanciado no programa do usuário.

    O Class_Terminate() A sub-rotina remove ambas as instâncias (pFLOOR e pTILES) da memória quando a instância do módulo de classe ClsTiles é definida como Nothing no programa do usuário.

    O Obter e Definir Os procedimentos de propriedade permitem a recuperação e atribuição de valores, de e para a instância pFLOOR, respectivamente, no objeto de classe ClsTiles.

    O próximo procedimento de obter e definir propriedade permite as mesmas operações na instância pTILES da classe ClsArea.

    Adicionamos uma nova função NoOfTiles() no novo Módulo de Classe, para calcular o número de ladrilhos, com base na dimensão Área do Piso e Ladrilho.

    Vamos escrever um programa e aprender o uso de várias instâncias do mesmo objeto de classe, em um novo módulo de classe:ClsTiles.
  5. Copie e cole o seguinte código VBA em um módulo padrão:
    Public Sub TilesCalc()
    Dim FTiles As ClsTiles
    Dim TotalTiles As Long
    
    Set FTiles = New ClsTiles
    
    FTiles.Floor.strDesc = "Warehouse"
    FTiles.Floor.dblLength = 100
    FTiles.Floor.dblWidth = 50
    
    FTiles.Tiles.dblLength = 2.5
    FTiles.Tiles.dblWidth = 1.75
    
    TotalTiles = FTiles.NoOfTiles()
    
    Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles"
    Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles
    
    End Sub
     
  6. Mantenha a janela de depuração aberta (CTRL+G) para imprimir os dados de teste.
  7. Clique em algum lugar no meio do código VBA e pressione F5 Chave para executar o Código. O resultado é impresso na janela de depuração.
    Se você deseja calcular os requisitos de ladrilhos de várias salas ou salas de vários andares de um prédio alto, você deve executar o programa acima várias vezes e anotar os valores, o que é praticamente muito difícil.

    Encontrando o requisito de tile de várias salas.


    Agora, vamos escrever outro programa para encontrar os requisitos de Tile de várias Salas, com um Array de ClsTiles Objetos inserindo os valores de propriedade diretamente do teclado.
  8. Copie e cole o seguinte código VBA em um módulo padrão.
    Public Sub TilesCalc2()
    Dim tmpFT As ClsTiles
    Dim FTiles() As ClsTiles
    Dim j As Long, L As Long, H As Long
    
    For j = 1 To 3
       Set tmpFT = New ClsTiles
          'Floor dimension
        With tmpFT.Floor
          .strDesc = InputBox(Str(j) & ") Floor Desc", , 0)
          .dblLength = InputBox(Str(j) & ") Floor Length", , 0)
          .dblWidth = InputBox(Str(j) & ") Floor Width", , 0)
        End With
        
        'Tile Dimension
        With tmpFT.Tiles
          .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0)
          .dblLength = InputBox(Str(j) & ") Tile Length", , 0)
          .dblWidth = InputBox(Str(j) & ") Tile Width", , 0)
        End With
       
       ReDim Preserve FTiles(1 To j) As ClsTiles
       Set FTiles(j) = tmpFT
       
       Set tmpFT = Nothing
    Next
    
    'Take Printout
    L = LBound(FTiles)
    H = UBound(FTiles)
    
    Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles"
    For j = L To H
      With FTiles(j)
       Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles
      End With
    Next
       
    'Remove all objects from memory
    For j = L To H
       Set FTiles(j) = Nothing
    Next
      
    End Sub
    
    
  9. Mantenha a janela de depuração aberta para imprimir a saída nela.
  10. Execute o código como antes e insira valores para as dimensões do piso e do ladrilho para três salas.

Como você pode ver no código acima, ambos os valores das dimensões Room e Tile vão para a mesma instância Class Object Array, lado a lado.

O programa acima é uma demonstração que é executada apenas para três conjuntos de valores dentro do For. . . Próxima volta. Ele pode ser modificado com um loop condicional que é executado por um número necessário de vezes até que um código de interrupção condicional encerre o programa.

O programa pode ser modificado para salvar cada conjunto de valores de dados e resultados de cálculos em uma Tabela para referência futura.

Uma classe de wrapper é um Contêiner Classe para instâncias de outras Classes, Estruturas de Dados ou coleção de instâncias de outros objetos. Aqui nós o usamos para manter duas instâncias da mesma classe Object.

Lista de todos os links neste tópico.

  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. Adicionar objetos de classe como itens de dicionário
  18. Atualizar item do dicionário de objetos de classe no formulário