Intégrer un planning basé sur la classe de gestion d'images clGdiPlus
Date de publication : 01 août 2009
Par
Denis Hulo
Intégrer dans votre projet Access un planning basé sur la classe de gestion d'images clGdiPlus.
Niveau requis : avancé.
I. Introduction
II. La classe de gestion d'images clGdiPlus
III. La classe clPlanning
III-A. Les propriétés de paramétrage du planning
III-A-1. Row
III-A-2. Col
III-A-3. Rows
III-A-4. Cols
III-A-5. RowsHeight
III-A-6. ColsWidth
III-A-7. BackColor
III-A-8. GridColor
III-A-9. FieldsCols
III-A-10. FieldsColsWidth
III-A-11. FieldsColor
III-B. Les méthodes et propriétés d'initialisation de l'image
III-B-1. RefControleImage
III-B-2. InitImage
III-C. Les méthodes d'initialisation et d'actualisation du planning
III-C-1. Clear
III-C-2. Refresh
III-D. Les méthodes de dessin sur le planning
III-D-1. DrawRect
III-D-2. DrawText
III-D-3. DrawFieldText
III-E. La méthode pour identifier le rectangle à partir des coordonnées (X,Y)
III-E-1. GetRectXY
III-F. Les méthodes de sauvegarde et de restitution de l'image en mémoire
III-F-1. KeepImage
III-F-2. ResetImage
III-G. Comment ajouter une méthode à la classe
IV. Le module moPlanning
V. Le sous-formulaire sfPlanning
V-A. La procédure évènementielle sur chargement.
V-B. La procédure évènementielle sur fermeture
V-C. Le contrôle image imHeader
V-D. Le contrôle image imPlanning
V-D-1. La procédure évènementielle sur souris appuyée
V-D-2. La procédure évènementielle sur double-clic
V-E. Le nombre maximum de lignes du planning
VI. Le formulaire fPlanning
VI-A. Le bouton de commande cmTester
VI-A-1. La procédure évènementielle sur clic
VI-B. Le bouton de commande cmEffacer
VI-B-1. La procédure évènementielle sur clic
VI-C. Le contrôle sous-formulaire sfPlanning
VII. Exemple d'intégration du planning
VIII. Même procédé d'intégration d'un planning basé sur la classe clGdi32
IX. Les bases de données à télécharger
X. Remerciements
I. Introduction
L'objectif de cet article est de décrire la mise en place d'un planning basé sur la classe de gestion d'images
clGdiPlus, dans un formulaire Access.
Ce type de planning a l'avantage d'être très souple et peut être paramétré en VBA sur 1 semaine, quinze jours, 1 mois etc...,
et peut comporter jusqu'à environ 100 lignes.
Il pourra servir d'agenda ou de planning selon les besoins et être facilement intégré dans votre projet Access.
Pour ce faire, nous allons présenter par la suite les objets qui devront être ajoutés à votre projet Access.
Enfin, pour illustrer cette technique, nous proposerons à la fin de l'article un exemple d'intégration du planning.
II. La classe de gestion d'images clGdiPlus
clGdiPlus est un module de classe VBA pour faciliter l'utilisation de la librairie graphique gdiplus.dll (Celle-ci n'est livrée qu'avec Windows XP, pour les autres versions de Windows vous pouvez la télécharger
ici).
clGdiPlus permet de gérer des images et de dessiner dans un contrôle image.
Ensuite insérer, pour votre projet, le contenu du fichier dans un module de classe nommé clGdiPlus.
III. La classe clPlanning
La classe
clPlanning est basée sur la classe de gestion des images
clGdiPlus.
Elle 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 définissant les périodes sur le planning.
Intégrer alors le module de classe
clPlanning de
la base jointe à votre projet.
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. Les 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. 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.
III-A-2. 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.
III-A-3. 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.
III-A-4. 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.
III-A-5. 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 twips.
III-A-6. 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 twips.
III-A-7. 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.
obPlanning.BackColor=vbWhite
|
III-A-8. 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.
obPlanning.GridColor=vbBlack
|
III-A-9. 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 2 colonnes à gauche du planning pour les en-têtes de lignes.
III-A-10. FieldsColsWidth
Utiliser la propriété FieldsColsWidth pour ajuster la largeur des colonnes pour les en-têtes de lignes à des dimensions spécifiques.
Entier en lecture/écriture.
Exemple :
Le code suivant ajuste la largeur des colonnes de gauche du planning (en-têtes de lignes) à 100 twips.
obPlanning.FieldsColsWidth=100
|
III-A-11. FieldsColor
Vous pouvez utiliser la propriété FieldsColor 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.
obPlanning.FieldsColor=vbGrey
|
III-B. Les méthodes et propriétés d'initialisation de l'image
Elles permettent de définir le contrôle sur lequel on va dessiner le planning et de préparer l'image pour qu'elle soit conforme aux dimensions du contrôle.
III-B-1. RefControleImage
Utiliser la propriété RefControleImage pour spécifier le contrôle image sur lequel on va dessiner le planning.
Exemple :
Le code suivant spécifie le contrôle image imPlanning du formulaire courant sur lequel on va dessiner le planning.
obPlanning.RefControleImage = Me.imPlanning
|
III-B-2. 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 imPlanning.
III-C. Les 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 :
Public Sub Clear()
Dim i As Integer, j As Integer
Dim l As Integer, w As Integer, h As Integer
Dim lReturn As Boolean
l = vFieldsCols * vFieldsColsWidth
w = vCols * vColsWidth
h = vRows * vRowsHeight
lReturn = obGdiP.DeleteAllRegions
lReturn = obGdiP.DrawRectangle(0, 0, l, h, vFieldsColor, vGridColor, 1)
lReturn = obGdiP.DrawRectangle(l, 0, l + w, h, vBackColor, vGridColor, 1)
For i = 1 To vRows
lReturn = obGdiP.DrawLine(0, i * vRowsHeight, _
l + w, i * vRowsHeight, vGridColor, 1, False)
Next i
For i = 1 To vFieldsCols
lReturn = obGdiP.DrawLine(i * vFieldsColsWidth, 0, _
i * vFieldsColsWidth, h, vGridColor, 1, False)
Next i
For i = 1 To vCols
lReturn = obGdiP.DrawLine(l + i * vColsWidth, _
0, l + i * vColsWidth, h, vGridColor, 1, False)
Next i
For i = 1 To vRows
For j = 1 To vCols
lReturn = obGdiP.CreateRegionRect(i & "_" & j, l + (j - 1) * vColsWidth, _
(i - 1) * vRowsHeight, l + j * vColsWidth - 1, i * vRowsHeight - 1)
Next j
Next i
End Sub
|
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é obHeader ou obPlanning.
Cette procédure doit être appelée après chaque modification de l'objet obPlanning, instance de la classe clPlanning, afin d'actualiser le contrôle associé.
Exemple :
Le code suivant actualise le contrôle image imPlanning du sous-formulaire sfPlanning et redessine donc le planning sur ce contrôle.
III-D. Les 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 |
Epaisseur de la ligne. |
Exemple :
Le code suivant dessine un rectangle avec un fond bleu et une bordure noire sur la 1ère ligne, de la 1ère colonne à la 3ème colonne du planning.
obPlanning.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).
obPlanning.DrawText 1, 1, 1, 3, "DUPONT", 12, 0,0 vbBlue
|
III-D-3. DrawFieldText
Cette méthode permet d'écrire du texte dans le 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é à 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: 1ère ligne, 2: 2ème colonne).
obPlanning.DrawFieldText 1, 2, "DWC", 12, 0, 0, vbBlue
|
III-E. La méthode pour identifier le rectangle à partir des coordonnées (X,Y)
III-E-1. GetRectXY
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. |
| Row1,Col1,Row2,Col2 |
Entier |
Coordonnées du rectangle. |
Exemple :
Le code suivant renvoie en paramètres les coordonnées du rectangle situé sur le point de coordonnées (X,Y).
obPlanning.GetRectXY(CLng(X), CLng(Y), Row1, Col1, Row2, Col2)
|
III-F. Les 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, juste avant de tracer le contour du rectangle sélectionné sur souris appuyée.
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.
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.
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 à celà :
Public Sub ColorCol(IndCol As Integer, BackColor As Long)
Dim IndRow As Integer
For IndRow = 1 To Rows
DrawRect IndRow, IndCol, IndRow, IndCol, BackColor, vbBlack, 1
Next IndRow
End Sub
|
Ajouter le code à la suite des propriétés et méthodes, dans le module de classe clPlanning.
Exemple d'utilisation :
Le code suivant colorie la 16ème colonne du planning en rouge.
obPlanning.ColorCol 16, vbRed
|
IV. Le module moPlanning
Contient les variables publiques obHeader, obPlanning et dateDebut, ainsi que les procédures et fonctions pour manipuler le planning.
Intégrer ce module de
la base jointe à votre projet et y ajouter vos propres procédures et fonctions de gestion du planning.
Extrait du module :
Option Compare Database
Public obHeader As clPlanning
Public obPlanning As clPlanning
Public DateDebut As Date
Public Function ConversionColonneVersJour(ByVal Colonne As Integer) As Date
ConversionColonneVersJour = (DateDebut + Colonne - 1)
End Function
Public Function ConversionJourVersColonne(ByVal Jour As Date) As Integer
ConversionJourVersColonne = (Jour - DateDebut + 1)
End Function
|
V. Le sous-formulaire sfPlanning
Ce sous-formulaire contient, dans l'en-tête du formulaire, le contrôle image imHeader pour afficher les en-têtes de colonnes, et le contrôle image imPlanning dans la section détail, pour afficher le planning et les en-têtes de lignes.
Ajouter ce sous-formulaire présent dans
la base jointe à votre projet et paramétrer le planning avec vos propres valeurs.
V-A. La procédure évènementielle sur chargement.
Crée les instances de classes pour les en-têtes de colonnes (obHeader) et pour le planning (obPlanning), puis paramètre le planning et les en-têtes de colonnes avant de dessiner le planning sur les contrôles images du formulaire.
Définissez vous-même les paramètres de votre planning.
Private Sub Form_Load()
Set obHeader = New clPlanning
Set obPlanning = New clPlanning
With obHeader
.RefControleImage = Me.imHeader
.InitImage
.FieldsCols = 2
.FieldsColsWidth = 70
.FieldsColor = -2147483633
.Rows = 1
.RowsHeight = 25
.Cols = 31
.ColsWidth = 27
.BackColor = -2147483633
End With
With obPlanning
.RefControleImage = Me.imPlanning
.InitImage
.FieldsCols = 2
.FieldsColsWidth = 70
.Rows = 40
.Cols = 31
.ColsWidth = 27
End With
obHeader.Clear
obHeader.Refresh
obPlanning.Clear
obPlanning.Refresh
End Sub
|
V-B. La procédure évènementielle sur fermeture
Sur fermeture du sous-formulaire on libère les variables publiques obHeader et obPlanning.
Private Sub Form_Close()
Set obHeader = Nothing
Set obPlanning = Nothing
End Sub
|
V-C. Le contrôle image imHeader
Contrôle sur lequel on va dessiner les en-têtes de colonnes.
V-D. Le contrôle image imPlanning
Contrôle sur lequel on va dessiner le planning proprement dit.
V-D-1. 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.
Private Sub imPlanning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Row1 As Integer, Col1 As Integer, Row2 As Integer, Col2 As Integer
obPlanning.GetRectXY CLng(X), CLng(Y), Row1, Col1, Row2, Col2
If (Row1 > 0) Then
obPlanning.ResetImage
obPlanning.DrawRect Row1, Col1, Row2, Col2, -1, vbBlack, 2
obPlanning.Refresh
End If
End Sub
|
V-D-2. La procédure évènementielle sur double-clic
On récupère ici les indices de ligne et de colonne sélectionnées sur souris appuyée.
L'indice de colonne va nous permettre de connaître, grâce à une fonction de conversion,
le jour correspondant sur le planning.
Placer ici le code pour ouvrir un formulaire de saisie en fonction de la zone sélectionnée.
Private Sub imPlanning_DblClick(Cancel As Integer)
If (obPlanning.Row > 0) And (obPlanning.Col > 0) Then
End If
End Sub
|
V-E. Le nombre maximum de lignes du planning
Cette valeur est conditionnée par la hauteur maximum de l'image et donc du sous-formulaire sfplanning, soit 22 inches ou 55.873cm.
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 définition 1 inch = 96 pixels 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.
VI. Le formulaire fPlanning
Ce formulaire va servir de test pour dessiner des rectangles horizontaux sur le planning. Il intègre le sous-formulaire sfPlanning, un bouton de commande cmTester pour tester le planning, et un autre cmEffacer pour vider le planning.

