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

Classe Base VBA e Objeto Derivado-2

Introdução.


Na semana passada, criamos um objeto de classe derivada ClsVolume, usando a classe ClsArea como classe base. Criamos Procedimentos de Propriedade na Classe Derivada para expor as Propriedades e Funções da Classe Base aos programas do usuário do Objeto. Este método exige a repetição de todos os procedimentos de propriedade da Classe Base na classe derivada também. Aqui, exploramos como criar a mesma classe ClsVolume derivada sem repetir os procedimentos de propriedade da classe ClsArea base.

Aprendemos o uso de Get e Deixe Procedimentos de propriedade em classes. Há mais um procedimento de propriedade usado nas classes:o conjunto Procedimento de propriedade. O procedimento de propriedade de conjunto atribui diretamente um objeto a um objeto de classe do mesmo tipo.

Antes de continuar, você pode visitar as páginas anteriores sobre este tópico, se ainda não o fez, os links são fornecidos abaixo:
  • 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 ClsVolume, a transformação.


Vamos criar uma variante diferente do mesmo módulo de classe ClsVolume, que criamos na semana passada, usando ClsArea como classe base, com uma abordagem diferente e com menos código.

Crie um novo módulo de classe e altere seu valor de propriedade de nome para ClsVolume2 .

Copie e cole o seguinte código no módulo de classe ClsVolume2 e salve o módulo:
Option Compare Database
Option Explicit
'Method two-1
Private p_Height As Double
Private p_Area As ClsArea

Public Property Get dblHeight() As Double
    dblHeight = p_Height
End Property

Public Property Let dblHeight(ByVal dblNewValue As Double)
    p_Height = dblNewValue
End Property

Public Function Volume() As Double
    Volume = p_Area.dblLength * p_Area.dblWidth * p_Height
End Function

'Novo Obter e Definir Procedimento de propriedade para ClsArea ObjectsPublic Property Obter CArea() como ClsArea Definir CArea =p_AreaEnd PropertyPublic Property Definir CArea(ByRef AreaValue como ClsArea) Definir p_Area =AreaValueEnd Property

Selecione Compilar Nome do projeto de Depuração Menu para compilar o código VBA no banco de dados para garantir que todo o código do projeto VBA esteja livre de erros. Se você encontrou um erro em seus outros programas VBA, rastreie o erro, corrija-o e recompile seu projeto. Caso contrário, o VBA IntelliSense que exibe uma lista de propriedades e funções de objetos não funcionará. Isso não nos impedirá de atribuir/recuperar valores de/para Propriedades do Objeto. Mas, durante o aprendizado, é importante ver as Propriedades de um Objeto aparecer e exibir a lista, como um assistente na Codificação.

Obter/Definir em vez do procedimento de propriedade Get/Let.


Omitimos todos os procedimentos de propriedade de ClsArea, criados na última versão da classe ClsVolume, e os substituímos por um Get/Set Procedimentos de propriedade, em vez de Get/Let . Verifique a área de declaração onde declaramos p_Area é declarado como objeto de classe ClsArea.

Quando um Objeto é declarado desta forma, normalmente devemos criar uma instância deste objeto no Procedimento Class_Initialize() no Código acima. Não fizemos isso aqui porque planejamos fazer no programa do usuário e preencher suas Propriedades com os valores apropriados e depois passar para a classe ClsVolume2, antes da fase final de cálculo para usar seus valores.

Anote o Set CArea() procedimento. Seu parâmetro ByRef AreaValue é declarado como ClsArea Object. Ele aceitará o objeto de classe ClsArea quando passado para o Property Set CArea(ByRef AreaValue as ClsArea) , na variável de objeto AreaValue, e atribui à p_Area Propriedade de ClsVolume2 Objeto.

O Obter CArea() O procedimento de propriedade retorna o objeto para o programa de chamada.

Em nossos programas anteriores, escrevemos procedimentos de propriedade para elementos individuais (comprimento, largura, altura) de um objeto para atribuir/retornar valores Para/De eles. Aqui, a diferença é que estamos passando um Object inteiro como um Parameter para o Set Procedure. Para recuperar o valor da propriedade deste objeto (digamos, lblHeight), devemos tratá-lo como CArea.dblLength . O Obter/Definir Nome do procedimento de propriedade CArea torna-se o objeto filho do Objeto principal quando declarado no Programa Principal e seus Procedimentos de Propriedade podem ser acessados ​​diretamente através do Endereço do Objeto Vol.CArea.dblLength.

Um programa de teste no módulo padrão.


Vamos escrever um pequeno programa no Módulo Padrão para testar nosso novo objeto de classe derivado ClsVolume2.

Insira um novo módulo padrão em seu projeto. Copie e cole o seguinte código no módulo e salve o código:
Public Sub SetNewVol2_1()
'Method 1/2
Dim Vol As New ClsVolume2

'ClsArea Object instantiated and passed to the
'Property Procedure Set CArea in ClsVolume2.

Set Vol.CArea = New ClsArea 'declare and instantiate the object in one statement

Stop

Vol.CArea.strDesc = "Bed Room"
Vol.CArea.dblLength = 90
Vol.CArea.dblWidth = 10

Vol.dblHeight = 10 'assign height to ClsVolume2

