Intégrer un planning basé sur le module de classe clPlanner

Objectif : Intégrer dans votre projet Access un planning basé sur le module de classe clPlanner.

Niveau requis : avancé.

Commentez cet article : 30 commentaires Donner une note  l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

L'objectif de cet article est de décrire la mise en place, dans un formulaire Access, d'un planning basé sur le module de classe clPlanner.

Ce type de planning a l'avantage d'être très souple et peut être paramétré suivant une orientation horizontale ou verticale, sur une semaine, quinze jours, un mois, etc.

Il pourra donc servir d'agenda ou de planning selon les besoins et être facilement intégré dans votre projet Access.

Image non disponible
Rendu du planning

Pour mieux comprendre la procédure d'intégration, on décomposera l'article en quatre parties principales :

  • le module clGdiPlus ;
  • le module de classe clPlanner ;
  • les objets principaux nécessaires à l'intégration du planning ;
  • le résultat de l'intégration.

II. Classe de gestion d'images clGdiPlus

clGdiPlus est un module de classe VBA pour faciliter l'utilisation de la bibliothèque graphique gdiplus.dll (vous pouvez la télécharger ici). clGdiPlus permet de gérer des images et de dessiner dans un contrôle image.

Importer ce fichier dans votre projet.

III. Module de classe clPlanner

Il est basé sur le module de classe de gestion des images clGdiPlus. Il permet de dessiner un planning dans un contrôle image : dessin du quadrillage, des en-têtes de lignes et de colonnes, mais aussi des rectangles représentant les tâches sur le planning, tout ceci en fonction de paramètres enregistrés dans une table.

Nous présentons ici les principales propriétés et méthodes de ce module.

Vous pouvez bien sûr ajouter de nouvelles propriétés ou de nouvelles méthodes, ou encore modifier les propriétés existantes, si vous souhaitez inclure de nouvelles fonctionnalités à vos plannings. Nous donnerons à ce sujet un exemple simple d'ajout d'une méthode à la fin de cette section.

III-A. Propriétés de paramétrage du planning

Ces propriétés vont permettre de paramétrer le planning au moment de sa création.

III-A-1. ObjectType

Vous pouvez utiliser la propriété ObjectType pour indiquer le type d'objet du planning (Header ou Planning). Texte en lecture/écriture.

Exemple

Le code suivant indique que l'objet obPlanner est de type planning.

 
Sélectionnez
obPlanner.ObjectType="Planning"

III-A-2. ParametersSource

Vous pouvez utiliser la propriété ParametersSource pour indiquer la table contenant les paramètres du planning. Texte en lecture/écriture.

Exemple

Le code suivant spécifie la table T_Parametres comme table de paramètres du planning.

 
Sélectionnez
obPlanner.ParametersSource="T_Parametres"

III-A-3. DataSource

Vous pouvez utiliser la propriété DataSource pour indiquer la table contenant les données du planning. Texte en lecture/écriture.

Exemple

Le code suivant spécifie la table T_PlanningTache comme table de données du planning.

 
Sélectionnez
obPlanner.DataSource="T_PlanningTache"

Si la propriété DataSource contient une chaîne vide, alors le planning n'est relié à aucune source de données.

III-A-4. Row

Vous pouvez utiliser la propriété Row pour définir ou connaître la ligne sélectionnée sur le planning. Entier en lecture/écriture.

Exemple

Le code suivant définit la ligne 3 comme ligne sélectionnée sur le planning.

 
Sélectionnez
obPlanner.Row=3

III-A-5. Col

Vous pouvez utiliser la propriété Col pour définir ou connaître la colonne sélectionnée sur le planning. Entier en lecture/écriture.

Exemple

Le code suivant définit la colonne 3 comme colonne sélectionnée sur le planning.

 
Sélectionnez
obPlanner.Col=3

III-A-6. Rows

Vous pouvez utiliser la propriété Rows pour définir ou connaître le nombre de lignes du planning. Entier en lecture/écriture.

