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.
- Abra seu banco de dados e exiba a janela de edição de código (ALT+F11).
- Selecione o Módulo de turma de Inserir Menu.
- Alterar o Nome Valor da propriedade para ClsTiles .
- 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.
- 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
- Mantenha a janela de depuração aberta (CTRL+G) para imprimir os dados de teste.
- 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.
- 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
- Mantenha a janela de depuração aberta para imprimir a saída nela.
- 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.
- Módulo de classe MS-Access e VBA
- Matrizes de objetos de classe VBA do MS-Access
- Classe base do MS-Access e objetos derivados
- Classe básica do VBA e objetos derivados-2
- Classe base e variantes de objetos derivados
- Ms-Access Recordset and Class Module
- Módulo de classe de acesso e classes wrapper
- Transformação da funcionalidade da classe wrapper
- Noções básicas de Ms-Access e objetos de coleção
- Módulo de classe Ms-Access e objeto de coleção
- Registros de tabela em objeto e formulário de coleção
- Noções básicas de objetos do dicionário
- Noções básicas de objetos do dicionário-2
- Classificação de chaves e itens de objetos de dicionário
- Exibir registros do dicionário para o formulário
- Adicionar objetos de classe como itens de dicionário
- Adicionar objetos de classe como itens de dicionário
- Atualizar item do dicionário de objetos de classe no formulário