Stop

Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume"
Debug.Print Vol.CArea.strDesc, Vol.CArea.dblLength, Vol.CArea.dblWidth, Vol.CArea.Area, Vol.dblHeight, Vol.Volume

Set Vol.CArea = Nothing
Set Vol = Nothing

End Sub

Revisão de código linha por linha.


.Vamos dar uma olhada rápida no código VBA acima. A primeira linha instancia a classe ClsVolume2 com o nome Vol. Após as próximas duas linhas de comentários, o Set declaração com o Vol.CArea O procedimento de propriedade é chamado e passa o Novo instanciado ClsArea Objeto como parâmetro.

Eu coloquei um Parar instrução na próxima linha para dar uma pausa no Programa para ver como o objeto está sendo atribuído ao Set Área Objeto. Como? vamos explorar isso em um minuto?

As próximas quatro linhas atribuem valores ao objeto ClsArea e à propriedade Height do objeto ClsVolume2.

A próxima Parada cria uma pausa no Programa para que possamos inspecionar a memória de como os valores são mantidos na memória.

A próxima linha imprime os títulos na janela de depuração para os valores impressos na próxima linha.

A próxima linha imprime os valores das Propriedades do Objeto da memória na Janela de Depuração.

Execute o código até a próxima instrução de parada


Vamos rodar o Código e inspecionar a memória para ver o que acontece lá em cada estágio, onde coloco a instrução Stop.


  1. Clique em algum lugar no meio do código e pressione F5 para executar o código e pausar o programa na primeira Instrução de parada.
  2. Selecione Janela Locais de Visualizar Menu para abrir uma nova janela abaixo da Janela de Código, para exibir como os Objetos ClsArea e ClsVolume2, suas propriedades e seus procedimentos de propriedade de membro são mantidos na memória. Uma imagem de amostra da Janela Locais é dado abaixo.

    A Janela Locais Visualizar.



  3. Arraste as alças de dimensionamento de outras janelas para cima para reduzir sua altura e dar mais espaço para a exibição de Locals Janela. Melhor, feche a janela de depuração, por enquanto, use Ctrl+G para trazê-la de volta quando necessário mais tarde.

    Podemos ter uma visão gráfica de todos os objetos e suas propriedades na seção Locals Janela. O primeiro nome com o símbolo de mais [+] mostra o nome do Módulo Padrão, de onde nosso programa está sendo executado.

    O próximo símbolo [+] com o nome Vol é o objeto instanciado ClsVolume2 na memória.
  4. Clique nos símbolos [+] para expandir e exibir os detalhes.





    Você encontrará o próximo nível de Objetos e Propriedades.

    A [+]Área indica que este Objeto possui o próximo nível de Propriedades e seus Valores.

    A dblHeight A propriedade Get Procedure vem diretamente sob o Vol Object.

    A [+]p_Area é a propriedade privada declarada como ClsArea Classe na classe ClsVolume2.

    A p_Altura também é a Propriedade Privada declarada no ClsVolume2.
  5. Clique no sinal de adição [+] símbolos para expandir os objetos para mostrar suas Propriedades e Valores.





    A expansão de [+]CArea nos dá a visão do objeto ClsArea que passamos para o procedimento de propriedade Set CArea().

    A expansão de [+]p_Area dá a visão da propriedade ClsArea declarada como privada.

    Observe a p_Area Propriedade privada, do objeto de classe ClsVolume2, e todos os seus elementos são acessíveis apenas através da CArea Propriedade do objeto Get/Set Procedimentos para o mundo exterior.

    A segunda coluna da janela Locais mostrará os valores atribuídos às Propriedades do Objeto e atualmente nenhum valor neles.

    A terceira coluna mostra os nomes dos módulos de tipo de dados ou classe de objeto.
  6. Pressione F5 para executar o programa ainda mais, até que ele seja pausado na próxima instrução Stop, para atribuir alguns valores às Propriedades do Objeto. O programa fará uma pausa na próxima Parada demonstração. Verifique a janela Locals para alteração de valores.





Dentro da Área Objeto as duas primeiras linhas com valores 90, 10 e o último strDesc com valor "Bed Room" são o Get Procedimentos de propriedade. O p_Desc, p_Length e p_width são valores atribuídos por meio de Set Procedimentos de propriedade para p_Area Propriedade do objeto de classe ClsVolume2.

A p_Area O objeto da classe ClsArea declarado como propriedade privada de ClsVolume2 é visto com seu Get/Set Procedimentos de propriedade e valores atribuídos.

Verifique o Tipo Coluna de [-]CArea e [-]p_Area ambos os objetos são derivados da classe base ClsArea.

Uso de objetos de classe ClsArea e ClsVolume2 de forma diferente.


Na próxima semana tentaremos outra abordagem com os mesmos dois objetos. Se você quiser tentar você mesmo, aqui está a pista de como experimentá-lo você mesmo.
  1. Instanciar ClsVolume2 e ClsArea Class como dois objetos diferentes no programa de módulo padrão.
  2. Atribua valores às duas propriedades do objeto.
  3. Atribua o objeto instanciado ClsArea ao CArea Object no objeto de classe ClsVolume2, antes de imprimir os valores na janela de depuração.

Neste exemplo, podemos obter o mesmo resultado que fizemos no exemplo acima, sem repetir os procedimentos de propriedade Get/Let como fizemos no módulo de classe ClsVolume.

Os links de todas as páginas deste 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 no 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