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

Classe de base MS-Access et objets dérivés

Présentation.

Si vous n'avez pas vu les messages précédents sur le module de classe Microsoft Access, veuillez les parcourir avant de continuer, les liens sont indiqués ci-dessous.

  1. Module de classe MS-Access et VBA.
  2. Tableau d'objets de classe MS-Access VBA.

La ClsArea La classe peut fonctionner comme une classe de base dans un autre objet de classe, le calcul effectué par la classe de base peut être utilisé dans le cadre des calculs du nouvel objet. Par exemple, il peut faire partie d'un objet qui calcule le volume de quelque chose,

Le dbl en dblLength et dblWidth Noms de procédure de propriété pour Get/Let Les procédures sont simplement une indication que l'objet de classe attend les valeurs de longueur et de largeur en nombres à double précision. De même, si nous modifions les noms de procédure de propriété en quantité et en prix unitaire, la première valeur multipliée par la deuxième valeur nous donne le prix total d'un article.

Cela signifie simplement que vous pouvez utiliser la classe ClsArea comme classe de base, partout où vous avez besoin du résultat de la première valeur multipliée par la deuxième valeur, comme Prix total * Taux de taxe pour calculer le montant de la taxe ou Prix total * Taux de remise pour trouver le montant de la remise etc.

Même si nous avons développé un module de classe simple, il peut faire partie de nombreuses autres classes dérivées. Les possibilités sont ouvertes à votre imagination et à votre créativité.

Notre classe ClsArea calcule la surface des matériaux, des pièces ou d'éléments similaires avec des propriétés de longueur et de largeur uniquement. Il ne calcule pas l'aire du triangle ou du cercle. Mais, il peut faire partie d'un nouvel objet de classe qui calcule le volume des pièces, des entrepôts pour trouver la capacité de stockage. Pour cela, nous avons besoin d'une valeur supplémentaire pour la hauteur de la pièce, de l'entrepôt, etc.

La classe de volume :ClsVolume.

Créons un nouveau module de classe ClsVolume, en utilisant ClsArea comme classe de base. Insérez un module de cours et modifiez son nom Propriété de ClsVolume . Tapez ou copiez et collez le code suivant dans le module de cours.

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

Le code de l'objet de classe ClsVolume n'est pas encore complet. Examinons le code ligne par ligne. Dans la troisième ligne déclarée comme propriété privée p_Area de l'objet de classe ClsArea.

La ligne suivante déclare une propriété privée avec le nom p_Height de type de données Double.

Les sous-routines Class_Initialize() et Class_Terminate().

Les deux sous-routines suivantes (Initialize() et Terminer() ) sont très importants ici.

Le Initialiser() exécute et instancie l'objet ClsArea en mémoire lorsque nous utilisons et instancions la Classe ClsVolume Objet dans notre programme de module standard.

Lorsque nous exécutons la déclaration Set ClsVolume =Nothing dans le programme du module standard, pour effacer l'objet ClsVolume de la mémoire, le Terminate() La sous-routine s'exécute et libère l'espace mémoire occupé par l'objet ClsArea.

La propriété Get dblHeight La procédure renvoie la valeur de p_Height Propriété au programme appelant.

La propriété Soit dblHeight La procédure valide la valeur passée à NewValue paramètre et l'affecte dans la propriété privée p_Height .

La Fonction Publique Volume() calcule le Volume, en appelant la p_Area.Area() La fonction et la valeur de surface renvoyée sont multipliées par p_Height pour calculer Volume, avec l'expression :Volume =p_Area.Area * p_Height. Mais, avant d'exécuter cette instruction, nous effectuons un contrôle de validation pour nous assurer que la fonction p_Area.Area() renvoie une valeur supérieure à zéro, indiquant que les propriétés p_Area.dblLength, p_Area.dblWidth contiennent des valeurs valides et que la valeur de la propriété p_Height est supérieure à zéro.

Remarque : Depuis, la p_Area L'objet de la classe ClsArea est défini comme Privé Propriété de la classe ClsVolume, nous devons créer ses propriétés (strDesc, dblLength, dblWidth et Zone() fonction) visible du monde extérieur pour Get/Let Opérations et pour retourner la valeur de la zone. Cela signifie que nous devons également définir les procédures de propriété Get/Let pour les propriétés strDesc, dblLength, dblWidth et Area() de l'objet de classe ClsArea dans le module de classe ClsVolume.

Les procédures Let/Get Property.

Ajoutez la propriété suivante Get/Let Procédures et Area() fonction au code du module 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

Vérifiez les procédures de propriété strDesc() Get/Let lignes de code. L'utilisation du nom de procédure strDesc est simplement une question de choix, si vous souhaitez utiliser un nom différent, vous êtes le bienvenu. Mais, le nom de propriété d'origine que nous avons utilisé dans la classe ClsArea est strDesc. L'utilisation de ce nom d'origine ici nous rappelle la relation avec l'objet de classe ClsArea d'origine.