Exemple

Le code suivant définit 30 lignes pour le planning.

 
Sélectionnez
obPlanner.Rows=30

III-A-7. Cols

Vous pouvez utiliser la propriété Cols pour définir ou connaître le nombre de colonnes du planning. Entier en lecture/écriture.

Exemple

Le code suivant définit 7 colonnes pour le planning.

 
Sélectionnez
obPlanner.Cols=7

III-A-8. RowsHeight

Vous pouvez utiliser la propriété RowsHeight pour ajuster la hauteur des lignes du planning à des dimensions spécifiques. Entier en lecture/écriture.

Exemple

Le code suivant ajuste la hauteur des lignes du planning à 25 pixels.

 
Sélectionnez
obPlanner.RowsHeight=25

III-A-9. ColsWidth

Vous pouvez utiliser la propriété ColsWidth pour ajuster la largeur des colonnes du planning à des dimensions spécifiques. Entier en lecture/écriture.

Exemple

Le code suivant ajuste la largeur des colonnes du planning à 125 pixels.

 
Sélectionnez
obPlanner.ColsWidth=125

III-A-10. BackColor

Utiliser la propriété BackColor pour spécifier la couleur de fond du planning. Long en lecture/écriture.

Exemple

Le code suivant colorie en blanc le fond du planning.

 
Sélectionnez
obPlanner.BackColor=vbWhite

III-A-11. GridColor

Vous pouvez utiliser la propriété GridColor pour spécifier la couleur du quadrillage du planning. Long en lecture/écriture.

Exemple

Le code suivant colorie en noir la grille (les lignes) du planning.

 
Sélectionnez
obPlanner.GridColor=vbBlack

III-A-12. FieldsCols

Vous pouvez utiliser la propriété FieldsCols pour définir le nombre de colonnes pour les en-têtes de lignes situés à gauche du planning. Entier en lecture/écriture.

Exemple

Le code suivant définit deux colonnes à gauche du planning pour les en-têtes de lignes.

 
Sélectionnez
obPlanner.FieldsCols=2

III-A-13. FieldsColsWidth

Utiliser la propriété FieldsColsWidth pour ajuster la largeur des colonnes pour les en-têtes de lignes. Entier en lecture/écriture.

Exemple

Le code suivant ajuste la largeur des colonnes de gauche du planning (en-têtes de lignes) à 100 pixels.

 
Sélectionnez
obPlanner.FieldsColsWidth=100

III-A-14. FieldsBackColor

Vous pouvez utiliser la propriété FieldsBackColor pour spécifier la couleur de fond pour les en-têtes de lignes situés à gauche du planning. Long en lecture/écriture.

Exemple

Le code suivant colorie en gris les colonnes de gauche (en-têtes de lignes) du planning.

 
Sélectionnez
obPlanner.FieldsBackColor=vbGrey

III-B. Méthode d'initialisation de l'image

Elle permet de spécifier le contrôle sur lequel on va dessiner et de définir les paramètres du planning. Ensuite, la procédure d'initialisation va préparer l'image pour qu'elle soit conforme aux dimensions du contrôle.

III-B-1. InitImage

Initialise et définit l'image pour qu'elle soit conforme aux dimensions du contrôle image.

Exemple

Le code suivant initialise et définit l'image du planning pour qu'elle soit conforme aux dimensions du contrôle image imgPlanning.

 
Sélectionnez
obPlanner.InitImage

III-C. Méthodes d'initialisation et d'actualisation du planning

III-C-1. Clear

Cette méthode redessine le planning d'origine (quadrillage vide).

Extrait de son code

 
Sélectionnez
obPlanner.Clear

III-C-2. Refresh

Cette méthode met à jour le contrôle image en fonction des dernières modifications qui ont été apportées à l'objet associé.

Cette procédure doit être appelée après chaque modification de l'objet obPlanner, instance de la classe clPlanner, afin d'actualiser le contrôle associé.

Exemple

