Introdução.
Se você não viu os Posts anteriores no Módulo de Classe do Microsoft Access, por favor, passe por eles antes de continuar, os links são fornecidos abaixo.
- Módulo de classe MS-Access e VBA.
- Matriz de objetos de classe VBA do MS-Access.
A ClsArea A classe pode funcionar como uma classe base em outro objeto de classe, o cálculo realizado pela classe base pode ser usado como parte dos cálculos do novo objeto. Por exemplo, pode ser parte de um objeto que calcula o volume de algo,
O dbl em dblLength e dblWidth Nomes de procedimentos de propriedade para Get/Let Os procedimentos são simplesmente uma indicação de que o objeto de classe espera os valores de comprimento e largura em números de precisão dupla. Da mesma forma, se alterarmos os Nomes de Procedimentos de Propriedade para Quantidade e Preço Unitário, o primeiro valor multiplicado pelo segundo valor nos dará o Preço Total de algum item.
Significa simplesmente que você pode usar a classe ClsArea como uma classe base, sempre que precisar do resultado do primeiro valor multiplicado pelo segundo valor, como Preço total * Taxa de imposto para calcular o valor do imposto ou Preço total * Taxa de desconto para encontrar o valor do desconto e assim por diante.
Embora tenhamos desenvolvido um módulo de classe simples, ele pode fazer parte de muitas outras classes derivadas. As possibilidades estão abertas à sua imaginação e criatividade.
Nossa classe ClsArea calcula a área de materiais, salas ou itens semelhantes apenas com propriedades de comprimento e largura. Não calcula a área do Triângulo ou Círculo. Mas, pode fazer parte de um novo Objeto de Classe que calcula o Volume de Salas, Armazéns para encontrar a capacidade de armazenamento. Para isso, precisamos de mais um valor Altura da Sala, Armazém, etc.
A classe de volume:ClsVolume.
Vamos criar um novo módulo de classe ClsVolume, usando a ClsArea como Classe Base. Insira um módulo de classe e altere seu nome Propriedade para ClsVolume . Digite ou copie e cole o seguinte código no módulo de classe.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (p_Height > 0) Then Volume = p_Area.Area * p_Height Else MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume" End If End Function
O código do objeto de classe ClsVolume ainda não está completo. Vamos examinar o código linha por linha. Na terceira linha declarada como propriedade privada p_Area do objeto de classe ClsArea.
A próxima linha declara uma propriedade privada com o nome p_Height do tipo de dados Double.
As sub-rotinas Class_Initialize() e Class_Terminate().
As próximas duas sub-rotinas (Initialize() e Terminar() ) são muito importantes aqui.
O Inicializar() executa e instancia o objeto ClsArea na memória quando usamos e instanciamos a ClsVolume Class Objeto em nosso programa Módulo Padrão.
Quando executamos a instrução Set ClsVolume =Nothing no programa Standard Module, para limpar o objeto ClsVolume da memória, o Terminate() A Sub-Rotina executa e libera o espaço de memória ocupado pelo Objeto ClsArea.
A propriedade Obter dblHeight O procedimento retorna o valor de p_Height Propriedade para o Programa de chamada.
A propriedade Let dblHeight O procedimento valida o valor passado para o NewValue parâmetro e o atribui à propriedade privada p_Height .
A Função Pública Volume() calcula o Volume, chamando a função p_Area.Area() A função e o valor da área retornado são multiplicados por p_Height para calcular o Volume, com a expressão:Volume =p_Area.Area * p_Height. Mas, antes de executar esta instrução, estamos realizando uma verificação de validação para garantir que a função p_Area.Area() retorne um valor maior que zero, indicando que as propriedades p_Area.dblLength, p_Area.dblWidth possuem valores válidos nelas e o valor da propriedade p_Height é maior que zero.
Observação: Desde então, a p_Area O objeto da classe ClsArea é definido como Privado Propriedade da classe ClsVolume temos que fazer suas propriedades (strDesc, dblComprimento, dblWidth e Área() função) visível para o mundo exterior para Get/Let Operações e para retornar o Valor da Área. Isso significa que temos que definir os procedimentos de propriedade Get/Let para propriedades strDesc, dblLength, dblWidth e a função Area() do objeto de classe ClsArea no módulo de classe ClsVolume também.
Os procedimentos de arrendamento/obtenção de propriedade.
Adicione a seguinte propriedade Get/Let Procedimentos e Área() função para o código do módulo de classe ClsVolume:
Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Verifique os procedimentos da propriedade strDesc() Get/Let lines of Code. O uso do nome do procedimento strDesc é simplesmente uma questão de escolha, se você quiser usar um nome diferente, será bem-vindo. Mas, o nome da propriedade original que usamos na classe ClsArea é strDesc. Usar esse nome original aqui nos lembra do relacionamento com o objeto de classe ClsArea original.
No próximo procedimento de propriedade Get dblLength(), a expressão à direita do = assinar p_Area.dblLength lê o valor dblLength armazenado no objeto de classe ClsArea e retorna ao programa de chamada.
O procedimento de propriedade Let atribui o valor do parâmetro na variável NewValue à propriedade p_Area.dblLength do objeto de classe ClsArea. Aqui, não estamos executando nenhuma verificação de validação no valor recebido na variável de parâmetro NewValue. A verificação de validação será realizada dentro da própria classe ClsArea quando atribuirmos o valor a p_Area.dblLength propriedade.
Da mesma forma, os procedimentos de propriedade Get/Let também são adicionados para a propriedade p_Area.dblWidth,
Em seguida, a p_Area.Area() A função torna-se visível através do objeto de classe ClsVolume para o programa de chamada.
O código do módulo de classe derivado de ClsVolume.
O código completo do módulo de classe ClsVolume é fornecido abaixo.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() ‘Open ClsArea Object in Memory with the name p_Area Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() ‘Removes the Object p_Area from Memory Set p_Area = Nothing ‘ End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then Volume = p_Area.Area * Me.dblHeight Else MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume" End If End Function ‘ClsArea Class Property Procedures and Method are exposed here Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Eu sei, o que você está pensando agora:como “isso é trabalho duplo, é bom se pudermos, de alguma forma, pular essas etapas de repetir os procedimentos de propriedade ClsArea novamente na classe ClsVolume ”. Ou digamos, poderíamos ter adicionado a propriedade dblWidth na própria ClsArea e executar os métodos Area() e Volume() a partir daí, certo?
O ponto aqui é como um Objeto de Classe Base pode se tornar parte do design de outro Objeto de Classe.
Lembre-se, toda a ideia de projetar um objeto de módulo de classe reutilizável é que os programas principais, usando o Class Object, serão simples e os meandros embutidos no Class Object permanecerão ocultos.
Sim, podemos fazer isso de mais de uma maneira, com um código compacto também. Vamos explorá-los mais tarde, mas por enquanto, vamos continuar com nosso plano original.
O programa principal que usa a classe ClsVolume.
Vamos testar nossa nova classe ClsVolume no programa principal no módulo padrão. O código de exemplo é fornecido abaixo.
Public Sub TestVolume() Dim vol As ClsVolume Set vol = New ClsVolume vol.strDesc = "Warehouse" vol.dblLength = 25 vol.dblWidth = 30 vol.dblHeight = 10 Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume() End With End Sub
Você pode ver como o programa principal é simples, sem as linhas de impressão?
Copie e cole o código em um módulo padrão. Pressione as teclas Ctrl+G para exibir a janela de depuração se ela ainda não estiver no estado aberto. Clique em algum lugar no meio do Código e pressione F5 Chave para executar o Código. A saída de exemplo na janela de depuração é mostrada abaixo.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Descrição Comprimento Largura Altura Área Volume
Armazém 25 30 10 750 7500
Testes de desempenho de verificações de validação.
Executaremos testes para ver se a verificação de validação do valor de entrada da Classe ClsArea da Classe Base funciona quando os valores são passados para ela por meio da Classe ClsVolume. Também realizamos algumas verificações de validação nas funções Area() e Volume().
Vamos experimentá-los um por um:
Primeiro, passaremos um valor negativo para a propriedade ClsArea.dblLength através da classe ClsVolume. Ele deve acionar a mensagem de erro e abrir a função Inputbox() dentro do Do While…Loop para inserir o valor correto.
1. Substitua o Valor 25, na linha Vol.dblLength =25 , com –5 e pressione F5 Chave para executar o Código.
A verificação de validação acionará o erro e solicitará um valor maior que Zero. Insira um valor maior que 0. Depois disso, restaure o valor 25 na linha, substituindo –5.
2. Desative a linha Vol.dblHeight =10 inserindo um símbolo de comentário (') no início da linha, conforme mostrado:'Vol.dblHeight =10 . Após a alteração pressione a tecla F5 para executar o Código.
Como não há nenhum valor de entrada passado para a propriedade, a função Vol.Volume() irá gerar um erro dizendo que todas as três propriedades:dblLength, dblWidth e dblHeight, devem ter valores nelas para executar a função Volume.
Da mesma forma, você também pode verificar o desempenho da função Vol.Area().
Podemos criar uma função de impressão de dados e passar o objeto ClsVolume como parâmetro para a função e imprimir os valores na janela de depuração.
O Código Alterado dos Programas Principais.
O Código alterado para ambos os Programas é dado abaixo:
Public Sub TestVolume() Dim Vol As ClsVolume Set Vol = New ClsVolume Vol.strDesc = "Warehouse" Vol.dblLength = 25 Vol.dblWidth = 30 Vol.dblHeight = 10 Call CVolPrint(Vol) Set Vol = Nothing End Sub
Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume End With End Sub
Na próxima semana vamos construir o Volume Class Object com menos código.
Os links de todas as páginas deste 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 no 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
- Atualizar item do dicionário de objetos de classe no formulário