Access
 sql >> Base de données >  >> RDS >> Access

Accéder au module de classe et aux classes wrapper

Présentation.

Il arrive parfois qu'un module de classe particulier doive être instancié plus d'une fois, pour utiliser un ensemble de valeurs similaire pour une application particulière.

Par exemple, notre module de classe ClsArea, que nous avons conçu pour calculer la surface de moquette des chambres, est un candidat pour des applications similaires. Supposons que nous aimerions savoir combien de carreaux de sol nous devons poser dans une pièce, nous devrions également pouvoir saisir les valeurs de longueur et de largeur de Tile, en plus des valeurs de dimension de Floor. Étant donné que Floor et Tile ont des valeurs de propriété similaires en entrée, nous pouvons utiliser deux instances du module de classe ClsArea, une instance pour la zone FLOOR et la seconde pour la zone TILE. Floor-Area / Tile-Area donne le nombre total de tuiles pour une pièce particulière.

Deux instances du même module de classe.

Nous pouvons le faire en créant deux instances différentes du module de classe ClsArea dans le programme de module standard s'il n'y a qu'une seule pièce.

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

Manipulation d'un tableau d'objets.

Mais que se passe-t-il si nous devons appliquer la méthode ci-dessus pour un ensemble de plusieurs pièces avec différentes tailles ou couleurs de carreaux ? La réponse à cela est de créer un nouveau module de classe avec deux instances du même ClsArea Classe, une instance pour Floor, et l'autre pour les tuiles Propriétés. Les deux instances sont enveloppées dans un nouveau module de classe.

Laissez-nous faire.

  1. Ouvrez votre base de données et affichez la fenêtre d'édition de code (ALT+F11).
  2. Sélectionnez le module de cours de Insérer menu.
  3. Modifier le nom Valeur de la propriété à ClsTiles .
  4. Copiez et collez le code VBA suivant dans le module de classe ClsTiles et enregistrez le code :
    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
    

    Les deux instances, pFLOOR et pTILES sont déclarées comme propriétés privées de l'objet de classe ClsTiles.

    Le Class_Initialize() La sous-routine instancie les deux objets en mémoire lorsque le ClsTiles Le module de classe est instancié dans le programme utilisateur.

    Le Class_Terminate() La sous-routine supprime les deux instances (pFLOOR et pTILES) de la mémoire lorsque l'instance du module de classe ClsTiles est définie sur Nothing dans le programme utilisateur.

    Le Obtenir et Définir Les procédures de propriété permettent la récupération et l'affectation de valeurs, depuis et vers l'instance pFLOOR respectivement, dans l'objet de classe ClsTiles.

    La prochaine procédure de propriété Get et Set permet les mêmes opérations dans l'instance pTILES de la classe ClsArea.

    Nous avons ajouté une nouvelle fonction NoOfTiles() dans le nouveau module de classe, pour calculer le nombre de tuiles, en fonction de la surface au sol et de la dimension des tuiles.

    Écrivons un programme et apprenons l'utilisation de plusieurs instances du même objet de classe, dans un nouveau module de classe :ClsTiles.

  5. Copiez et collez le code VBA suivant dans un module standard :
    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. Gardez la fenêtre de débogage ouverte (CTRL+G) pour imprimer les données de test.
  7. Cliquez quelque part au milieu du code VBA et appuyez sur F5 Clé pour exécuter le code. Le résultat est imprimé sur la fenêtre de débogage.

    Si vous souhaitez calculer les besoins en carreaux de plusieurs pièces ou pièces de plusieurs étages d'un immeuble de grande hauteur, vous devez exécuter le programme ci-dessus plusieurs fois et noter les valeurs, ce qui est pratiquement très difficile.

    Recherche des besoins en carrelage de plusieurs pièces.

    Maintenant, écrivons un autre programme pour trouver les exigences en tuiles de plusieurs pièces, avec un tableau de ClsTiles Objets en saisissant les valeurs de propriété directement à partir du clavier.

  8. Copiez et collez le code VBA suivant dans un module standard.
    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. Gardez la fenêtre de débogage ouverte pour y imprimer la sortie.
  10. Exécutez le code comme avant et entrez les valeurs pour les dimensions du sol et des carreaux pour trois pièces.

Comme vous pouvez le voir dans le code ci-dessus, les deux valeurs des dimensions Room et Tile vont dans la même instance Class Object Array, côte à côte.

Le programme ci-dessus est une démo qui ne s'exécute que pour trois ensembles de valeurs dans For. . . Boucle suivante. Il peut être modifié avec une boucle conditionnelle qui s'exécute le nombre de fois requis jusqu'à ce qu'un code d'arrêt conditionnel mette fin au programme.

Le programme peut être modifié pour enregistrer chaque ensemble de valeurs de données et de résultats de calcul dans un tableau pour référence future.

Une Classe Wrapper est un Conteneur Classe pour les instances d'autres classes, structures de données ou collection d'instances d'autres objets. Ici, nous l'avons utilisé pour contenir deux instances de la même classe Object.

Liste de tous les liens sur ce sujet.

  1. Module de classe MS-Access et VBA
  2. Tableaux d'objets de classe MS-Access VBA
  3. Classe de base MS-Access et objets dérivés
  4. Classe de base VBA et objets dérivés-2
  5. Classe de base et variantes d'objets dérivés
  6. Ensemble d'enregistrements et module de classe MS-Access
  7. Accéder au module de classe et aux classes wrapper
  8. Transformation des fonctionnalités de la classe wrapper
  9. Ms-Access et les bases des objets de collection
  10. Module de classe MS-Access et objet de collection
  11. Enregistrements de table dans l'objet et le formulaire de collection
  12. Principes de base des objets de dictionnaire
  13. Principes de base des objets de dictionnaire-2
  14. Tri des clés d'objet et des éléments du dictionnaire
  15. Afficher les enregistrements du dictionnaire au formulaire
  16. Ajouter des objets de classe en tant qu'éléments de dictionnaire
  17. Ajouter des objets de classe en tant qu'éléments de dictionnaire
  18. Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire