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
=
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.
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.
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.
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. Réel simple en lecture/écriture.
Exemple
Le code suivant ajuste la hauteur des lignes du planning à 25 pixels.
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. Réel simple en lecture/écriture.
Exemple
Le code suivant ajuste la largeur des colonnes du planning à 125 pixels.
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.
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.
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.
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. 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
=
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.
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.
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
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.
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.
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).
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).
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).
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.
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.
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 :
'----------------------------------------------------------------------------------------
' 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.
obPlanner.ColorCol
16
, vbRed
IV. 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
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.
'----------------------------------------------------------------------------------------
' 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.
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 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
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 :
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 :
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
Sub
V. 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.