Le code suivant actualise le contrôle image imgPlanning du sous-formulaire SF_Planning et redessine donc le planning sur ce contrôle.

 
Sélectionnez
obPlanner.refresh

III-D. Méthodes de dessin sur le planning

III-D-1. DrawRect

Dessine un rectangle délimité par les coordonnées de début (Row1,Col1), correspondant à la région en haut à gauche, et les coordonnées de fin (Row2,Col2), correspondant à la région en bas à droite.

Paramètres :

Paramètre

Type

Explication

Row1,Col1,Row2,Col2

Integer

Coordonnées du rectangle à dessiner sur le planning.

BackColor

Long

Couleur de remplissage. Mettre -1 pour un rectangle transparent.

PenColor

Long

Couleur de la ligne.

PenWidth

Long

Épaisseur de la ligne.

Exemple

Le code suivant dessine un rectangle avec un fond bleu et une bordure noire sur la 1re ligne, de la 1re colonne à la 3e colonne du planning.

 
Sélectionnez
obPlanner.DrawRect 1, 1, 1, 3, vbBlue, vbBlack, 1

III-D-2. DrawText

Cette méthode permet d'écrire du texte dans le rectangle délimité par les coordonnées de début (Row1,Col1), correspondant à la région en haut à gauche, et les coordonnées de fin (Row2,Col2), correspondant à la région en bas à droite.

Paramètre

Type

Explication

Row1,Col1,Row2,Col2

Integer

Coordonnées du rectangle.

Text

String

Texte à écrire. Peut contenir des retours à la ligne (vbCrLf).

TextSize

Long

Taille du texte en pixels.

AlignHoriz

Long

Alignement horizontal (0 : Gauche, 1 : Centre, 2 : Droite).

AlignVert

Long

Alignement vertical (0 : Haut, 1 : Centre, 2 : Bas).

Exemple

Le code suivant écrit le texte « Dupont » dans le rectangle de coordonnées (1,1,1,3).

 
Sélectionnez
obPlanner.DrawText 1, 1, 1, 3, "DUPONT", 12, 0,0 vbBlue

III-D-3. DrawFieldText

Cette méthode permet d'écrire du texte dans la zone de coordonnées (Row,Col) et situé à gauche sur le planning (en-têtes de lignes).

Paramètre

Type

Explication

Row, Col

Integer

Coordonnées de la zone située à gauche sur le planning.

Text

String

Texte à écrire. Peut contenir des retours à la ligne (vbCrLf).

TextSize

Long

Taille du texte en pixels.

AlignHoriz

Long

Alignement horizontal (0 : Gauche, 1 : Centre, 2 : Droite).

AlignVert

Long

Alignement vertical (0 : Haut, 1 : Centre, 2 : Bas).

Exemple

Le code suivant écrit le texte « DWC » dans la zone située à gauche du planning et de coordonnées (1: 1re ligne, 2: 2e colonne).

 
Sélectionnez
obPlanner.DrawFieldText 1, 2, "DWC", 12, 0, 0, vbBlue

III-E. Méthode pour identifier le rectangle à partir des coordonnées (X,Y)

III-E-1. SelectRect

Identifie le rectangle situé sur un point de coordonnées (X,Y).

Paramètres :

Paramètre

Type

Explication

X

Long

Position X du point sur le planning.

Y

Long

Position Y du point sur le planning.

Exemple

Le code suivant renvoie en paramètres les coordonnées du rectangle situé sur le point de coordonnées (X,Y).

 
Sélectionnez
Private Sub ImgPlanning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' on sélectionne la région correspondant à la position cliquée de coordonnées X et Y
    obPlanner.SelectRect CLng(X), CLng(Y)
End Sub

III-F. Méthodes de sauvegarde et de restitution de l'image en mémoire

Ces méthodes sont utiles pour éviter d'avoir à redessiner la totalité du planning, si on souhaite par exemple restituer l'image précédente.

III-F-1. KeepImage

Cette méthode sauvegarde en mémoire l'image du planning.

Elle doit être appelée après avoir dessiné le planning et avant d'exécuter ResetImage.

Exemple

Le code suivant copie en mémoire l'image du planning.

 
Sélectionnez
obPlanner.KeepImage

III-F-2. ResetImage

Cette méthode restitue l'image du planning sauvegardée en mémoire.

Elle permet de restituer l'image du planning juste avant de dessiner le contour du rectangle sélectionné.

Exemple

Le code suivant rétablit l'image du planning de la mémoire.

 
Sélectionnez
obPlanner.ResetImage

III-G. Comment ajouter une méthode à la classe

Pour ceux qui souhaitent enrichir la classe de nouvelles propriétés ou de nouvelles méthodes pour ajouter des fonctionnalités au planning, je vous propose un exemple simple : ajouter une méthode pour colorier une colonne du planning, afin de prendre en compte les jours fériés.

Pour ce faire, il nous faut appeler la méthode DrawRect pour redessiner les petits rectangles sur la colonne choisie, ligne par ligne, et avec la couleur désirée. Le code devrait donc ressembler à cela :

 
Sélectionnez
'----------------------------------------------------------------------------------------
' Méthode ajoutée :
' Colorie les colonnes de la date du jour passée en argument dans la couleur BackColor.
'----------------------------------------------------------------------------------------
Public Sub ColorDay(DayDate As Integer, BackColor As Long)
    Dim indRow As Integer ' Indice de ligne.
    Dim indCol As Integer
    Dim DayCols As Integer

    DayCols = (DayDate - StartDate) * (Cols \ Days) + 1
        
    For indCol = DayCols To (DayCols + (Cols \ Days) - 1)
        For indRow = 1 To Rows
            ' Dessine à l'intersection entre la ligne IndRow et la colonne IndCol un rectangle de couleur de fond BackColor.
            DrawRect indRow, indCol, indRow, indCol, BackColor, 8421504, 1
        Next indRow
    Next indCol
End Sub

Ajouter le code à la suite des propriétés et méthodes, dans le module de classe clPlanner.

Exemple d'utilisation

Le code suivant colorie la 16e colonne du planning en rouge.

 
Sélectionnez
obPlanner.ColorCol 16, vbRed

IV. Intégration du planning

Décrivons les objets principaux à ajouter à votre projet en plus des modules de classe.

IV-A. Table T_Parametres

Permet d'enregistrer les paramètres du planning. On présente ici quelques champs de la table.

Champ

Type

Description

PlannerType

Texte

Type de planning.

DataSource

Texte

Source de données du planning (table, requête).

PersonIdentDataField

Entier Long

Nom du champ permettant d'enregistrer l'identifiant du responsable.

StartDateDataField

Date/heure

Nom du champ pour enregistrer la date et l'heure de début de la tâche.

EndDateDataField

Date/heure

Nom du champ pour enregistrer la date et l'heure de fin de la tâche.

TextDataField

Texte

Nom du champ pour afficher le texte de la tâche sur le planning.

ColorDataField

Texte

Nom du champ pour colorier la tâche sur le planning.

Cette table sera liée à l'objet obPlanner à l'ouverture du formulaire de planning.

IV-B. Sous-formulaire SF_Planning

Ce sous-formulaire contient, dans l'en-tête du formulaire, le contrôle image imgHeader pour afficher les en-têtes de colonnes, et le contrôle image imgPlanning dans la section détail, pour afficher le planning et les en-têtes de lignes.

IV-B-1. Procédure évènementielle sur ouverture

Crée les instances de classes pour les en-têtes de colonnes (obPlannerHeader) et pour le planning (obPlanner), puis paramètre le planning et les en-têtes de colonnes avant de dessiner le planning sur les contrôles images du formulaire.

Procédure évèclaude Leloup2019-10-12T04:47:10.291000000Par souci de cohérence : la même graphie dans l'ensemble du texte.nementielle sur ouverture
Cacher/Afficher le codeSélectionnez

