IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Interrogation sur l'utilisation des modules de classes.


Sujet :

Access

  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut Interrogation sur l'utilisation des modules de classes.
    Bonjour,
    J'ai réalisé un première application sous Access assez poussée avec différents formulaires permettant de gérer la production d'encre.
    On me demande de faire une seconde application du même style mais avec quelques trucs en plus et notamment la possibilité d'avoir 2 formulaires identiques ouverts en même temps aves des données différentes.
    J'ai regardé un peu et je suis tombé sur le cours de Maxence HUBICHE sur la multiplication des formulaires.

    Du coup je me suis penché sur les modules de classes et la POO dans Access.
    Je comprends le principe générale mais je n'arrive pas à définir quelles sont les classes qu'il faut créer.

    Par exemple dans le premier projet, j'ai différents formulaires (chargement /maintien/chauffe) pour chaque étapes qui s'enchainent. A l'ouverture et fermeture des formulaires, j'ai crée une fonction permettant d'écrire dans une table journal étape, l'heure, la personne connecté et l'étape du process correspondante. Afin de ne pas écrire le code dans chaque formulaire, je l'ai écrite dans un module classique.
    Est ce que ce genre de fonction peuvent être écrite dans un module de classe?

    Ce que je n'arrive pas à comprendre c'est comment définir les classes et quand différencier l'utilisation d'un module classique d'un module de classes.
    Dans mon cas (voici le lien vers la modélisation: http://www.developpez.net/forums/d15...d-fabrication/), je pensais faire une classe FDM (feuille de marche) dans laquelle je mettrais les différentes méthodes (ouverture/changement d'étape/fermeture/..).

    Qu'en pensez vous?
    Merci d'avance pour vos commentaires
    Fred

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut Interrogation sur l'utilisation des modules de classes

  3. #3
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    OK j'avais lu ça mais ça m'a pas beaucoup plus avancer.
    Je vais essayer de développer et voir au fur et à mesure, je reviendrais vers vous pour savoir ce que vous en pensez.
    Fred

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour.

    J'expérimente moi-même avec les modules de classes dans Access donc je ne me qualifierai pas d'expert sur le sujet :-).

    différencier l'utilisation d'un module classique d'un module de classes
    La grosse différence est que le module de classe peut être "multiplié". Il est donc très bien adapté quand tu besoins d'avoir des données différentes avec les mêmes fonctionnalités.

    Ici un exemple de module de classe que j'ai fait qui illustre cet usage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
    'Version 2015-08-07 07h26
     
    Dim mTempsDebut As Single
    Dim mTempsFin As Single
    Public Nom As String
    Dim mEstArrete As Boolean
    Dim mEstEnregistre As Boolean
     
    Dim mInfoFichier As clsInfoFichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Sub Demarrer(Optional prmNomChrono As String = "", Optional prmEstEnregistre As Boolean = False)
        mTempsDebut = Timer()
     
        If prmNomChrono <> "" Then
                Me.Nom = prmNomChrono
            Else
                Me.Nom = "Chrono " & Format(Now(), "yyyy-mm-dd hh:nn:ss")
        End If
     
        mEstArrete = False
     
        If prmEstEnregistre Then
            mEstEnregistre = prmEstEnregistre
            Set mInfoFichier = New clsInfoFichier
            mInfoFichier.Chemin = CurrentProject.Path
            mInfoFichier.Nom = "_Chrono_" & Me.Nom & "_" & Format(Now(), "yyyy-mm-dd hh\hnn ss\s")
            Call mInfoFichier.AssurerConformiteNom
            mInfoFichier.Extention = "txt"
            mInfoFichier.Numero = FreeFile()
            Open mInfoFichier.Chemin_Nom_Extention For Output As mInfoFichier.Numero
        End If
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub Arreter()
        mTempsFin = Timer()
        mEstArrete = True
     
        If mEstEnregistre Then
            Print #mInfoFichier.Numero, Me.ToString
        End If
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub Afficher()
        Debug.Print ToString
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function ToString() As String
     
        If mEstArrete Then
                ToString = CalculerEcartHMS(mTempsDebut, mTempsFin)
            Else
                ToString = CalculerEcartHMS(mTempsDebut, Timer())
        End If
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Function CalculerEcartHMS(prmTempsDebut As Single, prmTempsFin As Single) As String
        'Calule le temps de traitement et ajoute le nom au résultat.
        Dim result As String
        Dim temps As Single: temps = prmTempsFin - prmTempsDebut
     
        Dim h As Single
        Dim mn As Single
        Dim s As Single
     
        h = Int(temps / 3600)
        mn = Int((temps - (3600 * h)) / 60)
        s = temps - (3600 * h) - (60 * mn)
     
        result = Me.Nom & " = " & Format(h, "#0") & " h " & Format(mn, "#0") & " mn " & Format(s, "#0.000") & " s"
     
        CalculerEcartHMS = result
     
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Class_Terminate()
     
        If Not mEstArrete Then
            Call Me.Arreter
        End If
     
        If mEstEnregistre Then
            Close mInfoFichier.Numero
            Set mInfoFichier = Nothing
        End If
     
    End Sub
    Je peux avoir plusieurs chronomètres actifs en même temps.

    Je me suis aussi surpris à créer des modules de classe quand j'avais besoin de variables de module.
    L'avantage que j'y vois sur les modules classiques c'est que quand on fait un New, toutes les variables locales sont initialisées et on ne risque pas d'avoir une vielle valeur qui traîne d'un traitement précédent.

    Pour les modules classiques, je trouve qu'ils sont bien adaptés quand tu veux faire quelque chose d'unique (ex : un traitement) ou que tu veux faire quelque chose sur ou avec un élément.
    Je les vois un peu comme un caisse à outil. Avec un marteau tu peux planter presque n'importe quel clou et il y a peu d'intérêt à répéter l'action de "planter" sur chaque clou.

    Attention : Access n'autorise pas l'héritage ce qui est un peu frustrant.
    Un collègue m'a montré un manière détourner d'y parvenir : inclure un objet de la classe mère dans la classe enfant. Cela donne quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Mere as clsMere
     
    dim InfoEnfant as string
    Bon cela fait un peu du code à tiroir du genre objEnfant.Mere.FonctionMere lors des appels mais c'est ce qui me paraît la meilleur solution (en lieu et place de l'héritage d'interface qu'on croise dans presque tous les exemples d'héritage).

    Donc je maintiens que VBA n'est pas un langage de programmation objet comme java ou VB.NET mais qu'on peut faire des trucs assez sympas avec ses modules des classes.

    A+

Discussions similaires

  1. Utilisation des modules Arduino SPI sur Labview2010
    Par Aurelied dans le forum LabVIEW
    Réponses: 0
    Dernier message: 10/07/2014, 20h05
  2. [Toutes versions] De la bonne utilisation des modules de classe
    Par JOHN14 dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/04/2014, 10h30
  3. Problème de méthodologie sur l'utilisation des classes
    Par maxime.tuck dans le forum Général Python
    Réponses: 4
    Dernier message: 29/11/2013, 23h39
  4. Compteur sur l'utilisation des index
    Par hkhan dans le forum Administration
    Réponses: 11
    Dernier message: 14/10/2004, 17h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo