Sécurité Mécapoulets

Archives Google         Base de connaissance       Forum Access        Sommaire   
Présentation Access 2007          Articles indispensables de la base de connaissance   
Téléchargement    Librairies    Abonnement   
Module de classe  VBA OfficeSystem.Access 2000 - 2007    
Blog 2000-2003
Blog 2007
Annuaire
Accueil
Module de classe clsDates
Module de classe clsFileName
Module de classe clsForms
Module de classe clsTables

Le Runtime Access 2007 français est disponible




Nous allons aborder le sujet le moins documenté d'Access, le moins utilisé par les développeurs et le plus repoussé par les débutants. De quoi ne pas aller au bout de la page. Soyez persévérants car lorsque vous aurez compris le fonctionnement des modules de classe vous ne pourrez plus vous en passer.

Une classe est un objet de formulaire ou d'état ou un objet personnalisé indépendant. Nous avons déjà vu les objets de formulaire et d'état dans toutes les autres pages et nous allons nous intéresser aux objets personnalisés indépendants.

Les objets personnalisés sont décrits dans un module de classe. Si vous créez un module de classe vous créez un nouvel objet personnalisé, si vous voulez créer un nouvel objet personnalisé, vous créez un module de classe.
Un module de classe est indépendant et autonome, il se suffit à lui-même et n'est subordonné à aucun autre objet. Le nom de l'objet porte le nom du module de classe.

Pour illustrer les exemples vous téléchargez la base Classes.mdb en cliquant ici. Cette base contient un formulaire avec un bouton seulement et un module de classe personnalisé. Chargez cette base pour suivre les explications qui vont suivre.

Une classe est formé d'événements, de méthodes et de propriétés. Les seuls événements seront Class_Initialize et Class_Terminate. Les méthodes seront en général des procédures Sub qui réaliseront des calculs avec les propriétés en cours mais qui ne retourneront pas de données, mais des procédures Function peuvent être utilisées pour retourner une valeur mais sont très peu utilisées. Les propriétés seront définies par les procédures Property Let  ( jusqu'à End Property) et les valeurs seront lues par les procédures Property Get ( jusqu'à End Property). La procédure Property Get remplace la procédure Function habituellement utilisée.

L'exemple de base que vous avez sous les yeux est l'exemple le plus simple d'un module de classe et vous allez comprendre immédiatement son fonctionnement.

Vous désirez calculer l'aire d'un rectangle dans votre formulaire et vous ne voulez pas passer votre temps à faire le calcul lui-même mais vous voulez donner les dimensions et connaître le résultat. Vous voulez aussi que ce même calcul soit disponible dans une autre base de données (en dupliquant le module) avec les mêmes éléments à fournir. Vous venez de créer un objet Rectangle et nous allons le décrire dans un module de classe nommé Rectangle. Ce module de classe va calculer la surface du rectangle en fonction des valeurs fournies par l'utilisateur.

Création du module de classe:

Pour pouvoir fournir l'aire d'un rectangle, il faut connaître la largeur et la hauteur, donc nous décrivons deux variables de type Double (pour être sûrs de gérer des valeurs importantes). Ces deux variables sont déclarées Private et ne seront donc atteintes que dans la base de données active.

Private LaHauteur As Double
Private LaLargeur As Double

Nous allons donner des valeurs par défaut à ces variables lors de la première exécution de la classe, c'est-à-dire lors de l'événement Class_Initialize qui sera exécuté au départ et une seule fois.

Private Sub Class_Initialize()
    LaHauteur = 1
    LaLargeur = 1
End Sub

Donc, même si aucune valeur n'est chargée par l'utilisateur les calculs seront faits avec les valeurs 1 dans les dimensions du rectangle.

Il faut maintenant décrire les procédures permettant de charger les propriétés de l'objet Rectangle, c'est-à-dire la dimension des côtés. Pour cela nous utilisons les procédures Property Let:

Public Property Let Hauteur(Valeur As Double)
    LaHauteur = Valeur
End Property
Public Property Let Largeur(Valeur As Double)
    LaLargeur = Valeur
End Property

La propriété Hauteur par exemple va prendre la valeur composée par l'utilisateur (Valeur) et la placer dans la variable LaHauteur. Idem pour la largeur.

Il faut maintenant décrire les procédures qui vont retourner à l'utilisateur la valeur des propriétés. Non seulement on pourra retourner l'aire du rectangle mais également la hauteur et la largeur. Pour cela on utilisera les procédures Property Get. On voit déjà qu'on peut récupérer à tout moment la valeur d'une propriété et qu'il n'y a pas besoin de l'avoir dans son application.

Public Property Get Hauteur() As Double
    Hauteur = LaHauteur
End Property
Public Property Get Largeur() As Double
    Largeur = LaLargeur
End Property
Public Property Get Aire() As Double
    Aire = LaHauteur * LaLargeur
End Property

Lorsque l'utilisateur va demander l'aire du rectangle la procédure va lui fournir directement le résultat du calcul de la hauteur par la largeur. On voit bien ici qu'on n'a pas besoin de connaître le calcul dans l'application car la classe va le faire automatiquement.

La classe est terminée, l'objet est décrit, il est utilisable immédiatement dans les applications.

 

Utiliser une classe:

Maintenant, plaçons nous du côté de l'application. Nous savons que nous avons un module de classe nommé Rectangle qui peut nous rendre des services. Il peut calculer une aire de rectangle en lui donnant les dimensions des côtés alors que nous ne savons pas le faire. Nullement besoin de savoir le faire l'objet rectangle s'en charge automatiquement dans toutes mes bases de données.

Il faut commencer par déclarer l'objet rectangle dont nous avons besoin.

Dim Rect As New Rectangle

Le mot clé New est obligatoire car il faut déclarer et utiliser une nouvelle instance de l'objet rectangle. Donc toujours utiliser New avec le Dim. Cette déclaration sera générale au module et sera accessible par toutes les procédures du module si vous la placez comme ici dans les déclaratives. Elle peut être placée dans une procédure si la portée est limitée à cette procédure.

Nous allons décrire la procédure à exécuter sur l'événement Click du bouton de commande nommé Commande0. Nous voulons donner deux dimensions et afficher l'aire d'un rectangle.

Private Sub Commande0_Click()
    Rect.Hauteur = 3
    Rect.Largeur = 5

Pour indiquer les dimensions c'est-à-dire les propriétés de l'objet rectangle nommé Rect, nous indiquons le nom de l'objet (Rect) suivi d'un point pour indiquer que ce qui suit est une propriété. Access présente la liste des méthodes et propriétés de l'objet et vous sélectionnez Hauteur par exemple. Vous tapez = qui est le signe d'affectation de valeur à une propriété suivi de la valeur 3. Rapprochez ces deux lignes des procédures Property Let du module de classe. Nous avons défini les dimensions des côtés de notre rectangle et nous les affichons pour contrôler:

    MsgBox "j'ai défini un rectangle de hauteur " & Rect.Hauteur _
                      & " et de largeur " & Rect.Largeur

Le message sera : j'ai défini un rectangle de hauteur 3 et de largeur 5
Immédiatement derrière nous affichons l'aire du rectangle:

    MsgBox "sa surface est de " & Rect.Aire

Le message sera : sa surface est de 15

Votre procédure est terminée et en trois lignes vous avez affiché un calcul qui aurait demandé des heures de travail !

Vous avez compris le fonctionnement de l'application et je vous laisse découvrir seul le fonctionnement des lignes suivantes:

    Rect.AllongerCôtés (1.5)
    MsgBox "j'ai rallongé les côtés" & vbCrLf _
        & "j'ai défini un rectangle de hauteur " & Rect.Hauteur _
                              & " et de largeur " & Rect.Largeur
    MsgBox "sa surface est de " & Rect.Aire
End Sub

Bien entendu, la complexité ou la simplicité d'un tel objet est rare mais il a dû vous permettre de comprendre le mécanisme des modules de classe et des objets personnalisés indépendants. Si c'est le cas, l'objectif a été atteint, sinon reprenez point par point l'objet , votre application et les messages affichés et persévérez quelques minutes.

Une dernière remarque pour terminer. On peut déclarer autant d'instances qu'on veut de l'objet Rectangle dans le même module, chaque instance étant indépendante et ayant ses propres propriétés (valeurs des côtés):

Dim Rect1 As New Rectangle
Dim Rect2 As New Rectangle
Rect1.Hauteur = 3
Rect1.Largeur = 5
Rect2.Hauteur = 10
Rect2.Largeur = 20
MsgBox Rect1.Aire 
MsgBox Rect2.Aire

Maintenant que vous avez compris comment fonctionnent ces objets, pourquoi ne pas créer un objet Texte ou Dates pour regrouper toutes les fonctions similaires au lieu d'avoir des dizaines de fonctions réparties sur plusieurs modules standards ou de formulaires ?

Pour commencer à vous habituer, vous trouverez le module de classe clsDates en cliquant sur le menu module de classe clsDates ci-contre à gauche. cette classe peut être immédiatement utilisée dans vos applications.