L'objet obPlanner est connecté à la table T_Parametres, et ses propriétés sont mises à jour avec les valeurs contenues dans la table.

IV-B-2. Procédure évènementielle sur fermeture

Sur fermeture du sous-formulaire, on libère les variables publiques obPlannerHeader et obPlanner.

 
Sélectionnez
Private Sub Form_Close()
    ' On libère les variables objet
    Set obPlannerHeader = Nothing
    Set obPlanner = Nothing
End Sub

IV-B-3. Contrôle image imgHeader

Contrôle sur lequel on va dessiner les en-têtes de colonnes.

IV-B-4. Contrôle image imgPlanning

Contrôle sur lequel on va dessiner le planning proprement dit.

IV-B-4-a. La procédure évènementielle sur souris appuyée

Identifie la ligne et la colonne correspondant à la région sélectionnée sur le planning et dessine un cadre autour de cette région. Dans le cas où il y a une tâche associée à cette région, on récupère son identifiant.

 
Sélectionnez
'----------------------------------------------------------------------------------------
' Identifie les coordonnées du rectangle pointé sur le Planning
' et dessine un cadre autour de ce rectangle.
'----------------------------------------------------------------------------------------
Private Sub ImgPlanning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error GoTo Err_ImgPlanning_MouseDown
    ' on sélectionne la région correspondant à la position cliquée de coordonnées X et Y
    obPlanner.SelectRect CLng(X), CLng(Y)
Exit_ImgPlanning_MouseDown:
    Exit Sub
Err_ImgPlanning_MouseDown:
    MsgBox Err.description
    Resume Exit_ImgPlanning_MouseDown
End Sub

IV-B-4-b. Procédure évènementielle sur double-clic

Permet d'ouvrir le formulaire de saisie en fonction de la zone sélectionnée.

 
Sélectionnez
Private Sub ImgPlanning_DblClick(Cancel As Integer)
    On Error GoTo Err_ImgPlanning_DblClick
    If (obPlanner.Row > 0) And (obPlanner.Col > 0) Then
        ' Si une zone est sélectionnée sur le Planning,
        ' alors on exécute la procédure d'ouverture du formulaire de saisie.
        OuvrirFormSaisieTache obPlanner.Row, obPlanner.Col
    End If
Exit_ImgPlanning_DblClick:
    Exit Sub
Err_ImgPlanning_DblClick:
    MsgBox Err.description
    Resume Exit_ImgPlanning_DblClick
End Sub

IV-B-5. Le nombre maximum de lignes du planning

Cette valeur est conditionnée par la hauteur maximum de l'image et donc du sous-formulaire SF_Planning, soit 22 inches ou 55,873 cm.

Comme les paramètres du planning sont donnés en pixels, nous allons donc utiliser cette mesure pour le calcul du nombre maximum de lignes.

Par exemple, pour un écran de 17 pouces (1280 × 1024) avec un DPI de 96, 1 inch = 96 pixels, et donc la hauteur maximum du sous-formulaire est de 22 inches = 22*96 pixels = 2112 pixels.

Par conséquent, pour une hauteur de ligne de 25 pixels, on pourra afficher au maximum 2112/25 = 84,48, soit 84 lignes pleines au maximum, et avec une hauteur de ligne de 20 pixels, on pourra afficher sur le planning 2112/20 = 105,6, soit 105 lignes au maximum.

En conclusion, on dispose d'une centaine de lignes au plus pour notre planning, cela nous laisse donc de la marge.

IV-C. Formulaire F_Planning

Il permet d'afficher le planning dans le sens horizontal ou vertical.

Il comporte pour résumer :

  • un sous-formulaire SF_Planning ;
  • une zone de texte pour afficher la date du 1er jour ;
  • une étiquette pour afficher le titre du planning ;
  • des boutons de commande pour se déplacer dans le temps.
Image non disponible
Formulaire F_Planning

IV-C-1. Bouton de commande cmdJourSuivant

