I. Introduction▲
On souhaite intégrer et paramétrer un planning généré à l'aide du module de classe clPlanner.
Ce type de planning peut s'afficher sur une semaine, quinze jours, un mois, etc.
Il pourra servir d'agenda ou de planning selon les besoins et être facilement intégré dans votre application Access.
Pour cela, on décrit dans cet article les modules de classe et les objets principaux à ajouter à votre application, avant d'expliquer comment paramétrer le planning.
L'article comportera donc quatre parties principales :
- module de gestion des images clGdiPlus;
- module de classe clPlanner;
- objets principaux ;
- paramétrage du planning.
II. Module de gestion des 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 application.
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 cette classe.
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.
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.
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.
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.
obPlanner.Row=3III-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.
obPlanner.Col=3III-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.
obPlanner.Rows=30III-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.
obPlanner.Cols=7III-A-8. RowsHeight▲
Vous pouvez utiliser la propriété RowsHeight pour ajuster la hauteur des lignes du planning à des dimensions spécifiques. Réel simple en lecture/écriture.
Exemple
Le code suivant ajuste la hauteur des lignes du planning à 25 pixels.
obPlanner.RowsHeight=25III-A-9. ColsWidth▲
Vous pouvez utiliser la propriété ColsWidth pour ajuster la largeur des colonnes du planning à des dimensions spécifiques. Réel simple en lecture/écriture.
Exemple
Le code suivant ajuste la largeur des colonnes du planning à 125 pixels.
obPlanner.ColsWidth=125III-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.
obPlanner.BackColor=vbWhiteIII-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.
obPlanner.GridColor=vbBlackIII-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.
obPlanner.FieldsCols=2III-A-13. FieldsColsWidth▲
Utiliser la propriété FieldsColsWidth pour ajuster la largeur des colonnes pour les en-têtes de lignes. Réel simple en lecture/écriture.
Exemple
Le code suivant ajuste la largeur des colonnes de gauche du planning (en-têtes de lignes) à 100 pixels.
obPlanner.FieldsColsWidth=100III-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.
obPlanner.FieldsBackColor=vbGreyIII-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.
obPlanner.InitImageIII-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
obPlanner.ClearIII-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.
obPlanner.refreshIII-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.
obPlanner.DrawRect 1, 1, 1, 3, vbBlue, vbBlack, 1III-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).
obPlanner.DrawText 1, 1, 1, 3, "DUPONT", 12, 0,0 vbBlueIII-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).
obPlanner.DrawFieldText 1, 2, "DWC", 12, 0, 0, vbBlueIII-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).
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 SubIII-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.
obPlanner.KeepImageIII-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.
obPlanner.ResetImageIII-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 :
'----------------------------------------------------------------------------------------
' 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 SubAjouter 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.
obPlanner.ColorCol 16, vbRedIV. Objets principaux▲
Décrivons les objets à ajouter à votre application 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.
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.
Private Sub Form_Close()
' On libère les variables objet
Set obPlannerHeader = Nothing
Set obPlanner = Nothing
End SubIV-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.
'----------------------------------------------------------------------------------------
' 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 SubIV-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.
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 SubIV-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 sur une semaine, un mois, etc.
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.
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 :
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 SubIV-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 :
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 SubIV-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 :
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 :
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 SubV. Paramétrage du planning▲
Le paramétrage du planning s'effectue en ouvrant le formulaire F_Parametres, les paramètres choisis étant directement enregistrés dans la table T_Parametres.
Le planning dit horizontal affiche donc les tâches suivant une orientation horizontale :
Le planning dit vertical affiche les tâches suivant une orientation verticale :
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 application.
VI. Base de données à télécharger▲
Le Fichiergestion-planning.zip utilise le module de classe GdiPlus et est au format accdb.
Tous les objets décrits dans l'article sont présents dans l'application exemple, et doivent être ajoutés dans votre base Access.
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.