Aperçu du formulaire fPlanning.
VI-A. Le bouton de commande cmTester
Ce bouton permet de tester le planning.
VI-A-1. La procédure évènementielle sur clic
Elle met à jour les en-têtes de colonnes et le planning avec quelques données exemples :
Private Sub cmTester_Click()
Dim i As Integer
Dim DateJ As Date
Dim Col1 As Integer, Col2 As Integer
obHeader.DrawFieldText 1, 1, "NCh.", 12, 0, 1
obHeader.DrawFieldText 1, 2, "TCh.", 12, 0, 1
DateDebut = CDate("01/01/2009")
DateJ = DateDebut
For i = 1 To 31
obHeader.DrawText 1, i, 1, i, Day(DateJ), 12, 1, 1, vbBlack, False
DateJ = DateJ + 1
Next i
obPlanning.DrawFieldText 1, 1, "001", 12, 0, 1
obPlanning.DrawFieldText 1, 2, "DWC", 12, 0, 1
Col1 = ConversionJourVersColonne(CDate("01/01/2009"))
Col2 = ConversionJourVersColonne(CDate("03/01/2009"))
obPlanning.DrawRect 1, Col1, 1, Col2, vbMagenta, obPlanning.GridColor, 1
obPlanning.DrawText 1, Col1, 1, Col2, "DUPONT", 12, 1, 1, vbBlack, False
obPlanning.DrawFieldText 2, 1, "002", 12, 0, 1
obPlanning.DrawFieldText 2, 2, "BWC", 12, 0, 1
Col1 = ConversionJourVersColonne(CDate("03/01/2009"))
Col2 = ConversionJourVersColonne(CDate("06/01/2009"))
obPlanning.DrawRect 2, Col1, 2, Col2, vbGreen, obPlanning.GridColor, 1
obPlanning.DrawText 2, Col1, 2, Col2, "DURAND", 12, 1, 1, vbBlack, False
obPlanning.KeepImage
obHeader.Refresh
obPlanning.Refresh
End Sub
|
VI-B. Le bouton de commande cmEffacer
Ce bouton permet d'effacer le contenu du planning.
VI-B-1. La procédure évènementielle sur clic
Elle efface le contenu des contrôles images et redessine le planning sur ces contrôles :
Private Sub cmEffacer_Click()
obHeader.Clear
obHeader.Refresh
obPlanning.Clear
obPlanning.Refresh
End Sub
|
VI-C. Le contrôle sous-formulaire sfPlanning
Ce contrôle sous-formulaire a pour objet source le formulaire sfPlanning, qui contient le contrôle image imHeader, pour afficher les en-têtes de colonnes,
et le contrôle image imPlanning, pour afficher le planning et les en-têtes de lignes.
VII. Exemple d'intégration du planning
Intégration d'un planning mensuel dans une application pour la gestion des réservations dans un hôtel :

Aperçu du planning mensuel.
VIII. Même procédé d'intégration d'un planning basé sur la classe clGdi32
L'objectif de cette section est de décrire brièvement la mise en place d'un planning basé sur la classe de gestion d'images
clGdi32, dans un formulaire Access.
Cette classe facilite l'utilisation de la librairie graphique
gdi32.dll (Celle-ci a l'avantage d'être disponible sur tous les systèmes Windows. Si malgré tout elle n'est pas présente sur votre ordinateur ou endommagée, vous pouvez la télécharger
ici).
Il vous faut alors ajouter à votre projet, comme pour la méthode précédente, les classes
clGdi32 et
clPlanning32, le module
moPlanning, le sous-formulaire
sfPlanning et enfin le formulaire
fPlanning, tous présents dans
la base jointe.
IX. Les bases de données à télécharger
X. Remerciements


Copyright © 2009 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.