Dans la prochaine procédure de propriété Get dblLength(), l'expression à droite de = signe p_Area.dblLength lit la valeur dblLength stockée dans l'objet de classe ClsArea et retourne au programme appelant.

La procédure de propriété Let affecte la valeur du paramètre dans la variable NewValue à la propriété p_Area.dblLength de l'objet de classe ClsArea. Ici, nous n'exécutons aucun contrôle de validation sur la valeur reçue dans la variable de paramètre NewValue. Le contrôle de validation sera effectué dans la classe ClsArea elle-même lorsque nous attribuerons la valeur à p_Area.dblLength propriété.

De même, les procédures de propriété Get/Let sont également ajoutées pour la propriété p_Area.dblWidth,

Ensuite, le p_Area.Area() La fonction est rendue visible via l'objet de classe ClsVolume pour le programme appelant.

Le code du module de classe dérivée ClsVolume.

Le code complété du module de classe ClsVolume est donné ci-dessous.

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

Je sais, ce que vous pensez maintenant:comme "c'est un double travail, c'est bien si nous pouvons, d'une manière ou d'une autre, ignorer ces étapes de répétition des procédures de propriété ClsArea dans la classe ClsVolume". Ou disons, nous aurions pu ajouter la propriété dblWidth dans la ClsArea elle-même et exécuter les méthodes Area() et Volume() à partir de là, n'est-ce pas ?

L'essentiel ici est de savoir comment un objet de classe de base peut faire partie de la conception d'un autre objet de classe.

Rappelez-vous, toute l'idée de concevoir un objet de module de classe réutilisable est que les programmes principaux, utilisant l'objet de classe, seront simples et que les complexités intégrées à l'objet de classe resteront cachées.

Oui, nous pouvons le faire de plusieurs manières, avec un code compact également. Nous les explorerons plus tard, mais pour l'instant, continuons avec notre plan initial.

Le programme principal qui utilise la classe ClsVolume.

Testons notre nouvelle classe ClsVolume dans le programme principal du module standard. L'exemple de code est donné ci-dessous.

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

Vous pouvez voir à quel point le programme principal est simple, sans les lignes d'impression ?

Copiez et collez le code dans un module standard. Appuyez sur les touches Ctrl+G pour afficher la fenêtre de débogage si elle n'est pas déjà ouverte. Cliquez quelque part au milieu du code et appuyez sur F5 Clé pour exécuter le code. L'exemple de sortie de la fenêtre de débogage est illustré ci-dessous.

Description   Length        Width         Height        Area          Volume
Warehouse      25            30            10            750           7500 

Description Longueur Largeur Hauteur Surface Volume
Entrepôt 25 30 10 750 7500

La validation vérifie les tests de performance.

Nous allons exécuter des tests pour voir que le contrôle de validation de la valeur d'entrée de la classe de base ClsArea fonctionne lorsque les valeurs lui sont transmises via la classe ClsVolume. Nous avons également effectué des vérifications de validation dans les fonctions Area() et Volume().

Essayons-les un par un :

Tout d'abord, nous allons passer une valeur négative à la propriété ClsArea.dblLength via la classe ClsVolume. Cela devrait déclencher le message d'erreur et ouvrir la fonction Inputbox() dans la boucle Do While… pour saisir la valeur correcte.

1. Remplacez la valeur 25, dans la ligne Vol.dblLength =25 , avec –5 et appuyez sur F5 Clé pour exécuter le code.

Le contrôle de validation déclenchera l'erreur et demandera une valeur supérieure à zéro. Entrez une valeur supérieure à 0. Après cela, restaurez la valeur 25 dans la ligne, en remplaçant -5.

2. Désactivez la ligne Vol.dblHeight =10 en insérant un symbole de commentaire (') au début de la ligne comme indiqué :‘Vol.dblHeight =10 . Après le changement, appuyez sur la touche F5 pour exécuter le code.

Puisqu'il n'y a pas de valeur d'entrée transmise à la propriété, la fonction Vol.Volume() générera une erreur indiquant que les trois propriétés :dblLength, dblWidth et dblHeight doivent contenir des valeurs pour exécuter la fonction Volume.

De même, vous pouvez également vérifier les performances de la fonction Vol.Area().

Nous pouvons créer une fonction d'impression de données et transmettre l'objet ClsVolume en tant que paramètre à la fonction et imprimer les valeurs dans la fenêtre de débogage.

Le code modifié des programmes principaux.

Le code modifié pour les deux programmes est indiqué ci-dessous :

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

La semaine prochaine, nous construirons l'objet de classe de volume avec moins de code.

Les liens de toutes les pages 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. Mettre à jour l'élément du dictionnaire d'objets de classe sur le formulaire