Ce bouton permet de passer au jour suivant et de mettre à jour le planning.

IV-C-1-a. La procédure évènementielle sur clic

Elle permet de passer au jour suivant et de rafraîchir les en-têtes de colonnes et le planning :

 
Sélectionnez
Private Sub CmdJourSuivant_Click()
' Avance d'un jour sur le Planning.

On Error GoTo Err_CmdJourSuivant_Click
    obPlanner.NextDay ' exécute la méthode de passage au jour suivant
Exit_CmdJourSuivant_Click:
    Exit Sub
Err_CmdJourSuivant_Click:
    MsgBox Err.description
    Resume Exit_CmdJourSuivant_Click
End Sub

IV-C-2. Bouton de commande cmdJourPrecedent

Ce bouton permet de passer au jour précédent et de mettre à jour le planning.

IV-C-2-a. La procédure évènementielle sur clic

Elle permet de passer au jour précédent et de rafraîchir les en-têtes de colonnes et le planning :

 
Sélectionnez
Private Sub CmdJourPrecedent_Click()
' Recule d'un jour sur le Planning.

On Error GoTo Err_CmdJourPrecedent_Click

    obPlanner.PreviousDay ' exécute la méthode de passage au jour précédent
Exit_CmdJourPrecedent_Click:
    Exit Sub
Err_CmdJourPrecedent_Click:
    MsgBox Err.description
    Resume Exit_CmdJourPrecedent_Click
End Sub

IV-C-3. Contrôle sous-formulaire SF_Planning

Ce contrôle sous-formulaire a pour objet source le formulaire SF_Planning, qui contient le contrôle image imgHeader, pour afficher les en-têtes de colonnes, et le contrôle image imgPlanning, pour afficher le planning et les en-têtes de lignes.

IV-D. Module M_Planning

Contient les déclarations publiques des variables obHeaderPlanner, obPlanner de type clPlanner accessibles dans tout le projet.

Extrait du module :

 
Sélectionnez
Option Compare Database
Option Explicit
Public obPlannerHeader As clPlanner
Public obPlanner As clPlanner
...

Si l'objet planning n'est relié à aucune source de données, sa propriété DataSource contenant une chaîne vide, vous pouvez alors mettre à jour le planning avec votre propre code :

 
Sélectionnez
Public Sub MajPlanning()
    ' Exemple de code personnalisé pour mettre à jour le planning s'il n'est relié à aucune source de donnée (DataSource="")
    
    obPlannerHeader.Clear ' initialise l'en-tête du planning
    obPlanner.Clear ' initialise le planning
    
    '...
    
    ' dessine un rectangle bleu délimité par les coordonnées (2,2) son carré supérieur gauche et (2,4) pour son carré inférieur droit
    obPlanner.DrawRect 2, 2, 2, 4, vbBlue
    
    '...
    
    obPlannerHeader.Refresh ' Actualise l'en-tête du planning
    obPlanner.Refresh ' Actualise le planning

End Sub

V. Résultat de l'intégration

Le paramétrage du planning s'effectue en ouvrant le formulaire F_Parametres, les paramètres étant enregistrés dans la table T_Parametres.

Image non disponible
Formulaire F_Parametres

Le planning dit horizontal affiche donc les tâches suivant une orientation horizontale :

Image non disponible
Rendu du planning horizontal

Le planning dit vertical affiche les tâches suivant une orientation verticale :

Image non disponible
Rendu du planning vertical

La grande partie de la procédure de paramétrage du planning se fait donc manuellement via le formulaire F_Parametres.

Le formulaire et la table contenant les paramètres doivent être ajoutés à votre projet.

VI. Base de données à télécharger

Le Fichiergestion-planning.zip utilise le module de classe GdiPlus et est au format accdb.

VII. Remerciements

Je tiens à remercier Arkham46 et toute l'équipe Office de m'avoir guidé dans la réalisation de cet article, ainsi que jacques_jean pour sa relecture.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2009 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.